Merge "Improve NetworkCallback declared methods toString" into main

This commit is contained in:
Treehugger Robot 2024-07-04 04:11:52 +00:00 • committed by Gerrit Code Review
commit 5289382f04
2 changed files with 112 additions and 32 deletions

View file

@ -40,7 +40,17 @@ import static android.net.ConnectivityManager.BLOCKED_REASON_APP_BACKGROUND;
import static android.net.ConnectivityManager.BLOCKED_REASON_LOCKDOWN_VPN;
import static android.net.ConnectivityManager.BLOCKED_REASON_NONE;
import static android.net.ConnectivityManager.BLOCKED_REASON_NETWORK_RESTRICTED;
import static android.net.ConnectivityManager.CALLBACK_AVAILABLE;
import static android.net.ConnectivityManager.CALLBACK_BLK_CHANGED;
import static android.net.ConnectivityManager.CALLBACK_CAP_CHANGED;
import static android.net.ConnectivityManager.CALLBACK_IP_CHANGED;
import static android.net.ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED;
import static android.net.ConnectivityManager.CALLBACK_LOSING;
import static android.net.ConnectivityManager.CALLBACK_LOST;
import static android.net.ConnectivityManager.CALLBACK_PRECHECK;
import static android.net.ConnectivityManager.CALLBACK_RESUMED;
import static android.net.ConnectivityManager.CALLBACK_SUSPENDED;
import static android.net.ConnectivityManager.CALLBACK_UNAVAIL;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.FIREWALL_CHAIN_BACKGROUND;
import static android.net.ConnectivityManager.FIREWALL_RULE_ALLOW;
@ -5364,7 +5374,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// by other networks that are already connected. Perhaps that can be done by
// sending all CALLBACK_LOST messages (for requests, not listens) at the end
// of rematchAllNetworksAndRequests
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOST);
notifyNetworkCallbacks(nai, CALLBACK_LOST);
mKeepaliveTracker.handleStopAllKeepalives(nai, SocketKeepalive.ERROR_INVALID_NETWORK);
mQosCallbackTracker.handleNetworkReleased(nai.network);
@ -5486,8 +5496,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// correctly contains null as an upstream.
if (sendCallbacks) {
nri.setSatisfier(null, null);
notifyNetworkCallbacks(local,
ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED);
notifyNetworkCallbacks(local, CALLBACK_LOCAL_NETWORK_INFO_CHANGED);
}
}
@ -5862,8 +5871,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
log("releasing " + nri.mRequests.get(0) + " (timeout)");
}
handleRemoveNetworkRequest(nri);
callCallbackForRequest(
nri, null, ConnectivityManager.CALLBACK_UNAVAIL, 0);
callCallbackForRequest(nri, null, CALLBACK_UNAVAIL, 0);
}
private void handleReleaseNetworkRequest(@NonNull final NetworkRequest request,
@ -5879,7 +5887,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
handleRemoveNetworkRequest(nri);
if (callOnUnavailable) {
callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_UNAVAIL, 0);
callCallbackForRequest(nri, null, CALLBACK_UNAVAIL, 0);
}
}
@ -7035,7 +7043,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// should have its link properties fixed up for PAC proxies.
mProxyTracker.updateDefaultNetworkProxyPortForPAC(nai.linkProperties, nai.network);
if (nai.everConnected()) {
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_IP_CHANGED);
notifyNetworkCallbacks(nai, CALLBACK_IP_CHANGED);
}
}
@ -7792,10 +7800,52 @@ public class ConnectivityService extends IConnectivityManager.Stub
+ " callback flags: " + mCallbackFlags
+ " order: " + mPreferenceOrder
+ " isUidTracked: " + mUidTrackedForBlockedStatus
+ " declaredMethods: 0x" + Integer.toHexString(mDeclaredMethodsFlags);
+ " declaredMethods: " + declaredMethodsFlagsToString(mDeclaredMethodsFlags);
}
}
/**
* Get a readable String for a bitmask of declared methods.
*/
@VisibleForTesting
public static String declaredMethodsFlagsToString(int flags) {
if (flags == DECLARED_METHODS_NONE) {
return "NONE";
}
if (flags == DECLARED_METHODS_ALL) {
return "ALL";
}
final StringBuilder sb = new StringBuilder();
flags = maybeAppendDeclaredMethod(flags, CALLBACK_PRECHECK, "PRECHK", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_AVAILABLE, "AVAIL", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_LOSING, "LOSING", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_LOST, "LOST", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_UNAVAIL, "UNAVAIL", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_CAP_CHANGED, "NC", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_IP_CHANGED, "LP", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_SUSPENDED, "SUSP", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_RESUMED, "RESUME", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_BLK_CHANGED, "BLK", sb);
flags = maybeAppendDeclaredMethod(flags, CALLBACK_LOCAL_NETWORK_INFO_CHANGED,
"LOCALINF", sb);
if (flags != 0) {
sb.append("|0x").append(Integer.toHexString(flags));
}
return sb.toString();
}
private static int maybeAppendDeclaredMethod(int declaredMethodsFlags,
int callbackId, String callbackName, @NonNull StringBuilder builder) {
final int callbackFlag = 1 << callbackId;
if ((declaredMethodsFlags & callbackFlag) != 0) {
if (builder.length() > 0) {
builder.append('|');
}
builder.append(callbackName);
}
return declaredMethodsFlags & ~callbackFlag;
}
// Keep backward compatibility since the ServiceSpecificException is used by
// the API surface, see {@link ConnectivityManager#convertServiceException}.
public static class RequestInfoPerUidCounter extends PerUidCounter {
@ -9082,7 +9132,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
networkAgent.networkMonitor().notifyLinkPropertiesChanged(
new LinkProperties(newLp, true /* parcelSensitiveFields */));
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
notifyNetworkCallbacks(networkAgent, CALLBACK_IP_CHANGED);
}
mKeepaliveTracker.handleCheckKeepalivesStillValid(networkAgent);
@ -9578,8 +9628,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (prevSuspended != suspended) {
// TODO (b/73132094) : remove this call once the few users of onSuspended and
// onResumed have been removed.
notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED
: ConnectivityManager.CALLBACK_RESUMED);
notifyNetworkCallbacks(nai, suspended ? CALLBACK_SUSPENDED : CALLBACK_RESUMED);
}
if (prevSuspended != suspended || prevRoaming != roaming) {
// updateNetworkInfo will mix in the suspended info from the capabilities and
@ -9666,7 +9715,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// If the requestable capabilities have changed or the score changed, we can't have been
// called by rematchNetworkAndRequests, so it's safe to start a rematch.
rematchAllNetworksAndRequests();
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
notifyNetworkCallbacks(nai, CALLBACK_CAP_CHANGED);
}
updateNetworkInfoForRoamingAndSuspended(nai, prevNc, newNc);
@ -9808,7 +9857,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// But here there is no new request, so the rematch won't see anything. Send
// callbacks to apps now to tell them about the loss of upstream.
notifyNetworkCallbacks(nai,
ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED);
CALLBACK_LOCAL_NETWORK_INFO_CHANGED);
return;
}
}
@ -10114,7 +10163,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void sendPendingIntentForRequest(NetworkRequestInfo nri, NetworkAgentInfo networkAgent,
int notificationType) {
if (notificationType == ConnectivityManager.CALLBACK_AVAILABLE && !nri.mPendingIntentSent) {
if (notificationType == CALLBACK_AVAILABLE && !nri.mPendingIntentSent) {
Intent intent = new Intent();
intent.putExtra(ConnectivityManager.EXTRA_NETWORK, networkAgent.network);
// If apps could file multi-layer requests with PendingIntents, they'd need to know
@ -10207,13 +10256,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkRequest nrForCallback = nri.getNetworkRequestForCallback();
putParcelable(bundle, nrForCallback);
Message msg = Message.obtain();
if (notificationType != ConnectivityManager.CALLBACK_UNAVAIL) {
if (notificationType != CALLBACK_UNAVAIL) {
putParcelable(bundle, networkAgent.network);
}
final boolean includeLocationSensitiveInfo =
(nri.mCallbackFlags & NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) != 0;
switch (notificationType) {
case ConnectivityManager.CALLBACK_AVAILABLE: {
case CALLBACK_AVAILABLE: {
final NetworkCapabilities nc =
createWithLocationInfoSanitizedIfNecessaryWhenParceled(
networkCapabilitiesRestrictedForCallerPermissions(
@ -10232,11 +10281,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
msg.arg1 = arg1;
break;
}
case ConnectivityManager.CALLBACK_LOSING: {
case CALLBACK_LOSING: {
msg.arg1 = arg1;
break;
}
case ConnectivityManager.CALLBACK_CAP_CHANGED: {
case CALLBACK_CAP_CHANGED: {
// networkAgent can't be null as it has been accessed a few lines above.
final NetworkCapabilities netCap =
networkCapabilitiesRestrictedForCallerPermissions(
@ -10249,17 +10298,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
nri.mCallingAttributionTag));
break;
}
case ConnectivityManager.CALLBACK_IP_CHANGED: {
case CALLBACK_IP_CHANGED: {
putParcelable(bundle, linkPropertiesRestrictedForCallerPermissions(
networkAgent.linkProperties, nri.mPid, nri.mUid));
break;
}
case ConnectivityManager.CALLBACK_BLK_CHANGED: {
case CALLBACK_BLK_CHANGED: {
maybeLogBlockedStatusChanged(nri, networkAgent.network, arg1);
msg.arg1 = arg1;
break;
}
case ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED: {
case CALLBACK_LOCAL_NETWORK_INFO_CHANGED: {
if (!networkAgent.isLocalNetwork()) {
Log.wtf(TAG, "Callback for local info for a non-local network");
return;
@ -10528,7 +10577,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void processListenRequests(@NonNull final NetworkAgentInfo nai) {
// For consistency with previous behaviour, send onLost callbacks before onAvailable.
processNewlyLostListenRequests(nai);
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
notifyNetworkCallbacks(nai, CALLBACK_CAP_CHANGED);
processNewlySatisfiedListenRequests(nai);
}
@ -10541,7 +10590,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (!nr.isListen()) continue;
if (nai.isSatisfyingRequest(nr.requestId) && !nai.satisfies(nr)) {
nai.removeRequest(nr.requestId);
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_LOST, 0);
callCallbackForRequest(nri, nai, CALLBACK_LOST, 0);
}
}
}
@ -10873,7 +10922,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
notifyNetworkAvailable(event.mNewNetwork, event.mNetworkRequestInfo);
} else {
callCallbackForRequest(event.mNetworkRequestInfo, event.mOldNetwork,
ConnectivityManager.CALLBACK_LOST, 0);
CALLBACK_LOST, 0);
}
}
@ -10917,7 +10966,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (null != localInfoChangedAgents) {
for (final NetworkAgentInfo nai : localInfoChangedAgents) {
notifyNetworkCallbacks(nai,
ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED);
CALLBACK_LOCAL_NETWORK_INFO_CHANGED);
}
}
@ -10960,7 +11009,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (Objects.equals(nai.networkCapabilities, newNc)) return;
updateNetworkPermissions(nai, newNc);
nai.getAndSetNetworkCapabilities(newNc);
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
notifyNetworkCallbacks(nai, CALLBACK_CAP_CHANGED);
}
private void updateLegacyTypeTrackerAndVpnLockdownForRematch(
@ -11329,7 +11378,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
rematchAllNetworksAndRequests();
// This has to happen after matching the requests, because callbacks are just requests.
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK);
notifyNetworkCallbacks(networkAgent, CALLBACK_PRECHECK);
} else if (state == NetworkInfo.State.DISCONNECTED) {
networkAgent.disconnect();
if (networkAgent.isVPN()) {
@ -11362,7 +11411,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
protected void notifyNetworkAvailable(NetworkAgentInfo nai, NetworkRequestInfo nri) {
mHandler.removeMessages(EVENT_TIMEOUT_NETWORK_REQUEST, nri);
if (nri.mPendingIntent != null) {
sendPendingIntentForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE);
sendPendingIntentForRequest(nri, nai, CALLBACK_AVAILABLE);
// Attempt no subsequent state pushes where intents are involved.
return;
}
@ -11370,14 +11419,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
final int blockedReasons = mUidBlockedReasons.get(nri.mAsUid, BLOCKED_REASON_NONE);
final boolean metered = nai.networkCapabilities.isMetered();
final boolean vpnBlocked = isUidBlockedByVpn(nri.mAsUid, mVpnBlockedUidRanges);
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE,
callCallbackForRequest(nri, nai, CALLBACK_AVAILABLE,
getBlockedState(nri.mAsUid, blockedReasons, metered, vpnBlocked));
}
// Notify the requests on this NAI that the network is now lingered.
private void notifyNetworkLosing(@NonNull final NetworkAgentInfo nai, final long now) {
final int lingerTime = (int) (nai.getInactivityExpiry() - now);
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING, lingerTime);
notifyNetworkCallbacks(nai, CALLBACK_LOSING, lingerTime);
}
private int getPermissionBlockedState(final int uid, final int reasons) {
@ -11440,7 +11489,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final int newBlockedState = getBlockedState(
nri.mAsUid, blockedReasons, newMetered, newVpnBlocked);
if (oldBlockedState != newBlockedState) {
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_BLK_CHANGED,
callCallbackForRequest(nri, nai, CALLBACK_BLK_CHANGED,
newBlockedState);
}
}
@ -11467,7 +11516,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequest nr = nai.requestAt(i);
NetworkRequestInfo nri = mNetworkRequests.get(nr);
if (nri != null && nri.mAsUid == uid) {
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_BLK_CHANGED,
callCallbackForRequest(nri, nai, CALLBACK_BLK_CHANGED,
newBlockedState);
}
}

View file

@ -17,8 +17,11 @@
package com.android.server.connectivityservice
import android.net.ConnectivityManager
import android.net.ConnectivityManager.CALLBACK_AVAILABLE
import android.net.ConnectivityManager.CALLBACK_BLK_CHANGED
import android.net.ConnectivityManager.CALLBACK_CAP_CHANGED
import android.net.ConnectivityManager.CALLBACK_IP_CHANGED
import android.net.ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED
import android.net.ConnectivityManager.CALLBACK_LOST
import android.net.ConnectivityManager.NetworkCallback.DECLARED_METHODS_ALL
import android.net.LinkAddress
@ -35,7 +38,9 @@ import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.RecorderCallback.CallbackEntry
import com.android.testutils.TestableNetworkCallback
import com.android.testutils.tryTest
import java.lang.reflect.Modifier
import java.util.concurrent.atomic.AtomicInteger
import kotlin.test.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@ -129,6 +134,32 @@ class CSDeclaredMethodsForCallbacksTest : CSTest() {
listenCb.expect<CallbackEntry.CapabilitiesChanged>()
listenCb.assertNoCallback(timeoutMs = 0L)
}
@Test
fun testDeclaredMethodsFlagsToString() {
assertEquals("NONE", ConnectivityService.declaredMethodsFlagsToString(0))
assertEquals("ALL", ConnectivityService.declaredMethodsFlagsToString(0.inv()))
assertEquals("AVAIL|NC|LP|BLK|LOCALINF", ConnectivityService.declaredMethodsFlagsToString(
(1 shl CALLBACK_AVAILABLE) or
(1 shl CALLBACK_CAP_CHANGED) or
(1 shl CALLBACK_IP_CHANGED) or
(1 shl CALLBACK_BLK_CHANGED) or
(1 shl CALLBACK_LOCAL_NETWORK_INFO_CHANGED)
))
// EXPIRE_LEGACY_REQUEST (=8) is only used in ConnectivityManager and not included.
// CALLBACK_TRANSITIVE_CALLS_ONLY (=0) is not a callback so not included either.
assertEquals(
"PRECHK|AVAIL|LOSING|LOST|UNAVAIL|NC|LP|SUSP|RESUME|BLK|LOCALINF|0x7fffe101",
ConnectivityService.declaredMethodsFlagsToString(0x7fff_ffff)
)
// The toString method and the assertion above need to be updated if constants are added
val constants = ConnectivityManager::class.java.declaredFields.filter {
Modifier.isStatic(it.modifiers) && Modifier.isFinal(it.modifiers) &&
it.name.startsWith("CALLBACK_")
}
assertEquals(12, constants.size)
}
}
private fun AtomicInteger.withFlags(vararg flags: Int, action: () -> Unit) {