• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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