1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.M; 4 import static android.os.Build.VERSION_CODES.N; 5 import static android.os.Build.VERSION_CODES.N_MR1; 6 import static android.os.Build.VERSION_CODES.O; 7 import static android.os.Build.VERSION_CODES.O_MR1; 8 import static android.os.Build.VERSION_CODES.P; 9 import static android.os.Build.VERSION_CODES.Q; 10 import static android.os.Build.VERSION_CODES.S; 11 import static org.robolectric.util.reflector.Reflector.reflector; 12 13 import android.net.NetworkCapabilities; 14 import android.net.NetworkSpecifier; 15 import android.net.TransportInfo; 16 import org.robolectric.RuntimeEnvironment; 17 import org.robolectric.annotation.HiddenApi; 18 import org.robolectric.annotation.Implementation; 19 import org.robolectric.annotation.Implements; 20 import org.robolectric.annotation.RealObject; 21 import org.robolectric.shadow.api.Shadow; 22 import org.robolectric.util.reflector.Accessor; 23 import org.robolectric.util.reflector.Direct; 24 import org.robolectric.util.reflector.ForType; 25 26 /** Robolectric provides overrides for fetching and updating transport. */ 27 @Implements(value = NetworkCapabilities.class) 28 public class ShadowNetworkCapabilities { 29 30 @RealObject protected NetworkCapabilities realNetworkCapabilities; 31 32 public static final int NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED = 37; 33 newInstance()34 public static NetworkCapabilities newInstance() { 35 return Shadow.newInstanceOf(NetworkCapabilities.class); 36 } 37 38 /** Updates the transport types for this network capabilities to include {@code transportType}. */ 39 @HiddenApi 40 @Implementation addTransportType(int transportType)41 public NetworkCapabilities addTransportType(int transportType) { 42 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 43 .addTransportType(transportType); 44 } 45 46 /** Updates the transport types for this network capabilities to remove {@code transportType}. */ 47 @HiddenApi 48 @Implementation removeTransportType(int transportType)49 public NetworkCapabilities removeTransportType(int transportType) { 50 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 51 .removeTransportType(transportType); 52 } 53 54 /** Adds {@code capability} to the NetworkCapabilities. */ 55 @HiddenApi 56 @Implementation addCapability(int capability)57 public NetworkCapabilities addCapability(int capability) { 58 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 59 .addCapability(capability); 60 } 61 62 /** Removes {@code capability} from the NetworkCapabilities. */ 63 @HiddenApi 64 @Implementation removeCapability(int capability)65 public NetworkCapabilities removeCapability(int capability) { 66 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 67 .removeCapability(capability); 68 } 69 70 /** 71 * Changes {@link NetworkSpecifier} for this network capabilities. Works only on Android O and 72 * higher. For lower versions use {@link #setNetworkSpecifier(String)} 73 */ 74 @Implementation(minSdk = O) setNetworkSpecifier(NetworkSpecifier networkSpecifier)75 public NetworkCapabilities setNetworkSpecifier(NetworkSpecifier networkSpecifier) { 76 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 77 .setNetworkSpecifier(networkSpecifier); 78 } 79 80 /** 81 * Changes {@link NetworkSpecifier} for this network capabilities. Works only on Android N_MR1 and 82 * lower. For higher versions use {@link #setNetworkSpecifier(NetworkSpecifier)} 83 */ 84 @Implementation(minSdk = N, maxSdk = N_MR1) setNetworkSpecifier(String networkSpecifier)85 public NetworkCapabilities setNetworkSpecifier(String networkSpecifier) { 86 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 87 .setNetworkSpecifier(networkSpecifier); 88 } 89 90 /** Sets the {@code transportInfo} of the NetworkCapabilities. */ 91 @HiddenApi 92 @Implementation(minSdk = Q) setTransportInfo(TransportInfo transportInfo)93 public NetworkCapabilities setTransportInfo(TransportInfo transportInfo) { 94 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 95 .setTransportInfo(transportInfo); 96 } 97 98 /** Sets the LinkDownstreamBandwidthKbps of the NetworkCapabilities. */ 99 @HiddenApi 100 @Implementation(maxSdk = O_MR1, methodName = "setLinkDownstreamBandwidthKbps") setLinkDownstreamBandwidthKbpsPrePie(int kbps)101 protected void setLinkDownstreamBandwidthKbpsPrePie(int kbps) { 102 reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 103 .setLinkDownstreamBandwidthKbps(kbps); 104 } 105 106 /** 107 * Sets the LinkDownstreamBandwidthKbps of the NetworkCapabilities. 108 * 109 * <p>Return type changed to {@code NetworkCapabilities} starting from Pie. 110 */ 111 @HiddenApi 112 @Implementation(minSdk = P) setLinkDownstreamBandwidthKbps(int kbps)113 public NetworkCapabilities setLinkDownstreamBandwidthKbps(int kbps) { 114 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 115 .setLinkDownstreamBandwidthKbps(kbps); 116 } 117 118 /** Sets the LinkUpstreamBandwidthKbps of the NetworkCapabilities. */ 119 @HiddenApi 120 @Implementation(maxSdk = O_MR1, methodName = "setLinkUpstreamBandwidthKbps") setLinkUpstreamBandwidthKbpsPrePie(int kbps)121 protected void setLinkUpstreamBandwidthKbpsPrePie(int kbps) { 122 reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 123 .setLinkUpstreamBandwidthKbps(kbps); 124 } 125 126 /** 127 * Sets the LinkUpstreamBandwidthKbps of the NetworkCapabilities. 128 * 129 * <p>Return type changed to {@code NetworkCapabilities} starting from Pie. 130 */ 131 @HiddenApi 132 @Implementation(minSdk = P) setLinkUpstreamBandwidthKbps(int kbps)133 public NetworkCapabilities setLinkUpstreamBandwidthKbps(int kbps) { 134 return reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 135 .setLinkUpstreamBandwidthKbps(kbps); 136 } 137 138 /** Clears capabilities. */ clearCapabilities()139 public void clearCapabilities() { 140 if (RuntimeEnvironment.getApiLevel() < M) { 141 reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 142 .setMNetworkCapabilities(0L); 143 144 if (RuntimeEnvironment.getApiLevel() >= S) { 145 reflector(NetworkCapabilitiesReflector.class, realNetworkCapabilities) 146 .setMForbiddenNetworkCapabilities(0L); 147 } 148 } else { 149 realNetworkCapabilities.clearAll(); 150 } 151 } 152 153 @ForType(NetworkCapabilities.class) 154 interface NetworkCapabilitiesReflector { 155 156 @Accessor("mNetworkCapabilities") setMNetworkCapabilities(long capabilities)157 void setMNetworkCapabilities(long capabilities); 158 159 @Accessor("mForbiddenNetworkCapabilities") setMForbiddenNetworkCapabilities(long capabilities)160 void setMForbiddenNetworkCapabilities(long capabilities); 161 162 @Direct addTransportType(int transportType)163 NetworkCapabilities addTransportType(int transportType); 164 165 @Direct removeTransportType(int transportType)166 NetworkCapabilities removeTransportType(int transportType); 167 168 @Direct addCapability(int capability)169 NetworkCapabilities addCapability(int capability); 170 171 @Direct removeCapability(int capability)172 NetworkCapabilities removeCapability(int capability); 173 174 @Direct setNetworkSpecifier(NetworkSpecifier networkSpecifier)175 NetworkCapabilities setNetworkSpecifier(NetworkSpecifier networkSpecifier); 176 177 @Direct setNetworkSpecifier(String networkSpecifier)178 NetworkCapabilities setNetworkSpecifier(String networkSpecifier); 179 180 @Direct setTransportInfo(TransportInfo transportInfo)181 NetworkCapabilities setTransportInfo(TransportInfo transportInfo); 182 183 @Direct setLinkDownstreamBandwidthKbps(int kbps)184 NetworkCapabilities setLinkDownstreamBandwidthKbps(int kbps); 185 186 @Direct setLinkUpstreamBandwidthKbps(int kbps)187 NetworkCapabilities setLinkUpstreamBandwidthKbps(int kbps); 188 } 189 } 190