Loading src/java/com/android/internal/telephony/CarrierPrivilegesTracker.java +21 −0 Original line number Diff line number Diff line Loading @@ -46,10 +46,12 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PersistableBundle; import android.os.Process; import android.os.Registrant; import android.os.RegistrantList; import android.os.UserHandle; import android.os.UserManager; import android.service.carrier.CarrierService; import android.telephony.Annotation.CarrierPrivilegeStatus; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; Loading Loading @@ -804,6 +806,25 @@ public class CarrierPrivilegesTracker extends Handler { } } /** * @return The UID of carrier service package. {@link Process#INVALID_UID} if not found. */ public int getCarrierServicePackageUid() { Intent intent = new Intent(CarrierService.CARRIER_SERVICE_INTERFACE); List<String> carrierPackageNames = getCarrierPackageNamesForIntent(intent); if (!carrierPackageNames.isEmpty()) { List<Integer> uids = new ArrayList<>(getUidsForPackage(carrierPackageNames.get(0), /* invalidateCache= */ false)); if (uids.isEmpty()) return Process.INVALID_UID; if (uids.size() > 1) { Rlog.w(TAG, "getCarrierServicePackageUid: more than one uid for carrier " + "service package."); } return uids.get(0); } return Process.INVALID_UID; } /** * Backing of {@link TelephonyManager#getCarrierPackageNamesForIntent} and {@link * TelephonyManager#getCarrierPackageNamesForIntentAndPhone}. Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +1 −0 Original line number Diff line number Diff line Loading @@ -1107,6 +1107,7 @@ public class GsmCdmaPhone extends Phone { } @Override @NonNull public CarrierPrivilegesTracker getCarrierPrivilegesTracker() { return mCarrierPrivilegesTracker; } Loading src/java/com/android/internal/telephony/data/DataNetwork.java +50 −3 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.net.vcn.VcnNetworkPolicyResult; import android.os.AsyncResult; import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.SystemClock; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.AccessNetworkType; Loading Loading @@ -133,7 +134,7 @@ import java.util.stream.Collectors; * │Handover │ * └─▲────┬──┘ * │ │ * ┌───────────┐ ┌─┴────▼──┐ ┌───────▼──────┐ * ┌───────────┐ ┌─┴────▼──┐ ┌──────────────┐ * │Connecting ├────────►Connected├────────►Disconnecting │ * └─────┬─────┘ └────┬────┘ └───────┬──────┘ * │ │ │ Loading Loading @@ -192,6 +193,9 @@ public class DataNetwork extends StateMachine { /** Event for PCO data received from network. */ private static final int EVENT_PCO_DATA_RECEIVED = 17; /** Event for carrier privileged UIDs changed. */ private static final int EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED = 18; /** The default MTU for IPv4 network. */ private static final int DEFAULT_MTU_V4 = 1280; Loading Loading @@ -522,6 +526,17 @@ public class DataNetwork extends StateMachine { /** The QOS bearer sessions. */ private final @NonNull List<QosBearerSession> mQosBearerSessions = new ArrayList<>(); /** * The UIDs of packages that have carrier privilege. These UIDs will not change through the * life cycle of data network. */ private @NonNull int[] mAdministratorUids = new int[0]; /** * Carrier service package uid. This UID will not change through the life cycle of data network. */ private int mCarrierServicePackageUid = Process.INVALID_UID; /** * The network bandwidth. */ Loading Loading @@ -797,6 +812,9 @@ public class DataNetwork extends StateMachine { transport, getHandler(), EVENT_SERVICE_STATE_CHANGED, transport); } mPhone.getCarrierPrivilegesTracker().registerCarrierPrivilegesListener(getHandler(), EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED, null); // Only add symmetric code here, for example, registering and unregistering. // DefaultState.enter() is the starting point in the life cycle of the DataNetwork, // and DefaultState.exit() is the end. For non-symmetric initializing works, put them Loading Loading @@ -874,6 +892,12 @@ public class DataNetwork extends StateMachine { onDataStateChanged(transport, (List<DataCallResponse>) ar.result); break; } case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED: { AsyncResult asyncResult = (AsyncResult) msg.obj; int[] administratorUids = (int[]) asyncResult.result; mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length); break; } case EVENT_START_HANDOVER: case EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED: case EVENT_BANDWIDTH_ESTIMATE_FROM_BANDWIDTH_ESTIMATOR_CHANGED: Loading Loading @@ -904,6 +928,11 @@ public class DataNetwork extends StateMachine { mLogTag = "DN-" + mInitialNetworkAgentId + "-" + ((mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? "C" : "I"); // Get carrier config package uid. Note that this uid will not change through the life // cycle of this data network. So there is no need to listen to the change event. mCarrierServicePackageUid = mPhone.getCarrierPrivilegesTracker() .getCarrierServicePackageUid(); notifyPreciseDataConnectionState(); if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { allocatePduSessionId(); Loading Loading @@ -980,9 +1009,12 @@ public class DataNetwork extends StateMachine { // to tear down the VCN-managed network. if (mVcnManager != null) { mVcnPolicyChangeListener = () -> { log("VCN policy changed."); if (mVcnManager.applyVcnNetworkPolicy(mNetworkCapabilities, mLinkProperties) .isTeardownRequested()) { tearDown(TEAR_DOWN_REASON_VCN_REQUESTED); } else { updateNetworkCapabilities(); } }; mVcnManager.addVcnNetworkPolicyChangeListener( Loading Loading @@ -1430,6 +1462,13 @@ public class DataNetwork extends StateMachine { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); } if (mCarrierServicePackageUid != Process.INVALID_UID && ArrayUtils.contains(mAdministratorUids, mCarrierServicePackageUid)) { builder.setOwnerUid(mCarrierServicePackageUid); builder.setAccessUids(Collections.singleton(mCarrierServicePackageUid)); } builder.setAdministratorUids(mAdministratorUids); Set<Integer> meteredCapabilities = mDataConfigManager .getMeteredNetworkCapabilities(roaming).stream() .filter(cap -> mAccessNetworksManager.getPreferredTransportByNetworkCapability(cap) Loading Loading @@ -2630,6 +2669,8 @@ public class DataNetwork extends StateMachine { return "EVENT_SUBSCRIPTION_PLAN_OVERRIDE"; case EVENT_PCO_DATA_RECEIVED: return "EVENT_PCO_DATA_RECEIVED"; case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED: return "EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED"; default: return "Unknown(" + event + ")"; } Loading Loading @@ -2703,8 +2744,10 @@ public class DataNetwork extends StateMachine { pw.println("Tag: " + name()); pw.increaseIndent(); pw.println("mSubId=" + mSubId); pw.println("mTransport=" + AccessNetworkConstants.transportTypeToString(mTransport)); pw.println("WWAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); pw.println("WLAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); pw.println("mDataAllowedReason=" + mDataAllowedReason); pw.println("mPduSessionId=" + mPduSessionId); pw.println("mDataProfile=" + mDataProfile); pw.println("mNetworkCapabilities" + mNetworkCapabilities); Loading @@ -2714,7 +2757,13 @@ public class DataNetwork extends StateMachine { pw.println("mTempNotMeteredSupported=" + mTempNotMeteredSupported); pw.println("mTempNotMetered=" + mTempNotMetered); pw.println("mCongested=" + mCongested); pw.println("mSuspended" + mSuspended); pw.println("mDataCallResponse=" + mDataCallResponse); pw.println("mFailCause=" + DataFailCause.toString(mFailCause)); pw.println("mAdministratorUids=" + Arrays.toString(mAdministratorUids)); pw.println("mCarrierServicePackageUid=" + mCarrierServicePackageUid); pw.println("mEverConnected=" + mEverConnected); pw.println("mInvokedDataDeactivation=" + mInvokedDataDeactivation); pw.println("Attached network requests:"); pw.increaseIndent(); Loading @@ -2723,8 +2772,6 @@ public class DataNetwork extends StateMachine { } pw.decreaseIndent(); pw.println("mQosBearerSessions=" + mQosBearerSessions); pw.println("mEverConnected=" + mEverConnected); pw.println("mInvokedDataDeactivation=" + mInvokedDataDeactivation); mNetworkAgent.dump(fd, pw, args); pw.println("Local logs:"); Loading tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -646,6 +646,7 @@ public abstract class TelephonyTest { doReturn(mDataConfigManager).when(mDataNetworkController).getDataConfigManager(); doReturn(mDataProfileManager).when(mDataNetworkController).getDataProfileManager(); doReturn(mDataRetryManager).when(mDataNetworkController).getDataRetryManager(); doReturn(mCarrierPrivilegesTracker).when(mPhone).getCarrierPrivilegesTracker(); //mUiccController doReturn(mUiccCardApplication3gpp).when(mUiccController).getUiccCardApplication(anyInt(), Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public class DataNetworkTest extends TelephonyTest { private static final String IPV4_ADDRESS = "10.0.2.15"; private static final String IPV6_ADDRESS = "2607:fb90:a620:651d:eabe:f8da:c107:44be"; private static final int ADMIN_UID1 = 1234; private static final int ADMIN_UID2 = 5678; private DataNetwork mDataNetworkUT; private final SparseArray<DataServiceManager> mDataServiceManagers = new SparseArray<>(); Loading Loading @@ -659,4 +662,33 @@ public class DataNetworkTest extends TelephonyTest { assertThat(pdcsList.get(3).getLastCauseCode()) .isEqualTo(DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE); } @Test public void testAdminAndOwnerUids() throws Exception { DataNetworkController.NetworkRequestList networkRequestList = new DataNetworkController.NetworkRequestList(); networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(), mPhone)); setSuccessfulSetupDataResponse(mMockedWwanDataServiceManager, 123); doReturn(ADMIN_UID2).when(mCarrierPrivilegesTracker).getCarrierServicePackageUid(); mDataNetworkUT = new DataNetwork(mPhone, Looper.myLooper(), mDataServiceManagers, mInternetDataProfile, networkRequestList, AccessNetworkConstants.TRANSPORT_TYPE_WWAN, DataAllowedReason.NORMAL, mDataNetworkCallback); replaceInstance(DataNetwork.class, "mDataCallSessionStats", mDataNetworkUT, mDataCallSessionStats); mDataNetworkUT.sendMessage(18/*EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED*/, new AsyncResult(null, new int[]{ADMIN_UID1, ADMIN_UID2}, null)); sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE, ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN); processAllMessages(); assertThat(mDataNetworkUT.getNetworkCapabilities().getAdministratorUids()).asList() .containsExactly(ADMIN_UID1, ADMIN_UID2); assertThat(mDataNetworkUT.getNetworkCapabilities().getOwnerUid()).isEqualTo(ADMIN_UID2); } } Loading
src/java/com/android/internal/telephony/CarrierPrivilegesTracker.java +21 −0 Original line number Diff line number Diff line Loading @@ -46,10 +46,12 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PersistableBundle; import android.os.Process; import android.os.Registrant; import android.os.RegistrantList; import android.os.UserHandle; import android.os.UserManager; import android.service.carrier.CarrierService; import android.telephony.Annotation.CarrierPrivilegeStatus; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; Loading Loading @@ -804,6 +806,25 @@ public class CarrierPrivilegesTracker extends Handler { } } /** * @return The UID of carrier service package. {@link Process#INVALID_UID} if not found. */ public int getCarrierServicePackageUid() { Intent intent = new Intent(CarrierService.CARRIER_SERVICE_INTERFACE); List<String> carrierPackageNames = getCarrierPackageNamesForIntent(intent); if (!carrierPackageNames.isEmpty()) { List<Integer> uids = new ArrayList<>(getUidsForPackage(carrierPackageNames.get(0), /* invalidateCache= */ false)); if (uids.isEmpty()) return Process.INVALID_UID; if (uids.size() > 1) { Rlog.w(TAG, "getCarrierServicePackageUid: more than one uid for carrier " + "service package."); } return uids.get(0); } return Process.INVALID_UID; } /** * Backing of {@link TelephonyManager#getCarrierPackageNamesForIntent} and {@link * TelephonyManager#getCarrierPackageNamesForIntentAndPhone}. Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +1 −0 Original line number Diff line number Diff line Loading @@ -1107,6 +1107,7 @@ public class GsmCdmaPhone extends Phone { } @Override @NonNull public CarrierPrivilegesTracker getCarrierPrivilegesTracker() { return mCarrierPrivilegesTracker; } Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +50 −3 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.net.vcn.VcnNetworkPolicyResult; import android.os.AsyncResult; import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.SystemClock; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.AccessNetworkType; Loading Loading @@ -133,7 +134,7 @@ import java.util.stream.Collectors; * │Handover │ * └─▲────┬──┘ * │ │ * ┌───────────┐ ┌─┴────▼──┐ ┌───────▼──────┐ * ┌───────────┐ ┌─┴────▼──┐ ┌──────────────┐ * │Connecting ├────────►Connected├────────►Disconnecting │ * └─────┬─────┘ └────┬────┘ └───────┬──────┘ * │ │ │ Loading Loading @@ -192,6 +193,9 @@ public class DataNetwork extends StateMachine { /** Event for PCO data received from network. */ private static final int EVENT_PCO_DATA_RECEIVED = 17; /** Event for carrier privileged UIDs changed. */ private static final int EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED = 18; /** The default MTU for IPv4 network. */ private static final int DEFAULT_MTU_V4 = 1280; Loading Loading @@ -522,6 +526,17 @@ public class DataNetwork extends StateMachine { /** The QOS bearer sessions. */ private final @NonNull List<QosBearerSession> mQosBearerSessions = new ArrayList<>(); /** * The UIDs of packages that have carrier privilege. These UIDs will not change through the * life cycle of data network. */ private @NonNull int[] mAdministratorUids = new int[0]; /** * Carrier service package uid. This UID will not change through the life cycle of data network. */ private int mCarrierServicePackageUid = Process.INVALID_UID; /** * The network bandwidth. */ Loading Loading @@ -797,6 +812,9 @@ public class DataNetwork extends StateMachine { transport, getHandler(), EVENT_SERVICE_STATE_CHANGED, transport); } mPhone.getCarrierPrivilegesTracker().registerCarrierPrivilegesListener(getHandler(), EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED, null); // Only add symmetric code here, for example, registering and unregistering. // DefaultState.enter() is the starting point in the life cycle of the DataNetwork, // and DefaultState.exit() is the end. For non-symmetric initializing works, put them Loading Loading @@ -874,6 +892,12 @@ public class DataNetwork extends StateMachine { onDataStateChanged(transport, (List<DataCallResponse>) ar.result); break; } case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED: { AsyncResult asyncResult = (AsyncResult) msg.obj; int[] administratorUids = (int[]) asyncResult.result; mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length); break; } case EVENT_START_HANDOVER: case EVENT_BANDWIDTH_ESTIMATE_FROM_MODEM_CHANGED: case EVENT_BANDWIDTH_ESTIMATE_FROM_BANDWIDTH_ESTIMATOR_CHANGED: Loading Loading @@ -904,6 +928,11 @@ public class DataNetwork extends StateMachine { mLogTag = "DN-" + mInitialNetworkAgentId + "-" + ((mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? "C" : "I"); // Get carrier config package uid. Note that this uid will not change through the life // cycle of this data network. So there is no need to listen to the change event. mCarrierServicePackageUid = mPhone.getCarrierPrivilegesTracker() .getCarrierServicePackageUid(); notifyPreciseDataConnectionState(); if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { allocatePduSessionId(); Loading Loading @@ -980,9 +1009,12 @@ public class DataNetwork extends StateMachine { // to tear down the VCN-managed network. if (mVcnManager != null) { mVcnPolicyChangeListener = () -> { log("VCN policy changed."); if (mVcnManager.applyVcnNetworkPolicy(mNetworkCapabilities, mLinkProperties) .isTeardownRequested()) { tearDown(TEAR_DOWN_REASON_VCN_REQUESTED); } else { updateNetworkCapabilities(); } }; mVcnManager.addVcnNetworkPolicyChangeListener( Loading Loading @@ -1430,6 +1462,13 @@ public class DataNetwork extends StateMachine { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); } if (mCarrierServicePackageUid != Process.INVALID_UID && ArrayUtils.contains(mAdministratorUids, mCarrierServicePackageUid)) { builder.setOwnerUid(mCarrierServicePackageUid); builder.setAccessUids(Collections.singleton(mCarrierServicePackageUid)); } builder.setAdministratorUids(mAdministratorUids); Set<Integer> meteredCapabilities = mDataConfigManager .getMeteredNetworkCapabilities(roaming).stream() .filter(cap -> mAccessNetworksManager.getPreferredTransportByNetworkCapability(cap) Loading Loading @@ -2630,6 +2669,8 @@ public class DataNetwork extends StateMachine { return "EVENT_SUBSCRIPTION_PLAN_OVERRIDE"; case EVENT_PCO_DATA_RECEIVED: return "EVENT_PCO_DATA_RECEIVED"; case EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED: return "EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED"; default: return "Unknown(" + event + ")"; } Loading Loading @@ -2703,8 +2744,10 @@ public class DataNetwork extends StateMachine { pw.println("Tag: " + name()); pw.increaseIndent(); pw.println("mSubId=" + mSubId); pw.println("mTransport=" + AccessNetworkConstants.transportTypeToString(mTransport)); pw.println("WWAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)); pw.println("WLAN cid=" + mCid.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)); pw.println("mDataAllowedReason=" + mDataAllowedReason); pw.println("mPduSessionId=" + mPduSessionId); pw.println("mDataProfile=" + mDataProfile); pw.println("mNetworkCapabilities" + mNetworkCapabilities); Loading @@ -2714,7 +2757,13 @@ public class DataNetwork extends StateMachine { pw.println("mTempNotMeteredSupported=" + mTempNotMeteredSupported); pw.println("mTempNotMetered=" + mTempNotMetered); pw.println("mCongested=" + mCongested); pw.println("mSuspended" + mSuspended); pw.println("mDataCallResponse=" + mDataCallResponse); pw.println("mFailCause=" + DataFailCause.toString(mFailCause)); pw.println("mAdministratorUids=" + Arrays.toString(mAdministratorUids)); pw.println("mCarrierServicePackageUid=" + mCarrierServicePackageUid); pw.println("mEverConnected=" + mEverConnected); pw.println("mInvokedDataDeactivation=" + mInvokedDataDeactivation); pw.println("Attached network requests:"); pw.increaseIndent(); Loading @@ -2723,8 +2772,6 @@ public class DataNetwork extends StateMachine { } pw.decreaseIndent(); pw.println("mQosBearerSessions=" + mQosBearerSessions); pw.println("mEverConnected=" + mEverConnected); pw.println("mInvokedDataDeactivation=" + mInvokedDataDeactivation); mNetworkAgent.dump(fd, pw, args); pw.println("Local logs:"); Loading
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -646,6 +646,7 @@ public abstract class TelephonyTest { doReturn(mDataConfigManager).when(mDataNetworkController).getDataConfigManager(); doReturn(mDataProfileManager).when(mDataNetworkController).getDataProfileManager(); doReturn(mDataRetryManager).when(mDataNetworkController).getDataRetryManager(); doReturn(mCarrierPrivilegesTracker).when(mPhone).getCarrierPrivilegesTracker(); //mUiccController doReturn(mUiccCardApplication3gpp).when(mUiccController).getUiccCardApplication(anyInt(), Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,9 @@ public class DataNetworkTest extends TelephonyTest { private static final String IPV4_ADDRESS = "10.0.2.15"; private static final String IPV6_ADDRESS = "2607:fb90:a620:651d:eabe:f8da:c107:44be"; private static final int ADMIN_UID1 = 1234; private static final int ADMIN_UID2 = 5678; private DataNetwork mDataNetworkUT; private final SparseArray<DataServiceManager> mDataServiceManagers = new SparseArray<>(); Loading Loading @@ -659,4 +662,33 @@ public class DataNetworkTest extends TelephonyTest { assertThat(pdcsList.get(3).getLastCauseCode()) .isEqualTo(DataFailCause.SERVICE_TEMPORARILY_UNAVAILABLE); } @Test public void testAdminAndOwnerUids() throws Exception { DataNetworkController.NetworkRequestList networkRequestList = new DataNetworkController.NetworkRequestList(); networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(), mPhone)); setSuccessfulSetupDataResponse(mMockedWwanDataServiceManager, 123); doReturn(ADMIN_UID2).when(mCarrierPrivilegesTracker).getCarrierServicePackageUid(); mDataNetworkUT = new DataNetwork(mPhone, Looper.myLooper(), mDataServiceManagers, mInternetDataProfile, networkRequestList, AccessNetworkConstants.TRANSPORT_TYPE_WWAN, DataAllowedReason.NORMAL, mDataNetworkCallback); replaceInstance(DataNetwork.class, "mDataCallSessionStats", mDataNetworkUT, mDataCallSessionStats); mDataNetworkUT.sendMessage(18/*EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED*/, new AsyncResult(null, new int[]{ADMIN_UID1, ADMIN_UID2}, null)); sendServiceStateChangedEvent(ServiceState.STATE_IN_SERVICE, ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN); processAllMessages(); assertThat(mDataNetworkUT.getNetworkCapabilities().getAdministratorUids()).asList() .containsExactly(ADMIN_UID1, ADMIN_UID2); assertThat(mDataNetworkUT.getNetworkCapabilities().getOwnerUid()).isEqualTo(ADMIN_UID2); } }