Fix ANR in SliceRelayReceiver

The same broadcast are handled in SliceRelayReceiver and WifiScanWorker.
We will only use WifiScanWorker to handle wifi broadcast.

Change-Id: I32c2fcc699ae240f12bd1049ba33e1792ae123b0
Fixes: 120284615
Test: manual
This commit is contained in:
Raff Tsai
2018-12-11 17:51:41 +08:00
parent 2602e42b65
commit 86a2afe798
3 changed files with 27 additions and 12 deletions

View File

@@ -58,6 +58,10 @@ public abstract class SliceBackgroundWorker<E> implements Closeable {
mUri = uri; mUri = uri;
} }
public Uri getUri() {
return mUri;
}
/** /**
* Returns the singleton instance of the {@link SliceBackgroundWorker} for specified {@link * Returns the singleton instance of the {@link SliceBackgroundWorker} for specified {@link
* CustomSliceable} * CustomSliceable}

View File

@@ -25,7 +25,6 @@ import android.annotation.ColorInt;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
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;
@@ -75,14 +74,6 @@ public class WifiSlice implements CustomSliceable {
return WIFI_SLICE_URI; return WIFI_SLICE_URI;
} }
@Override
public IntentFilter getIntentFilter() {
final IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
return filter;
}
@Override @Override
public Slice getSlice() { public Slice getSlice() {
final boolean isWifiEnabled = isWifiEnabled(); final boolean isWifiEnabled = isWifiEnabled();
@@ -200,7 +191,7 @@ public class WifiSlice implements CustomSliceable {
mWifiManager.isWifiEnabled()); mWifiManager.isWifiEnabled());
mWifiManager.setWifiEnabled(newState); mWifiManager.setWifiEnabled(newState);
// Do not notifyChange on Uri. The service takes longer to update the current value than it // Do not notifyChange on Uri. The service takes longer to update the current value than it
// does for the Slice to check the current value again. Let {@link SliceBroadcastRelay} // does for the Slice to check the current value again. Let {@link WifiScanWorker}
// handle it. // handle it.
} }
@@ -292,6 +283,7 @@ public class WifiSlice implements CustomSliceable {
@Override @Override
public void onWifiStateChanged(int state) { public void onWifiStateChanged(int state) {
mContext.getContentResolver().notifyChange(getUri(), null);
} }
@Override @Override

View File

@@ -20,10 +20,18 @@ package com.android.settings.wifi;
import static android.app.slice.Slice.HINT_LIST_ITEM; import static android.app.slice.Slice.HINT_LIST_ITEM;
import static android.app.slice.SliceItem.FORMAT_SLICE; import static android.app.slice.SliceItem.FORMAT_SLICE;
import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
import static com.android.settings.wifi.WifiSlice.DEFAULT_EXPANDED_ROW_COUNT; import static com.android.settings.wifi.WifiSlice.DEFAULT_EXPANDED_ROW_COUNT;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@@ -52,13 +60,16 @@ import java.util.List;
public class WifiSliceTest { public class WifiSliceTest {
private Context mContext; private Context mContext;
private ContentResolver mResolver;
private WifiManager mWifiManager; private WifiManager mWifiManager;
private WifiSlice mWifiSlice; private WifiSlice mWifiSlice;
private WifiSlice.WifiScanWorker mWifiScanWorker;
@Before @Before
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = spy(RuntimeEnvironment.application);
mResolver = mock(ContentResolver.class);
doReturn(mResolver).when(mContext).getContentResolver();
mWifiManager = mContext.getSystemService(WifiManager.class); mWifiManager = mContext.getSystemService(WifiManager.class);
// Set-up specs for SliceMetadata. // Set-up specs for SliceMetadata.
@@ -66,6 +77,7 @@ public class WifiSliceTest {
mWifiManager.setWifiEnabled(true); mWifiManager.setWifiEnabled(true);
mWifiSlice = new WifiSlice(mContext); mWifiSlice = new WifiSlice(mContext);
mWifiScanWorker = new WifiSlice.WifiScanWorker(mContext, WIFI_SLICE_URI);
} }
@Test @Test
@@ -122,4 +134,11 @@ public class WifiSliceTest {
assertThat(wifiManager.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED); assertThat(wifiManager.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED);
} }
@Test
public void onWifiStateChanged_shouldNotifyChange() {
mWifiScanWorker.onWifiStateChanged(WifiManager.WIFI_STATE_DISABLED);
verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
}
} }