Loading core/java/android/net/vcn/VcnTransportInfo.java 0 → 100644 +125 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.vcn; import android.annotation.NonNull; import android.annotation.Nullable; import android.net.TransportInfo; import android.net.wifi.WifiInfo; import android.os.Parcel; import android.os.Parcelable; import android.telephony.SubscriptionManager; import java.util.Objects; /** * VcnTransportInfo contains information about the VCN's underlying transports for SysUi. * * <p>Presence of this class in the NetworkCapabilities.TransportInfo implies that the network is a * VCN. * * <p>VcnTransportInfo must exist on top of either an underlying Wifi or Cellular Network. If the * underlying Network is WiFi, the subId will be {@link * SubscriptionManager#INVALID_SUBSCRIPTION_ID}. If the underlying Network is Cellular, the WifiInfo * will be {@code null}. * * @hide */ public class VcnTransportInfo implements TransportInfo, Parcelable { @Nullable private final WifiInfo mWifiInfo; private final int mSubId; public VcnTransportInfo(@NonNull WifiInfo wifiInfo) { this(wifiInfo, SubscriptionManager.INVALID_SUBSCRIPTION_ID); } public VcnTransportInfo(int subId) { this(null /* wifiInfo */, subId); } private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId) { if (wifiInfo == null && subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { throw new IllegalArgumentException( "VcnTransportInfo requires either non-null WifiInfo or valid subId"); } mWifiInfo = wifiInfo; mSubId = subId; } /** * Get the {@link WifiInfo} for this VcnTransportInfo. * * <p>If the underlying Network for the associated VCN is Cellular, returns null. * * @return the WifiInfo if there is an underlying WiFi connection, else null. */ @Nullable public WifiInfo getWifiInfo() { return mWifiInfo; } /** * Get the subId for the VCN Network associated with this VcnTransportInfo. * * <p>If the underlying Network for the associated VCN is WiFi, returns {@link * SubscriptionManager#INVALID_SUBSCRIPTION_ID}. * * @return the Subscription ID if a cellular underlying Network is present, else {@link * android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID}. */ public int getSubId() { return mSubId; } @Override public int hashCode() { return Objects.hash(mWifiInfo, mSubId); } @Override public boolean equals(Object o) { if (!(o instanceof VcnTransportInfo)) return false; final VcnTransportInfo that = (VcnTransportInfo) o; return Objects.equals(mWifiInfo, that.mWifiInfo) && mSubId == that.mSubId; } /** {@inheritDoc} */ @Override public int describeContents() { return 0; } /** {@inheritDoc} */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) {} /** Implement the Parcelable interface */ public static final @NonNull Creator<VcnTransportInfo> CREATOR = new Creator<VcnTransportInfo>() { public VcnTransportInfo createFromParcel(Parcel in) { // return null instead of a default VcnTransportInfo to avoid leaking // information about this being a VCN Network (instead of macro cellular, etc) return null; } public VcnTransportInfo[] newArray(int size) { return new VcnTransportInfo[size]; } }; } tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java 0 → 100644 +71 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.vcn; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import android.net.wifi.WifiInfo; import android.os.Parcel; import org.junit.Test; public class VcnTransportInfoTest { private static final int SUB_ID = 1; private static final int NETWORK_ID = 5; private static final WifiInfo WIFI_INFO = new WifiInfo.Builder().setNetworkId(NETWORK_ID).build(); private static final VcnTransportInfo CELL_UNDERLYING_INFO = new VcnTransportInfo(SUB_ID); private static final VcnTransportInfo WIFI_UNDERLYING_INFO = new VcnTransportInfo(WIFI_INFO); @Test public void testGetWifiInfo() { assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo()); assertNull(CELL_UNDERLYING_INFO.getWifiInfo()); } @Test public void testGetSubId() { assertEquals(SUB_ID, CELL_UNDERLYING_INFO.getSubId()); assertEquals(INVALID_SUBSCRIPTION_ID, WIFI_UNDERLYING_INFO.getSubId()); } @Test public void testEquals() { assertEquals(CELL_UNDERLYING_INFO, CELL_UNDERLYING_INFO); assertEquals(WIFI_UNDERLYING_INFO, WIFI_UNDERLYING_INFO); assertNotEquals(CELL_UNDERLYING_INFO, WIFI_UNDERLYING_INFO); } @Test public void testParcelUnparcel() { verifyParcelingIsNull(CELL_UNDERLYING_INFO); verifyParcelingIsNull(WIFI_UNDERLYING_INFO); } private void verifyParcelingIsNull(VcnTransportInfo vcnTransportInfo) { Parcel parcel = Parcel.obtain(); vcnTransportInfo.writeToParcel(parcel, 0 /* flags */); assertNull(VcnTransportInfo.CREATOR.createFromParcel(parcel)); } } Loading
core/java/android/net/vcn/VcnTransportInfo.java 0 → 100644 +125 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.vcn; import android.annotation.NonNull; import android.annotation.Nullable; import android.net.TransportInfo; import android.net.wifi.WifiInfo; import android.os.Parcel; import android.os.Parcelable; import android.telephony.SubscriptionManager; import java.util.Objects; /** * VcnTransportInfo contains information about the VCN's underlying transports for SysUi. * * <p>Presence of this class in the NetworkCapabilities.TransportInfo implies that the network is a * VCN. * * <p>VcnTransportInfo must exist on top of either an underlying Wifi or Cellular Network. If the * underlying Network is WiFi, the subId will be {@link * SubscriptionManager#INVALID_SUBSCRIPTION_ID}. If the underlying Network is Cellular, the WifiInfo * will be {@code null}. * * @hide */ public class VcnTransportInfo implements TransportInfo, Parcelable { @Nullable private final WifiInfo mWifiInfo; private final int mSubId; public VcnTransportInfo(@NonNull WifiInfo wifiInfo) { this(wifiInfo, SubscriptionManager.INVALID_SUBSCRIPTION_ID); } public VcnTransportInfo(int subId) { this(null /* wifiInfo */, subId); } private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId) { if (wifiInfo == null && subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { throw new IllegalArgumentException( "VcnTransportInfo requires either non-null WifiInfo or valid subId"); } mWifiInfo = wifiInfo; mSubId = subId; } /** * Get the {@link WifiInfo} for this VcnTransportInfo. * * <p>If the underlying Network for the associated VCN is Cellular, returns null. * * @return the WifiInfo if there is an underlying WiFi connection, else null. */ @Nullable public WifiInfo getWifiInfo() { return mWifiInfo; } /** * Get the subId for the VCN Network associated with this VcnTransportInfo. * * <p>If the underlying Network for the associated VCN is WiFi, returns {@link * SubscriptionManager#INVALID_SUBSCRIPTION_ID}. * * @return the Subscription ID if a cellular underlying Network is present, else {@link * android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID}. */ public int getSubId() { return mSubId; } @Override public int hashCode() { return Objects.hash(mWifiInfo, mSubId); } @Override public boolean equals(Object o) { if (!(o instanceof VcnTransportInfo)) return false; final VcnTransportInfo that = (VcnTransportInfo) o; return Objects.equals(mWifiInfo, that.mWifiInfo) && mSubId == that.mSubId; } /** {@inheritDoc} */ @Override public int describeContents() { return 0; } /** {@inheritDoc} */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) {} /** Implement the Parcelable interface */ public static final @NonNull Creator<VcnTransportInfo> CREATOR = new Creator<VcnTransportInfo>() { public VcnTransportInfo createFromParcel(Parcel in) { // return null instead of a default VcnTransportInfo to avoid leaking // information about this being a VCN Network (instead of macro cellular, etc) return null; } public VcnTransportInfo[] newArray(int size) { return new VcnTransportInfo[size]; } }; }
tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java 0 → 100644 +71 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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.vcn; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import android.net.wifi.WifiInfo; import android.os.Parcel; import org.junit.Test; public class VcnTransportInfoTest { private static final int SUB_ID = 1; private static final int NETWORK_ID = 5; private static final WifiInfo WIFI_INFO = new WifiInfo.Builder().setNetworkId(NETWORK_ID).build(); private static final VcnTransportInfo CELL_UNDERLYING_INFO = new VcnTransportInfo(SUB_ID); private static final VcnTransportInfo WIFI_UNDERLYING_INFO = new VcnTransportInfo(WIFI_INFO); @Test public void testGetWifiInfo() { assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo()); assertNull(CELL_UNDERLYING_INFO.getWifiInfo()); } @Test public void testGetSubId() { assertEquals(SUB_ID, CELL_UNDERLYING_INFO.getSubId()); assertEquals(INVALID_SUBSCRIPTION_ID, WIFI_UNDERLYING_INFO.getSubId()); } @Test public void testEquals() { assertEquals(CELL_UNDERLYING_INFO, CELL_UNDERLYING_INFO); assertEquals(WIFI_UNDERLYING_INFO, WIFI_UNDERLYING_INFO); assertNotEquals(CELL_UNDERLYING_INFO, WIFI_UNDERLYING_INFO); } @Test public void testParcelUnparcel() { verifyParcelingIsNull(CELL_UNDERLYING_INFO); verifyParcelingIsNull(WIFI_UNDERLYING_INFO); } private void verifyParcelingIsNull(VcnTransportInfo vcnTransportInfo) { Parcel parcel = Parcel.obtain(); vcnTransportInfo.writeToParcel(parcel, 0 /* flags */); assertNull(VcnTransportInfo.CREATOR.createFromParcel(parcel)); } }