From 5b52bef8d8aba96af2eb4ce22c560779c2f126bc Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Thu, 24 Mar 2016 12:07:00 +0000 Subject: [PATCH] Internal API for system apps to determine default network for other apps Callers with CONNECTIVITY_INTERNAL permission can read off the netId that an application is assigned to by default. Necessary for making connections as the default network for a client app eg. when downloading stuff on its behalf. Bug: 27074270 Change-Id: I8d35e8e99126875f55f3c545090326f3e9be43fb --- .../java/android/net/ConnectivityManager.java | 22 +++++++++++++++++++ .../android/net/IConnectivityManager.aidl | 1 + .../android/server/ConnectivityService.java | 11 +++++++++- .../server/ConnectivityServiceTest.java | 3 +++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index f0673fffc0..ccc4585386 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -766,6 +766,28 @@ public class ConnectivityManager { } } + /** + * Returns a {@link Network} object corresponding to the currently active + * default data network for a specific UID. In the event that the default data + * network disconnects, the returned {@code Network} object will no longer + * be usable. This will return {@code null} when there is no default + * network for the UID. + *

This method requires the caller to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. + * + * @return a {@link Network} object for the current default network for the + * given UID or {@code null} if no default network is currently active + * + * @hide + */ + public Network getActiveNetworkForUid(int uid) { + try { + return mService.getActiveNetworkForUid(uid); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Configures an always-on VPN connection through a specific application. * This connection is automatically granted and persisted after a reboot. diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 1a9c9ea4eb..c897c4506c 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -44,6 +44,7 @@ import com.android.internal.net.VpnProfile; interface IConnectivityManager { Network getActiveNetwork(); + Network getActiveNetworkForUid(int uid); NetworkInfo getActiveNetworkInfo(); NetworkInfo getActiveNetworkInfoForUid(int uid); NetworkInfo getNetworkInfo(int networkType); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 95d3cc3bbc..8967508286 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1006,7 +1006,16 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public Network getActiveNetwork() { enforceAccessPermission(); - final int uid = Binder.getCallingUid(); + return getActiveNetworkForUidInternal(Binder.getCallingUid()); + } + + @Override + public Network getActiveNetworkForUid(int uid) { + enforceConnectivityInternalPermission(); + return getActiveNetworkForUidInternal(uid); + } + + private Network getActiveNetworkForUidInternal(final int uid) { final int user = UserHandle.getUserId(uid); int vpnNetId = NETID_UNSET; synchronized (mVpns) { diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index 8e11511127..2f20a4bf22 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -59,6 +59,7 @@ import android.os.Message; import android.os.MessageQueue; import android.os.Messenger; import android.os.MessageQueue.IdleHandler; +import android.os.Process; import android.os.SystemClock; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; @@ -690,6 +691,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { assertEquals(transportToLegacyType(transport), mCm.getActiveNetworkInfo().getType()); // Test getActiveNetwork() assertNotNull(mCm.getActiveNetwork()); + assertEquals(mCm.getActiveNetwork(), mCm.getActiveNetworkForUid(Process.myUid())); switch (transport) { case TRANSPORT_WIFI: assertEquals(mCm.getActiveNetwork(), mWiFiNetworkAgent.getNetwork()); @@ -713,6 +715,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { assertNull(mCm.getActiveNetworkInfo()); // Test getActiveNetwork() assertNull(mCm.getActiveNetwork()); + assertNull(mCm.getActiveNetworkForUid(Process.myUid())); // Test getAllNetworks() assertEquals(0, mCm.getAllNetworks().length); }