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