Merge changes I0a75c440,Ief9e8925,Ie03e8276,If0ac9a64,I716bd771 am: 2f435607da

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1573943

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I20a0f2d4a59222083d1c17a7732b7fe0b8461502
This commit is contained in:
Chiachang Wang
2021-02-20 03:41:04 +00:00
committed by Automerger Merge Worker
5 changed files with 212 additions and 51 deletions

View File

@@ -49,8 +49,6 @@ import android.os.Build.VERSION_CODES;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
@@ -835,7 +833,6 @@ public class ConnectivityManager {
private final Context mContext; private final Context mContext;
private INetworkManagementService mNMService;
private INetworkPolicyManager mNPManager; private INetworkPolicyManager mNPManager;
private final TetheringManager mTetheringManager; private final TetheringManager mTetheringManager;
@@ -2211,17 +2208,6 @@ public class ConnectivityManager {
void onNetworkActive(); void onNetworkActive();
} }
private INetworkManagementService getNetworkManagementService() {
synchronized (this) {
if (mNMService != null) {
return mNMService;
}
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
mNMService = INetworkManagementService.Stub.asInterface(b);
return mNMService;
}
}
private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener> private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener>
mNetworkActivityListeners = new ArrayMap<>(); mNetworkActivityListeners = new ArrayMap<>();
@@ -2246,7 +2232,7 @@ public class ConnectivityManager {
}; };
try { try {
getNetworkManagementService().registerNetworkActivityListener(rl); mService.registerNetworkActivityListener(rl);
mNetworkActivityListeners.put(l, rl); mNetworkActivityListeners.put(l, rl);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
@@ -2263,7 +2249,7 @@ public class ConnectivityManager {
INetworkActivityListener rl = mNetworkActivityListeners.get(l); INetworkActivityListener rl = mNetworkActivityListeners.get(l);
Preconditions.checkArgument(rl != null, "Listener was not registered."); Preconditions.checkArgument(rl != null, "Listener was not registered.");
try { try {
getNetworkManagementService().unregisterNetworkActivityListener(rl); mService.registerNetworkActivityListener(rl);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
@@ -2279,7 +2265,7 @@ public class ConnectivityManager {
*/ */
public boolean isDefaultNetworkActive() { public boolean isDefaultNetworkActive() {
try { try {
return getNetworkManagementService().isNetworkActive(); return mService.isDefaultNetworkActive();
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }

View File

@@ -21,6 +21,7 @@ import android.net.ConnectionInfo;
import android.net.ConnectivityDiagnosticsManager; import android.net.ConnectivityDiagnosticsManager;
import android.net.IConnectivityDiagnosticsCallback; import android.net.IConnectivityDiagnosticsCallback;
import android.net.IOnSetOemNetworkPreferenceListener; import android.net.IOnSetOemNetworkPreferenceListener;
import android.net.INetworkActivityListener;
import android.net.IQosCallback; import android.net.IQosCallback;
import android.net.ISocketKeepaliveCallback; import android.net.ISocketKeepaliveCallback;
import android.net.LinkProperties; import android.net.LinkProperties;
@@ -36,7 +37,6 @@ import android.net.UidRange;
import android.net.QosSocketInfo; import android.net.QosSocketInfo;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.Messenger; import android.os.Messenger;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle; import android.os.PersistableBundle;

View File

@@ -0,0 +1,24 @@
/* Copyright 2013, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
package android.net;
/**
* @hide
*/
oneway interface INetworkActivityListener
{
void onNetworkActive();
}

View File

@@ -90,6 +90,7 @@ import android.net.IConnectivityDiagnosticsCallback;
import android.net.IConnectivityManager; import android.net.IConnectivityManager;
import android.net.IDnsResolver; import android.net.IDnsResolver;
import android.net.INetd; import android.net.INetd;
import android.net.INetworkActivityListener;
import android.net.INetworkManagementEventObserver; import android.net.INetworkManagementEventObserver;
import android.net.INetworkMonitor; import android.net.INetworkMonitor;
import android.net.INetworkMonitorCallbacks; import android.net.INetworkMonitorCallbacks;
@@ -147,13 +148,13 @@ import android.net.netlink.InetDiagMessage;
import android.net.shared.PrivateDnsConfig; import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker; import android.net.util.MultinetworkPolicyTracker;
import android.net.util.NetdService; import android.net.util.NetdService;
import android.os.BatteryStatsManager;
import android.os.Binder; import android.os.Binder;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.IBinder; import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService; import android.os.INetworkManagementService;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
@@ -163,6 +164,7 @@ import android.os.Parcelable;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.Process; import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceSpecificException; import android.os.ServiceSpecificException;
import android.os.SystemClock; import android.os.SystemClock;
@@ -172,6 +174,7 @@ import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.LocalLog; import android.util.LocalLog;
import android.util.Log; import android.util.Log;
@@ -558,6 +561,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/ */
private static final int EVENT_SET_OEM_NETWORK_PREFERENCE = 48; private static final int EVENT_SET_OEM_NETWORK_PREFERENCE = 48;
/**
* Used to indicate the system default network becomes active.
*/
private static final int EVENT_REPORT_NETWORK_ACTIVITY = 49;
/** /**
* Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification
* should be shown. * should be shown.
@@ -1192,7 +1200,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mUserAllContext.registerReceiver(mIntentReceiver, intentFilter, mUserAllContext.registerReceiver(mIntentReceiver, intentFilter,
null /* broadcastPermission */, mHandler); null /* broadcastPermission */, mHandler);
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNMS); mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNMS, mNetd);
mSettingsObserver = new SettingsObserver(mContext, mHandler); mSettingsObserver = new SettingsObserver(mContext, mHandler);
registerSettingsCallbacks(); registerSettingsCallbacks();
@@ -2404,7 +2412,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/ */
@Override @Override
public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) { public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
// TODO: Replace network activity listener registry in ConnectivityManager from NMS to here mNetworkActivityTracker.registerNetworkActivityListener(l);
} }
/** /**
@@ -2412,7 +2420,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/ */
@Override @Override
public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) { public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) {
// TODO: Replace network activity listener registry in ConnectivityManager from NMS to here mNetworkActivityTracker.unregisterNetworkActivityListener(l);
} }
/** /**
@@ -2420,8 +2428,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/ */
@Override @Override
public boolean isDefaultNetworkActive() { public boolean isDefaultNetworkActive() {
// TODO: Replace isNetworkActive() in NMS. return mNetworkActivityTracker.isDefaultNetworkActive();
return false;
} }
/** /**
@@ -2686,6 +2693,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
pw.increaseIndent(); pw.increaseIndent();
mPermissionMonitor.dump(pw); mPermissionMonitor.dump(pw);
pw.decreaseIndent(); pw.decreaseIndent();
pw.println();
pw.println("Legacy network activity:");
pw.increaseIndent();
mNetworkActivityTracker.dump(pw);
pw.decreaseIndent();
} }
private void dumpNetworks(IndentingPrintWriter pw) { private void dumpNetworks(IndentingPrintWriter pw) {
@@ -4452,6 +4465,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e); loge("handleMessage.EVENT_SET_OEM_NETWORK_PREFERENCE failed", e);
} }
break; break;
case EVENT_REPORT_NETWORK_ACTIVITY:
mNetworkActivityTracker.handleReportNetworkActivity();
break;
} }
} }
} }
@@ -8639,13 +8655,35 @@ public class ConnectivityService extends IConnectivityManager.Stub
* changes. * changes.
*/ */
private static final class LegacyNetworkActivityTracker { private static final class LegacyNetworkActivityTracker {
private static final int NO_UID = -1;
private final Context mContext; private final Context mContext;
private final INetd mNetd;
private final INetworkManagementService mNMS; private final INetworkManagementService mNMS;
private final RemoteCallbackList<INetworkActivityListener> mNetworkActivityListeners =
new RemoteCallbackList<>();
// Indicate the current system default network activity is active or not.
@GuardedBy("mActiveIdleTimers")
private boolean mNetworkActive;
@GuardedBy("mActiveIdleTimers")
private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap();
private final Handler mHandler;
LegacyNetworkActivityTracker(@NonNull Context context, private class IdleTimerParams {
@NonNull INetworkManagementService nms) { public final int timeout;
public final int transportType;
IdleTimerParams(int timeout, int transport) {
this.timeout = timeout;
this.transportType = transport;
}
}
LegacyNetworkActivityTracker(@NonNull Context context, @NonNull Handler handler,
@NonNull INetworkManagementService nms, @NonNull INetd netd) {
mContext = context; mContext = context;
mNMS = nms; mNMS = nms;
mNetd = netd;
mHandler = handler;
try { try {
mNMS.registerObserver(mDataActivityObserver); mNMS.registerObserver(mDataActivityObserver);
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -8661,9 +8699,50 @@ public class ConnectivityService extends IConnectivityManager.Stub
long tsNanos, int uid) { long tsNanos, int uid) {
sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active, sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active,
tsNanos); tsNanos);
synchronized (mActiveIdleTimers) {
mNetworkActive = active;
// If there are no idle timers, it means that system is not monitoring
// activity, so the system default network for those default network
// unspecified apps is always considered active.
//
// TODO: If the mActiveIdleTimers is empty, netd will actually not send
// any network activity change event. Whenever this event is received,
// the mActiveIdleTimers should be always not empty. The legacy behavior
// is no-op. Remove to refer to mNetworkActive only.
if (mNetworkActive || mActiveIdleTimers.isEmpty()) {
mHandler.sendMessage(
mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY));
}
}
} }
}; };
// The network activity should only be updated from ConnectivityService handler thread
// when mActiveIdleTimers lock is held.
@GuardedBy("mActiveIdleTimers")
private void reportNetworkActive() {
final int length = mNetworkActivityListeners.beginBroadcast();
if (DDBG) log("reportNetworkActive, notify " + length + " listeners");
try {
for (int i = 0; i < length; i++) {
try {
mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive();
} catch (RemoteException | RuntimeException e) {
loge("Fail to send network activie to listener " + e);
}
}
} finally {
mNetworkActivityListeners.finishBroadcast();
}
}
@GuardedBy("mActiveIdleTimers")
public void handleReportNetworkActivity() {
synchronized (mActiveIdleTimers) {
reportNetworkActive();
}
}
// This is deprecated and only to support legacy use cases. // This is deprecated and only to support legacy use cases.
private int transportTypeToLegacyType(int type) { private int transportTypeToLegacyType(int type) {
switch (type) { switch (type) {
@@ -8728,10 +8807,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
return; // do not track any other networks return; // do not track any other networks
} }
updateRadioPowerState(true /* isActive */, type);
if (timeout > 0 && iface != null) { if (timeout > 0 && iface != null) {
try { try {
// TODO: Access INetd directly instead of NMS synchronized (mActiveIdleTimers) {
mNMS.addIdleTimer(iface, timeout, type); // Networks start up.
mNetworkActive = true;
mActiveIdleTimers.put(iface, new IdleTimerParams(timeout, type));
mNetd.idletimerAddInterface(iface, timeout, Integer.toString(type));
reportNetworkActive();
}
} catch (Exception e) { } catch (Exception e) {
// You shall not crash! // You shall not crash!
loge("Exception in setupDataActivityTracking " + e); loge("Exception in setupDataActivityTracking " + e);
@@ -8746,16 +8832,28 @@ public class ConnectivityService extends IConnectivityManager.Stub
final String iface = networkAgent.linkProperties.getInterfaceName(); final String iface = networkAgent.linkProperties.getInterfaceName();
final NetworkCapabilities caps = networkAgent.networkCapabilities; final NetworkCapabilities caps = networkAgent.networkCapabilities;
if (iface != null && (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) if (iface == null) return;
|| caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))) {
try { final int type;
// the call fails silently if no idle timer setup for this interface if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
// TODO: Access INetd directly instead of NMS type = NetworkCapabilities.TRANSPORT_CELLULAR;
mNMS.removeIdleTimer(iface); } else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
} catch (Exception e) { type = NetworkCapabilities.TRANSPORT_WIFI;
// You shall not crash! } else {
loge("Exception in removeDataActivityTracking " + e); return; // do not track any other networks
}
try {
updateRadioPowerState(false /* isActive */, type);
synchronized (mActiveIdleTimers) {
final IdleTimerParams params = mActiveIdleTimers.remove(iface);
// The call fails silently if no idle timer setup for this interface
mNetd.idletimerRemoveInterface(iface, params.timeout,
Integer.toString(params.transportType));
} }
} catch (Exception e) {
// You shall not crash!
loge("Exception in removeDataActivityTracking " + e);
} }
} }
@@ -8771,6 +8869,53 @@ public class ConnectivityService extends IConnectivityManager.Stub
removeDataActivityTracking(oldNetwork); removeDataActivityTracking(oldNetwork);
} }
} }
private void updateRadioPowerState(boolean isActive, int transportType) {
final BatteryStatsManager bs = mContext.getSystemService(BatteryStatsManager.class);
switch (transportType) {
case NetworkCapabilities.TRANSPORT_CELLULAR:
bs.reportMobileRadioPowerState(isActive, NO_UID);
break;
case NetworkCapabilities.TRANSPORT_WIFI:
bs.reportWifiRadioPowerState(isActive, NO_UID);
break;
default:
logw("Untracked transport type:" + transportType);
}
}
public boolean isDefaultNetworkActive() {
synchronized (mActiveIdleTimers) {
// If there are no idle timers, it means that system is not monitoring activity,
// so the default network is always considered active.
//
// TODO : Distinguish between the cases where mActiveIdleTimers is empty because
// tracking is disabled (negative idle timer value configured), or no active default
// network. In the latter case, this reports active but it should report inactive.
return mNetworkActive || mActiveIdleTimers.isEmpty();
}
}
public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
mNetworkActivityListeners.register(l);
}
public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) {
mNetworkActivityListeners.unregister(l);
}
public void dump(IndentingPrintWriter pw) {
synchronized (mActiveIdleTimers) {
pw.print("mNetworkActive="); pw.println(mNetworkActive);
pw.println("Idle timers:");
for (HashMap.Entry<String, IdleTimerParams> ent : mActiveIdleTimers.entrySet()) {
pw.print(" "); pw.print(ent.getKey()); pw.println(":");
final IdleTimerParams params = ent.getValue();
pw.print(" timeout="); pw.print(params.timeout);
pw.print(" type="); pw.println(params.transportType);
}
}
}
} }
/** /**

View File

@@ -8222,8 +8222,8 @@ public class ConnectivityServiceTest {
reset(mNetworkManagementService); reset(mNetworkManagementService);
mCellNetworkAgent.connect(true); mCellNetworkAgent.connect(true);
networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(), verify(mMockNetd, times(1)).idletimerAddInterface(eq(MOBILE_IFNAME), anyInt(),
eq(NetworkCapabilities.TRANSPORT_CELLULAR)); eq(Integer.toString(TRANSPORT_CELLULAR)));
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
final LinkProperties wifiLp = new LinkProperties(); final LinkProperties wifiLp = new LinkProperties();
@@ -8231,25 +8231,27 @@ public class ConnectivityServiceTest {
mWiFiNetworkAgent.sendLinkProperties(wifiLp); mWiFiNetworkAgent.sendLinkProperties(wifiLp);
// Network switch // Network switch
reset(mNetworkManagementService);
mWiFiNetworkAgent.connect(true); mWiFiNetworkAgent.connect(true);
networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
networkCallback.expectCallback(CallbackEntry.LOSING, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LOSING, mCellNetworkAgent);
networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
verify(mNetworkManagementService, times(1)).addIdleTimer(eq(WIFI_IFNAME), anyInt(), verify(mMockNetd, times(1)).idletimerAddInterface(eq(WIFI_IFNAME), anyInt(),
eq(NetworkCapabilities.TRANSPORT_WIFI)); eq(Integer.toString(TRANSPORT_WIFI)));
verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(MOBILE_IFNAME)); verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
// Disconnect wifi and switch back to cell // Disconnect wifi and switch back to cell
reset(mNetworkManagementService); reset(mMockNetd);
mWiFiNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect();
networkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); networkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent);
assertNoCallbacks(networkCallback); assertNoCallbacks(networkCallback);
verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(WIFI_IFNAME), anyInt(),
verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(), eq(Integer.toString(TRANSPORT_WIFI)));
eq(NetworkCapabilities.TRANSPORT_CELLULAR)); verify(mMockNetd, times(1)).idletimerAddInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
// reconnect wifi // reconnect wifi
reset(mMockNetd);
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
wifiLp.setInterfaceName(WIFI_IFNAME); wifiLp.setInterfaceName(WIFI_IFNAME);
mWiFiNetworkAgent.sendLinkProperties(wifiLp); mWiFiNetworkAgent.sendLinkProperties(wifiLp);
@@ -8257,9 +8259,12 @@ public class ConnectivityServiceTest {
networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
networkCallback.expectCallback(CallbackEntry.LOSING, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LOSING, mCellNetworkAgent);
networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
verify(mMockNetd, times(1)).idletimerAddInterface(eq(WIFI_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_WIFI)));
verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
// Disconnect cell // Disconnect cell
reset(mNetworkManagementService);
reset(mMockNetd); reset(mMockNetd);
mCellNetworkAgent.disconnect(); mCellNetworkAgent.disconnect();
networkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
@@ -8267,17 +8272,18 @@ public class ConnectivityServiceTest {
// sent as network being switched. Ensure rule removal for cell will not be triggered // sent as network being switched. Ensure rule removal for cell will not be triggered
// unexpectedly before network being removed. // unexpectedly before network being removed.
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, times(0)).removeIdleTimer(eq(MOBILE_IFNAME)); verify(mMockNetd, times(0)).idletimerRemoveInterface(eq(MOBILE_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_CELLULAR)));
verify(mMockNetd, times(1)).networkDestroy(eq(mCellNetworkAgent.getNetwork().netId)); verify(mMockNetd, times(1)).networkDestroy(eq(mCellNetworkAgent.getNetwork().netId));
verify(mMockDnsResolver, times(1)) verify(mMockDnsResolver, times(1))
.destroyNetworkCache(eq(mCellNetworkAgent.getNetwork().netId)); .destroyNetworkCache(eq(mCellNetworkAgent.getNetwork().netId));
// Disconnect wifi // Disconnect wifi
ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED); ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED);
reset(mNetworkManagementService);
mWiFiNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect();
b.expectBroadcast(); b.expectBroadcast();
verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); verify(mMockNetd, times(1)).idletimerRemoveInterface(eq(WIFI_IFNAME), anyInt(),
eq(Integer.toString(TRANSPORT_WIFI)));
// Clean up // Clean up
mCm.unregisterNetworkCallback(networkCallback); mCm.unregisterNetworkCallback(networkCallback);