More correct startup and shutdown procedures.
During IpManager startup, anything sending messages to the state machine must not begin doing so until after the state machine has been started. Reorder the constructor accordingly. During shutdown, AvoidBadWifiTracker needs to unregister the registered BroadcastReceiver and might as well also unregister the ContentObserver. Bug: 33388922 Change-Id: I58e07f7ccddaab160c153bcfb69fd45f50bb8710
This commit is contained in:
@@ -864,6 +864,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
|
|
||||||
mAvoidBadWifiTracker = createAvoidBadWifiTracker(
|
mAvoidBadWifiTracker = createAvoidBadWifiTracker(
|
||||||
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
|
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
|
||||||
|
mAvoidBadWifiTracker.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkRequest createInternetRequestForTransport(
|
private NetworkRequest createInternetRequestForTransport(
|
||||||
|
|||||||
@@ -57,7 +57,11 @@ public class AvoidBadWifiTracker {
|
|||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
private final Runnable mReevaluateRunnable;
|
private final Runnable mReevaluateRunnable;
|
||||||
|
private final Uri mUri;
|
||||||
|
private final ContentResolver mResolver;
|
||||||
private final SettingObserver mSettingObserver;
|
private final SettingObserver mSettingObserver;
|
||||||
|
private final BroadcastReceiver mBroadcastReceiver;
|
||||||
|
|
||||||
private volatile boolean mAvoidBadWifi = true;
|
private volatile boolean mAvoidBadWifi = true;
|
||||||
|
|
||||||
public AvoidBadWifiTracker(Context ctx, Handler handler) {
|
public AvoidBadWifiTracker(Context ctx, Handler handler) {
|
||||||
@@ -68,19 +72,36 @@ public class AvoidBadWifiTracker {
|
|||||||
mContext = ctx;
|
mContext = ctx;
|
||||||
mHandler = handler;
|
mHandler = handler;
|
||||||
mReevaluateRunnable = () -> { if (update() && cb != null) cb.run(); };
|
mReevaluateRunnable = () -> { if (update() && cb != null) cb.run(); };
|
||||||
|
mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI);
|
||||||
|
mResolver = mContext.getContentResolver();
|
||||||
mSettingObserver = new SettingObserver();
|
mSettingObserver = new SettingObserver();
|
||||||
|
mBroadcastReceiver = new BroadcastReceiver() {
|
||||||
final IntentFilter intentFilter = new IntentFilter();
|
@Override
|
||||||
intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
|
||||||
mContext.registerReceiverAsUser(new BroadcastReceiver() {
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
reevaluate();
|
reevaluate();
|
||||||
}
|
}
|
||||||
}, UserHandle.ALL, intentFilter, null, null);
|
};
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
mResolver.registerContentObserver(mUri, false, mSettingObserver);
|
||||||
|
|
||||||
|
final IntentFilter intentFilter = new IntentFilter();
|
||||||
|
intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
||||||
|
mContext.registerReceiverAsUser(
|
||||||
|
mBroadcastReceiver, UserHandle.ALL, intentFilter, null, null);
|
||||||
|
|
||||||
|
reevaluate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void shutdown() {
|
||||||
|
mResolver.unregisterContentObserver(mSettingObserver);
|
||||||
|
|
||||||
|
mContext.unregisterReceiver(mBroadcastReceiver);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean currentValue() {
|
public boolean currentValue() {
|
||||||
return mAvoidBadWifi;
|
return mAvoidBadWifi;
|
||||||
}
|
}
|
||||||
@@ -100,8 +121,7 @@ public class AvoidBadWifiTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getSettingsValue() {
|
public String getSettingsValue() {
|
||||||
final ContentResolver resolver = mContext.getContentResolver();
|
return Settings.Global.getString(mResolver, NETWORK_AVOID_BAD_WIFI);
|
||||||
return Settings.Global.getString(resolver, NETWORK_AVOID_BAD_WIFI);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -117,12 +137,8 @@ public class AvoidBadWifiTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class SettingObserver extends ContentObserver {
|
private class SettingObserver extends ContentObserver {
|
||||||
private final Uri mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI);
|
|
||||||
|
|
||||||
public SettingObserver() {
|
public SettingObserver() {
|
||||||
super(null);
|
super(null);
|
||||||
final ContentResolver resolver = mContext.getContentResolver();
|
|
||||||
resolver.registerContentObserver(mUri, false, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user