1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/android/network_change_notifier_delegate_android.h"
6
7 #include "base/android/build_info.h"
8 #include "base/android/jni_array.h"
9 #include "base/check.h"
10 #include "base/notreached.h"
11 #include "net/android/network_change_notifier_android.h"
12 #include "net/base/features.h"
13
14 // Must come after all headers that specialize FromJniType() / ToJniType().
15 #include "net/net_jni_headers/NetworkActiveNotifier_jni.h"
16 #include "net/net_jni_headers/NetworkChangeNotifier_jni.h"
17
18 using base::android::JavaParamRef;
19 using base::android::JavaRef;
20 using base::android::ScopedJavaLocalRef;
21
22 namespace net {
23
24 namespace {
25
26 // Converts a Java side connection type (integer) to
27 // the native side NetworkChangeNotifier::ConnectionType.
ConvertConnectionType(jint connection_type)28 NetworkChangeNotifier::ConnectionType ConvertConnectionType(
29 jint connection_type) {
30 switch (connection_type) {
31 case NetworkChangeNotifier::CONNECTION_UNKNOWN:
32 case NetworkChangeNotifier::CONNECTION_ETHERNET:
33 case NetworkChangeNotifier::CONNECTION_WIFI:
34 case NetworkChangeNotifier::CONNECTION_2G:
35 case NetworkChangeNotifier::CONNECTION_3G:
36 case NetworkChangeNotifier::CONNECTION_4G:
37 case NetworkChangeNotifier::CONNECTION_5G:
38 case NetworkChangeNotifier::CONNECTION_NONE:
39 case NetworkChangeNotifier::CONNECTION_BLUETOOTH:
40 break;
41 default:
42 NOTREACHED() << "Unknown connection type received: " << connection_type;
43 }
44 return static_cast<NetworkChangeNotifier::ConnectionType>(connection_type);
45 }
46
47 // Converts a Java side connection cost (integer) to
48 // the native side NetworkChangeNotifier::ConnectionCost.
ConvertConnectionCost(jint connection_cost)49 NetworkChangeNotifier::ConnectionCost ConvertConnectionCost(
50 jint connection_cost) {
51 switch (connection_cost) {
52 case NetworkChangeNotifier::CONNECTION_COST_UNKNOWN:
53 case NetworkChangeNotifier::CONNECTION_COST_UNMETERED:
54 case NetworkChangeNotifier::CONNECTION_COST_METERED:
55 break;
56 default:
57 NOTREACHED() << "Unknown connection cost received: " << connection_cost;
58 }
59 return static_cast<NetworkChangeNotifier::ConnectionCost>(connection_cost);
60 }
61
62 // Converts a Java side connection type (integer) to
63 // the native side NetworkChangeNotifier::ConnectionType.
ConvertConnectionSubtype(jint subtype)64 NetworkChangeNotifier::ConnectionSubtype ConvertConnectionSubtype(
65 jint subtype) {
66 DCHECK(subtype >= 0 && subtype <= NetworkChangeNotifier::SUBTYPE_LAST);
67
68 return static_cast<NetworkChangeNotifier::ConnectionSubtype>(subtype);
69 }
70
71 } // namespace
72
73 // static
JavaLongArrayToNetworkMap(JNIEnv * env,const JavaRef<jlongArray> & long_array,NetworkMap * network_map)74 void NetworkChangeNotifierDelegateAndroid::JavaLongArrayToNetworkMap(
75 JNIEnv* env,
76 const JavaRef<jlongArray>& long_array,
77 NetworkMap* network_map) {
78 std::vector<int64_t> int64_list;
79 base::android::JavaLongArrayToInt64Vector(env, long_array, &int64_list);
80 network_map->clear();
81 for (auto i = int64_list.begin(); i != int64_list.end(); ++i) {
82 handles::NetworkHandle network_handle = *i;
83 CHECK(++i != int64_list.end());
84 (*network_map)[network_handle] = static_cast<ConnectionType>(*i);
85 }
86 }
87
NetworkChangeNotifierDelegateAndroid()88 NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid()
89 : java_network_change_notifier_(Java_NetworkChangeNotifier_init(
90 base::android::AttachCurrentThread())),
91 register_network_callback_failed_(
92 Java_NetworkChangeNotifier_registerNetworkCallbackFailed(
93 base::android::AttachCurrentThread(),
94 java_network_change_notifier_)) {
95 JNIEnv* env = base::android::AttachCurrentThread();
96 Java_NetworkChangeNotifier_addNativeObserver(
97 env, java_network_change_notifier_, reinterpret_cast<intptr_t>(this));
98 SetCurrentConnectionType(
99 ConvertConnectionType(Java_NetworkChangeNotifier_getCurrentConnectionType(
100 env, java_network_change_notifier_)));
101 SetCurrentConnectionCost(
102 ConvertConnectionCost(Java_NetworkChangeNotifier_getCurrentConnectionCost(
103 env, java_network_change_notifier_)));
104 auto connection_subtype = ConvertConnectionSubtype(
105 Java_NetworkChangeNotifier_getCurrentConnectionSubtype(
106 env, java_network_change_notifier_));
107 SetCurrentConnectionSubtype(connection_subtype);
108 SetCurrentMaxBandwidth(
109 NetworkChangeNotifierAndroid::GetMaxBandwidthMbpsForConnectionSubtype(
110 connection_subtype));
111 SetCurrentDefaultNetwork(Java_NetworkChangeNotifier_getCurrentDefaultNetId(
112 env, java_network_change_notifier_));
113 NetworkMap network_map;
114 ScopedJavaLocalRef<jlongArray> networks_and_types =
115 Java_NetworkChangeNotifier_getCurrentNetworksAndTypes(
116 env, java_network_change_notifier_);
117 JavaLongArrayToNetworkMap(env, networks_and_types, &network_map);
118 SetCurrentNetworksAndTypes(network_map);
119 java_network_active_notifier_ = Java_NetworkActiveNotifier_build(
120 base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this));
121 }
122
~NetworkChangeNotifierDelegateAndroid()123 NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() {
124 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
125 DCHECK_EQ(default_network_active_observers_, 0);
126 {
127 base::AutoLock auto_lock(observer_lock_);
128 DCHECK(!observer_);
129 }
130 JNIEnv* env = base::android::AttachCurrentThread();
131 Java_NetworkChangeNotifier_removeNativeObserver(
132 env, java_network_change_notifier_, reinterpret_cast<intptr_t>(this));
133 }
134
135 NetworkChangeNotifier::ConnectionType
GetCurrentConnectionType() const136 NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType() const {
137 base::AutoLock auto_lock(connection_lock_);
138 return connection_type_;
139 }
140
141 NetworkChangeNotifier::ConnectionCost
GetCurrentConnectionCost()142 NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionCost() {
143 base::AutoLock auto_lock(connection_lock_);
144 return connection_cost_;
145 }
146
147 NetworkChangeNotifier::ConnectionSubtype
GetCurrentConnectionSubtype() const148 NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionSubtype() const {
149 if (base::FeatureList::IsEnabled(net::features::kStoreConnectionSubtype)) {
150 base::AutoLock auto_lock(connection_lock_);
151 return connection_subtype_;
152 }
153 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
154 return ConvertConnectionSubtype(
155 Java_NetworkChangeNotifier_getCurrentConnectionSubtype(
156 base::android::AttachCurrentThread(), java_network_change_notifier_));
157 }
158
159 void NetworkChangeNotifierDelegateAndroid::
GetCurrentMaxBandwidthAndConnectionType(double * max_bandwidth_mbps,ConnectionType * connection_type) const160 GetCurrentMaxBandwidthAndConnectionType(
161 double* max_bandwidth_mbps,
162 ConnectionType* connection_type) const {
163 base::AutoLock auto_lock(connection_lock_);
164 *connection_type = connection_type_;
165 *max_bandwidth_mbps = connection_max_bandwidth_;
166 }
167
168 NetworkChangeNotifier::ConnectionType
GetNetworkConnectionType(handles::NetworkHandle network) const169 NetworkChangeNotifierDelegateAndroid::GetNetworkConnectionType(
170 handles::NetworkHandle network) const {
171 base::AutoLock auto_lock(connection_lock_);
172 auto network_entry = network_map_.find(network);
173 if (network_entry == network_map_.end())
174 return ConnectionType::CONNECTION_UNKNOWN;
175 return network_entry->second;
176 }
177
178 handles::NetworkHandle
GetCurrentDefaultNetwork() const179 NetworkChangeNotifierDelegateAndroid::GetCurrentDefaultNetwork() const {
180 base::AutoLock auto_lock(connection_lock_);
181 return default_network_;
182 }
183
GetCurrentlyConnectedNetworks(NetworkList * network_list) const184 void NetworkChangeNotifierDelegateAndroid::GetCurrentlyConnectedNetworks(
185 NetworkList* network_list) const {
186 network_list->clear();
187 base::AutoLock auto_lock(connection_lock_);
188 for (auto i : network_map_)
189 network_list->push_back(i.first);
190 }
191
IsDefaultNetworkActive()192 bool NetworkChangeNotifierDelegateAndroid::IsDefaultNetworkActive() {
193 JNIEnv* env = base::android::AttachCurrentThread();
194 return Java_NetworkActiveNotifier_isDefaultNetworkActive(
195 env, java_network_active_notifier_);
196 }
197
NotifyConnectionCostChanged(JNIEnv * env,const JavaParamRef<jobject> & obj,jint new_connection_cost)198 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionCostChanged(
199 JNIEnv* env,
200 const JavaParamRef<jobject>& obj,
201 jint new_connection_cost) {
202 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
203 const ConnectionCost actual_connection_cost =
204 ConvertConnectionCost(new_connection_cost);
205 SetCurrentConnectionCost(actual_connection_cost);
206 base::AutoLock auto_lock(observer_lock_);
207 if (observer_)
208 observer_->OnConnectionCostChanged();
209 }
210
NotifyConnectionTypeChanged(JNIEnv * env,const JavaParamRef<jobject> & obj,jint new_connection_type,jlong default_netid)211 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged(
212 JNIEnv* env,
213 const JavaParamRef<jobject>& obj,
214 jint new_connection_type,
215 jlong default_netid) {
216 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
217 const ConnectionType actual_connection_type = ConvertConnectionType(
218 new_connection_type);
219 SetCurrentConnectionType(actual_connection_type);
220 handles::NetworkHandle default_network = default_netid;
221 if (default_network != GetCurrentDefaultNetwork()) {
222 SetCurrentDefaultNetwork(default_network);
223 bool default_exists;
224 {
225 base::AutoLock auto_lock(connection_lock_);
226 // |default_network| may be an invalid value (i.e. -1) in cases where
227 // the device is disconnected or when run on Android versions prior to L,
228 // in which case |default_exists| will correctly be false and no
229 // OnNetworkMadeDefault notification will be sent.
230 default_exists = network_map_.find(default_network) != network_map_.end();
231 }
232 // Android Lollipop had race conditions where CONNECTIVITY_ACTION intents
233 // were sent out before the network was actually made the default.
234 // Delay sending the OnNetworkMadeDefault notification until we are
235 // actually notified that the network connected in NotifyOfNetworkConnect.
236 if (default_exists) {
237 base::AutoLock auto_lock(observer_lock_);
238 if (observer_)
239 observer_->OnNetworkMadeDefault(default_network);
240 }
241 }
242
243 base::AutoLock auto_lock(observer_lock_);
244 if (observer_)
245 observer_->OnConnectionTypeChanged();
246 }
247
GetConnectionType(JNIEnv *,jobject) const248 jint NetworkChangeNotifierDelegateAndroid::GetConnectionType(JNIEnv*,
249 jobject) const {
250 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
251 return GetCurrentConnectionType();
252 }
253
GetConnectionCost(JNIEnv *,jobject)254 jint NetworkChangeNotifierDelegateAndroid::GetConnectionCost(JNIEnv*, jobject) {
255 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
256 return GetCurrentConnectionCost();
257 }
258
NotifyConnectionSubtypeChanged(JNIEnv * env,const JavaParamRef<jobject> & obj,jint subtype)259 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionSubtypeChanged(
260 JNIEnv* env,
261 const JavaParamRef<jobject>& obj,
262 jint subtype) {
263 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
264 double new_max_bandwidth =
265 NetworkChangeNotifierAndroid::GetMaxBandwidthMbpsForConnectionSubtype(
266 ConvertConnectionSubtype(subtype));
267 SetCurrentConnectionSubtype(ConvertConnectionSubtype(subtype));
268 SetCurrentMaxBandwidth(new_max_bandwidth);
269 const ConnectionType connection_type = GetCurrentConnectionType();
270 base::AutoLock auto_lock(observer_lock_);
271 if (observer_) {
272 observer_->OnMaxBandwidthChanged(new_max_bandwidth, connection_type);
273 }
274 }
275
NotifyOfNetworkConnect(JNIEnv * env,const JavaParamRef<jobject> & obj,jlong net_id,jint connection_type)276 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkConnect(
277 JNIEnv* env,
278 const JavaParamRef<jobject>& obj,
279 jlong net_id,
280 jint connection_type) {
281 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
282 handles::NetworkHandle network = net_id;
283 bool already_exists;
284 bool is_default_network;
285 {
286 base::AutoLock auto_lock(connection_lock_);
287 already_exists = network_map_.find(network) != network_map_.end();
288 network_map_[network] = static_cast<ConnectionType>(connection_type);
289 is_default_network = (network == default_network_);
290 }
291 // Android Lollipop would send many duplicate notifications.
292 // This was later fixed in Android Marshmallow.
293 // Deduplicate them here by avoiding sending duplicate notifications.
294 if (!already_exists) {
295 base::AutoLock auto_lock(observer_lock_);
296 if (observer_) {
297 observer_->OnNetworkConnected(network);
298 if (is_default_network)
299 observer_->OnNetworkMadeDefault(network);
300 }
301 }
302 }
303
NotifyOfNetworkSoonToDisconnect(JNIEnv * env,const JavaParamRef<jobject> & obj,jlong net_id)304 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkSoonToDisconnect(
305 JNIEnv* env,
306 const JavaParamRef<jobject>& obj,
307 jlong net_id) {
308 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
309 handles::NetworkHandle network = net_id;
310 {
311 base::AutoLock auto_lock(connection_lock_);
312 if (network_map_.find(network) == network_map_.end())
313 return;
314 }
315 base::AutoLock auto_lock(observer_lock_);
316 if (observer_)
317 observer_->OnNetworkSoonToDisconnect(network);
318 }
319
NotifyOfNetworkDisconnect(JNIEnv * env,const JavaParamRef<jobject> & obj,jlong net_id)320 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkDisconnect(
321 JNIEnv* env,
322 const JavaParamRef<jobject>& obj,
323 jlong net_id) {
324 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
325 handles::NetworkHandle network = net_id;
326 {
327 base::AutoLock auto_lock(connection_lock_);
328 if (network == default_network_)
329 default_network_ = handles::kInvalidNetworkHandle;
330 if (network_map_.erase(network) == 0)
331 return;
332 }
333 base::AutoLock auto_lock(observer_lock_);
334 if (observer_)
335 observer_->OnNetworkDisconnected(network);
336 }
337
NotifyPurgeActiveNetworkList(JNIEnv * env,const JavaParamRef<jobject> & obj,const JavaParamRef<jlongArray> & active_networks)338 void NetworkChangeNotifierDelegateAndroid::NotifyPurgeActiveNetworkList(
339 JNIEnv* env,
340 const JavaParamRef<jobject>& obj,
341 const JavaParamRef<jlongArray>& active_networks) {
342 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
343 NetworkList active_network_list;
344 base::android::JavaLongArrayToInt64Vector(env, active_networks,
345 &active_network_list);
346 NetworkList disconnected_networks;
347 {
348 base::AutoLock auto_lock(connection_lock_);
349 for (auto i : network_map_) {
350 bool found = false;
351 for (auto j : active_network_list) {
352 if (j == i.first) {
353 found = true;
354 break;
355 }
356 }
357 if (!found) {
358 disconnected_networks.push_back(i.first);
359 }
360 }
361 }
362 for (auto disconnected_network : disconnected_networks)
363 NotifyOfNetworkDisconnect(env, obj, disconnected_network);
364 }
365
NotifyOfDefaultNetworkActive(JNIEnv * env)366 void NetworkChangeNotifierDelegateAndroid::NotifyOfDefaultNetworkActive(
367 JNIEnv* env) {
368 base::AutoLock auto_lock(observer_lock_);
369 if (observer_)
370 observer_->OnDefaultNetworkActive();
371 }
372
RegisterObserver(Observer * observer)373 void NetworkChangeNotifierDelegateAndroid::RegisterObserver(
374 Observer* observer) {
375 base::AutoLock auto_lock(observer_lock_);
376 DCHECK(!observer_);
377 observer_ = observer;
378 }
379
UnregisterObserver(Observer * observer)380 void NetworkChangeNotifierDelegateAndroid::UnregisterObserver(
381 Observer* observer) {
382 base::AutoLock auto_lock(observer_lock_);
383 DCHECK_EQ(observer_, observer);
384 observer_ = nullptr;
385 }
386
DefaultNetworkActiveObserverAdded()387 void NetworkChangeNotifierDelegateAndroid::DefaultNetworkActiveObserverAdded() {
388 if (default_network_active_observers_.fetch_add(1) == 0)
389 EnableDefaultNetworkActiveNotifications();
390 }
391
392 void NetworkChangeNotifierDelegateAndroid::
DefaultNetworkActiveObserverRemoved()393 DefaultNetworkActiveObserverRemoved() {
394 if (default_network_active_observers_.fetch_sub(1) == 1)
395 DisableDefaultNetworkActiveNotifications();
396 }
397
398 void NetworkChangeNotifierDelegateAndroid::
EnableDefaultNetworkActiveNotifications()399 EnableDefaultNetworkActiveNotifications() {
400 JNIEnv* env = base::android::AttachCurrentThread();
401 Java_NetworkActiveNotifier_enableNotifications(env,
402 java_network_active_notifier_);
403 }
404
405 void NetworkChangeNotifierDelegateAndroid::
DisableDefaultNetworkActiveNotifications()406 DisableDefaultNetworkActiveNotifications() {
407 JNIEnv* env = base::android::AttachCurrentThread();
408 Java_NetworkActiveNotifier_disableNotifications(
409 env, java_network_active_notifier_);
410 }
411
SetCurrentConnectionType(ConnectionType new_connection_type)412 void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionType(
413 ConnectionType new_connection_type) {
414 base::AutoLock auto_lock(connection_lock_);
415 connection_type_ = new_connection_type;
416 }
417
SetCurrentConnectionSubtype(ConnectionSubtype new_connection_subtype)418 void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionSubtype(
419 ConnectionSubtype new_connection_subtype) {
420 base::AutoLock auto_lock(connection_lock_);
421 connection_subtype_ = new_connection_subtype;
422 }
423
SetCurrentConnectionCost(ConnectionCost new_connection_cost)424 void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionCost(
425 ConnectionCost new_connection_cost) {
426 base::AutoLock auto_lock(connection_lock_);
427 connection_cost_ = new_connection_cost;
428 }
429
SetCurrentMaxBandwidth(double max_bandwidth)430 void NetworkChangeNotifierDelegateAndroid::SetCurrentMaxBandwidth(
431 double max_bandwidth) {
432 base::AutoLock auto_lock(connection_lock_);
433 connection_max_bandwidth_ = max_bandwidth;
434 }
435
SetCurrentDefaultNetwork(handles::NetworkHandle default_network)436 void NetworkChangeNotifierDelegateAndroid::SetCurrentDefaultNetwork(
437 handles::NetworkHandle default_network) {
438 base::AutoLock auto_lock(connection_lock_);
439 default_network_ = default_network;
440 }
441
SetCurrentNetworksAndTypes(NetworkMap network_map)442 void NetworkChangeNotifierDelegateAndroid::SetCurrentNetworksAndTypes(
443 NetworkMap network_map) {
444 base::AutoLock auto_lock(connection_lock_);
445 network_map_ = network_map;
446 }
447
SetOnline()448 void NetworkChangeNotifierDelegateAndroid::SetOnline() {
449 JNIEnv* env = base::android::AttachCurrentThread();
450 Java_NetworkChangeNotifier_forceConnectivityState(env, true);
451 }
452
SetOffline()453 void NetworkChangeNotifierDelegateAndroid::SetOffline() {
454 JNIEnv* env = base::android::AttachCurrentThread();
455 Java_NetworkChangeNotifier_forceConnectivityState(env, false);
456 }
457
FakeNetworkConnected(handles::NetworkHandle network,ConnectionType type)458 void NetworkChangeNotifierDelegateAndroid::FakeNetworkConnected(
459 handles::NetworkHandle network,
460 ConnectionType type) {
461 JNIEnv* env = base::android::AttachCurrentThread();
462 Java_NetworkChangeNotifier_fakeNetworkConnected(env, network, type);
463 }
464
FakeNetworkSoonToBeDisconnected(handles::NetworkHandle network)465 void NetworkChangeNotifierDelegateAndroid::FakeNetworkSoonToBeDisconnected(
466 handles::NetworkHandle network) {
467 JNIEnv* env = base::android::AttachCurrentThread();
468 Java_NetworkChangeNotifier_fakeNetworkSoonToBeDisconnected(env, network);
469 }
470
FakeNetworkDisconnected(handles::NetworkHandle network)471 void NetworkChangeNotifierDelegateAndroid::FakeNetworkDisconnected(
472 handles::NetworkHandle network) {
473 JNIEnv* env = base::android::AttachCurrentThread();
474 Java_NetworkChangeNotifier_fakeNetworkDisconnected(env, network);
475 }
476
FakePurgeActiveNetworkList(NetworkChangeNotifier::NetworkList networks)477 void NetworkChangeNotifierDelegateAndroid::FakePurgeActiveNetworkList(
478 NetworkChangeNotifier::NetworkList networks) {
479 JNIEnv* env = base::android::AttachCurrentThread();
480 Java_NetworkChangeNotifier_fakePurgeActiveNetworkList(
481 env, base::android::ToJavaLongArray(env, networks));
482 }
483
FakeDefaultNetwork(handles::NetworkHandle network,ConnectionType type)484 void NetworkChangeNotifierDelegateAndroid::FakeDefaultNetwork(
485 handles::NetworkHandle network,
486 ConnectionType type) {
487 JNIEnv* env = base::android::AttachCurrentThread();
488 Java_NetworkChangeNotifier_fakeDefaultNetwork(env, network, type);
489 }
490
FakeConnectionCostChanged(ConnectionCost cost)491 void NetworkChangeNotifierDelegateAndroid::FakeConnectionCostChanged(
492 ConnectionCost cost) {
493 JNIEnv* env = base::android::AttachCurrentThread();
494 Java_NetworkChangeNotifier_fakeConnectionCostChanged(env, cost);
495 }
496
FakeConnectionSubtypeChanged(ConnectionSubtype subtype)497 void NetworkChangeNotifierDelegateAndroid::FakeConnectionSubtypeChanged(
498 ConnectionSubtype subtype) {
499 JNIEnv* env = base::android::AttachCurrentThread();
500 Java_NetworkChangeNotifier_fakeConnectionSubtypeChanged(env, subtype);
501 }
502
FakeDefaultNetworkActive()503 void NetworkChangeNotifierDelegateAndroid::FakeDefaultNetworkActive() {
504 JNIEnv* env = base::android::AttachCurrentThread();
505 Java_NetworkActiveNotifier_fakeDefaultNetworkActive(
506 env, java_network_active_notifier_);
507 }
508
509 void NetworkChangeNotifierDelegateAndroid::
EnableNetworkChangeNotifierAutoDetectForTest()510 EnableNetworkChangeNotifierAutoDetectForTest() {
511 JNIEnv* env = base::android::AttachCurrentThread();
512 Java_NetworkChangeNotifier_setAutoDetectConnectivityState(env, true);
513 }
514
515 } // namespace net
516