OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/android/network_change_notifier_delegate_android.h" | 5 #include "net/android/network_change_notifier_delegate_android.h" |
6 | 6 |
7 #include "base/android/context_utils.h" | 7 #include "base/android/context_utils.h" |
8 #include "base/android/jni_array.h" | 8 #include "base/android/jni_array.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "jni/NetworkChangeNotifier_jni.h" | 10 #include "jni/NetworkChangeNotifier_jni.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 NetworkChangeNotifier::ConnectionSubtype ConvertConnectionSubtype( | 40 NetworkChangeNotifier::ConnectionSubtype ConvertConnectionSubtype( |
41 jint subtype) { | 41 jint subtype) { |
42 DCHECK(subtype >= 0 && subtype <= NetworkChangeNotifier::SUBTYPE_LAST); | 42 DCHECK(subtype >= 0 && subtype <= NetworkChangeNotifier::SUBTYPE_LAST); |
43 | 43 |
44 return static_cast<NetworkChangeNotifier::ConnectionSubtype>(subtype); | 44 return static_cast<NetworkChangeNotifier::ConnectionSubtype>(subtype); |
45 } | 45 } |
46 | 46 |
47 } // namespace | 47 } // namespace |
48 | 48 |
49 // static | 49 // static |
50 void NetworkChangeNotifierDelegateAndroid::JavaIntArrayToNetworkMap( | 50 void NetworkChangeNotifierDelegateAndroid::JavaLongArrayToNetworkMap( |
51 JNIEnv* env, | 51 JNIEnv* env, |
52 jintArray int_array, | 52 jlongArray long_array, |
53 NetworkMap* network_map) { | 53 NetworkMap* network_map) { |
54 std::vector<int> int_list; | 54 std::vector<int64_t> int64_list; |
55 base::android::JavaIntArrayToIntVector(env, int_array, &int_list); | 55 base::android::JavaLongArrayToInt64Vector(env, long_array, &int64_list); |
56 network_map->clear(); | 56 network_map->clear(); |
57 for (auto i = int_list.begin(); i != int_list.end(); ++i) { | 57 for (auto i = int64_list.begin(); i != int64_list.end(); ++i) { |
58 NetworkChangeNotifier::NetworkHandle network_handle = *i; | 58 NetworkChangeNotifier::NetworkHandle network_handle = *i; |
59 CHECK(++i != int_list.end()); | 59 CHECK(++i != int64_list.end()); |
60 (*network_map)[network_handle] = static_cast<ConnectionType>(*i); | 60 (*network_map)[network_handle] = static_cast<ConnectionType>(*i); |
61 } | 61 } |
62 } | 62 } |
63 | 63 |
64 jdouble GetMaxBandwidthForConnectionSubtype(JNIEnv* env, | 64 jdouble GetMaxBandwidthForConnectionSubtype(JNIEnv* env, |
65 const JavaParamRef<jclass>& caller, | 65 const JavaParamRef<jclass>& caller, |
66 jint subtype) { | 66 jint subtype) { |
67 return NetworkChangeNotifierAndroid::GetMaxBandwidthForConnectionSubtype( | 67 return NetworkChangeNotifierAndroid::GetMaxBandwidthForConnectionSubtype( |
68 ConvertConnectionSubtype(subtype)); | 68 ConvertConnectionSubtype(subtype)); |
69 } | 69 } |
(...skipping 10 matching lines...) Expand all Loading... |
80 SetCurrentConnectionType( | 80 SetCurrentConnectionType( |
81 ConvertConnectionType( | 81 ConvertConnectionType( |
82 Java_NetworkChangeNotifier_getCurrentConnectionType( | 82 Java_NetworkChangeNotifier_getCurrentConnectionType( |
83 env, java_network_change_notifier_.obj()))); | 83 env, java_network_change_notifier_.obj()))); |
84 SetCurrentMaxBandwidth( | 84 SetCurrentMaxBandwidth( |
85 Java_NetworkChangeNotifier_getCurrentMaxBandwidthInMbps( | 85 Java_NetworkChangeNotifier_getCurrentMaxBandwidthInMbps( |
86 env, java_network_change_notifier_.obj())); | 86 env, java_network_change_notifier_.obj())); |
87 SetCurrentDefaultNetwork(Java_NetworkChangeNotifier_getCurrentDefaultNetId( | 87 SetCurrentDefaultNetwork(Java_NetworkChangeNotifier_getCurrentDefaultNetId( |
88 env, java_network_change_notifier_.obj())); | 88 env, java_network_change_notifier_.obj())); |
89 NetworkMap network_map; | 89 NetworkMap network_map; |
90 ScopedJavaLocalRef<jintArray> networks_and_types = | 90 ScopedJavaLocalRef<jlongArray> networks_and_types = |
91 Java_NetworkChangeNotifier_getCurrentNetworksAndTypes( | 91 Java_NetworkChangeNotifier_getCurrentNetworksAndTypes( |
92 env, java_network_change_notifier_.obj()); | 92 env, java_network_change_notifier_.obj()); |
93 JavaIntArrayToNetworkMap(env, networks_and_types.obj(), &network_map); | 93 JavaLongArrayToNetworkMap(env, networks_and_types.obj(), &network_map); |
94 SetCurrentNetworksAndTypes(network_map); | 94 SetCurrentNetworksAndTypes(network_map); |
95 } | 95 } |
96 | 96 |
97 NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() { | 97 NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() { |
98 DCHECK(thread_checker_.CalledOnValidThread()); | 98 DCHECK(thread_checker_.CalledOnValidThread()); |
99 observers_->AssertEmpty(); | 99 observers_->AssertEmpty(); |
100 JNIEnv* env = base::android::AttachCurrentThread(); | 100 JNIEnv* env = base::android::AttachCurrentThread(); |
101 Java_NetworkChangeNotifier_removeNativeObserver( | 101 Java_NetworkChangeNotifier_removeNativeObserver( |
102 env, java_network_change_notifier_.obj(), | 102 env, java_network_change_notifier_.obj(), |
103 reinterpret_cast<intptr_t>(this)); | 103 reinterpret_cast<intptr_t>(this)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 network_list->clear(); | 148 network_list->clear(); |
149 base::AutoLock auto_lock(connection_lock_); | 149 base::AutoLock auto_lock(connection_lock_); |
150 for (auto i : network_map_) | 150 for (auto i : network_map_) |
151 network_list->push_back(i.first); | 151 network_list->push_back(i.first); |
152 } | 152 } |
153 | 153 |
154 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged( | 154 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged( |
155 JNIEnv* env, | 155 JNIEnv* env, |
156 const JavaParamRef<jobject>& obj, | 156 const JavaParamRef<jobject>& obj, |
157 jint new_connection_type, | 157 jint new_connection_type, |
158 jint default_netid) { | 158 jlong default_netid) { |
159 DCHECK(thread_checker_.CalledOnValidThread()); | 159 DCHECK(thread_checker_.CalledOnValidThread()); |
160 const ConnectionType actual_connection_type = ConvertConnectionType( | 160 const ConnectionType actual_connection_type = ConvertConnectionType( |
161 new_connection_type); | 161 new_connection_type); |
162 SetCurrentConnectionType(actual_connection_type); | 162 SetCurrentConnectionType(actual_connection_type); |
163 NetworkHandle default_network = default_netid; | 163 NetworkHandle default_network = default_netid; |
164 if (default_network != GetCurrentDefaultNetwork()) { | 164 if (default_network != GetCurrentDefaultNetwork()) { |
165 SetCurrentDefaultNetwork(default_network); | 165 SetCurrentDefaultNetwork(default_network); |
166 bool default_exists; | 166 bool default_exists; |
167 { | 167 { |
168 base::AutoLock auto_lock(connection_lock_); | 168 base::AutoLock auto_lock(connection_lock_); |
(...skipping 28 matching lines...) Expand all Loading... |
197 DCHECK(thread_checker_.CalledOnValidThread()); | 197 DCHECK(thread_checker_.CalledOnValidThread()); |
198 | 198 |
199 SetCurrentMaxBandwidth(new_max_bandwidth); | 199 SetCurrentMaxBandwidth(new_max_bandwidth); |
200 observers_->Notify(FROM_HERE, &Observer::OnMaxBandwidthChanged, | 200 observers_->Notify(FROM_HERE, &Observer::OnMaxBandwidthChanged, |
201 new_max_bandwidth, GetCurrentConnectionType()); | 201 new_max_bandwidth, GetCurrentConnectionType()); |
202 } | 202 } |
203 | 203 |
204 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkConnect( | 204 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkConnect( |
205 JNIEnv* env, | 205 JNIEnv* env, |
206 const JavaParamRef<jobject>& obj, | 206 const JavaParamRef<jobject>& obj, |
207 jint net_id, | 207 jlong net_id, |
208 jint connection_type) { | 208 jint connection_type) { |
209 DCHECK(thread_checker_.CalledOnValidThread()); | 209 DCHECK(thread_checker_.CalledOnValidThread()); |
210 NetworkHandle network = net_id; | 210 NetworkHandle network = net_id; |
211 bool already_exists; | 211 bool already_exists; |
212 { | 212 { |
213 base::AutoLock auto_lock(connection_lock_); | 213 base::AutoLock auto_lock(connection_lock_); |
214 already_exists = network_map_.find(network) != network_map_.end(); | 214 already_exists = network_map_.find(network) != network_map_.end(); |
215 network_map_[network] = static_cast<ConnectionType>(connection_type); | 215 network_map_[network] = static_cast<ConnectionType>(connection_type); |
216 } | 216 } |
217 // Android Lollipop would send many duplicate notifications. | 217 // Android Lollipop would send many duplicate notifications. |
218 // This was later fixed in Android Marshmallow. | 218 // This was later fixed in Android Marshmallow. |
219 // Deduplicate them here by avoiding sending duplicate notifications. | 219 // Deduplicate them here by avoiding sending duplicate notifications. |
220 if (!already_exists) { | 220 if (!already_exists) { |
221 observers_->Notify(FROM_HERE, &Observer::OnNetworkConnected, network); | 221 observers_->Notify(FROM_HERE, &Observer::OnNetworkConnected, network); |
222 if (network == GetCurrentDefaultNetwork()) { | 222 if (network == GetCurrentDefaultNetwork()) { |
223 observers_->Notify(FROM_HERE, &Observer::OnNetworkMadeDefault, network); | 223 observers_->Notify(FROM_HERE, &Observer::OnNetworkMadeDefault, network); |
224 } | 224 } |
225 } | 225 } |
226 } | 226 } |
227 | 227 |
228 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkSoonToDisconnect( | 228 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkSoonToDisconnect( |
229 JNIEnv* env, | 229 JNIEnv* env, |
230 const JavaParamRef<jobject>& obj, | 230 const JavaParamRef<jobject>& obj, |
231 jint net_id) { | 231 jlong net_id) { |
232 DCHECK(thread_checker_.CalledOnValidThread()); | 232 DCHECK(thread_checker_.CalledOnValidThread()); |
233 NetworkHandle network = net_id; | 233 NetworkHandle network = net_id; |
234 { | 234 { |
235 base::AutoLock auto_lock(connection_lock_); | 235 base::AutoLock auto_lock(connection_lock_); |
236 if (network_map_.find(network) == network_map_.end()) | 236 if (network_map_.find(network) == network_map_.end()) |
237 return; | 237 return; |
238 } | 238 } |
239 observers_->Notify(FROM_HERE, &Observer::OnNetworkSoonToDisconnect, network); | 239 observers_->Notify(FROM_HERE, &Observer::OnNetworkSoonToDisconnect, network); |
240 } | 240 } |
241 | 241 |
242 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkDisconnect( | 242 void NetworkChangeNotifierDelegateAndroid::NotifyOfNetworkDisconnect( |
243 JNIEnv* env, | 243 JNIEnv* env, |
244 const JavaParamRef<jobject>& obj, | 244 const JavaParamRef<jobject>& obj, |
245 jint net_id) { | 245 jlong net_id) { |
246 DCHECK(thread_checker_.CalledOnValidThread()); | 246 DCHECK(thread_checker_.CalledOnValidThread()); |
247 NetworkHandle network = net_id; | 247 NetworkHandle network = net_id; |
248 { | 248 { |
249 base::AutoLock auto_lock(connection_lock_); | 249 base::AutoLock auto_lock(connection_lock_); |
250 if (network == default_network_) | 250 if (network == default_network_) |
251 default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle; | 251 default_network_ = NetworkChangeNotifier::kInvalidNetworkHandle; |
252 if (network_map_.erase(network) == 0) | 252 if (network_map_.erase(network) == 0) |
253 return; | 253 return; |
254 } | 254 } |
255 observers_->Notify(FROM_HERE, &Observer::OnNetworkDisconnected, network); | 255 observers_->Notify(FROM_HERE, &Observer::OnNetworkDisconnected, network); |
256 } | 256 } |
257 | 257 |
258 void NetworkChangeNotifierDelegateAndroid::NotifyPurgeActiveNetworkList( | 258 void NetworkChangeNotifierDelegateAndroid::NotifyPurgeActiveNetworkList( |
259 JNIEnv* env, | 259 JNIEnv* env, |
260 const JavaParamRef<jobject>& obj, | 260 const JavaParamRef<jobject>& obj, |
261 const JavaParamRef<jintArray>& active_networks) { | 261 const JavaParamRef<jlongArray>& active_networks) { |
262 DCHECK(thread_checker_.CalledOnValidThread()); | 262 DCHECK(thread_checker_.CalledOnValidThread()); |
263 NetworkList active_network_list; | 263 NetworkList active_network_list; |
264 base::android::JavaIntArrayToIntVector(env, active_networks, | 264 base::android::JavaLongArrayToInt64Vector(env, active_networks, |
265 &active_network_list); | 265 &active_network_list); |
266 NetworkList disconnected_networks; | 266 NetworkList disconnected_networks; |
267 { | 267 { |
268 base::AutoLock auto_lock(connection_lock_); | 268 base::AutoLock auto_lock(connection_lock_); |
269 for (auto i : network_map_) { | 269 for (auto i : network_map_) { |
270 bool found = false; | 270 bool found = false; |
271 for (auto j : active_network_list) { | 271 for (auto j : active_network_list) { |
272 if (j == i.first) { | 272 if (j == i.first) { |
273 found = true; | 273 found = true; |
274 break; | 274 break; |
275 } | 275 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 void NetworkChangeNotifierDelegateAndroid::FakeNetworkDisconnected( | 348 void NetworkChangeNotifierDelegateAndroid::FakeNetworkDisconnected( |
349 NetworkChangeNotifier::NetworkHandle network) { | 349 NetworkChangeNotifier::NetworkHandle network) { |
350 JNIEnv* env = base::android::AttachCurrentThread(); | 350 JNIEnv* env = base::android::AttachCurrentThread(); |
351 Java_NetworkChangeNotifier_fakeNetworkDisconnected(env, network); | 351 Java_NetworkChangeNotifier_fakeNetworkDisconnected(env, network); |
352 } | 352 } |
353 | 353 |
354 void NetworkChangeNotifierDelegateAndroid::FakePurgeActiveNetworkList( | 354 void NetworkChangeNotifierDelegateAndroid::FakePurgeActiveNetworkList( |
355 NetworkChangeNotifier::NetworkList networks) { | 355 NetworkChangeNotifier::NetworkList networks) { |
356 JNIEnv* env = base::android::AttachCurrentThread(); | 356 JNIEnv* env = base::android::AttachCurrentThread(); |
357 Java_NetworkChangeNotifier_fakePurgeActiveNetworkList( | 357 Java_NetworkChangeNotifier_fakePurgeActiveNetworkList( |
358 env, base::android::ToJavaIntArray(env, networks).obj()); | 358 env, base::android::ToJavaLongArray(env, networks).obj()); |
359 } | 359 } |
360 | 360 |
361 void NetworkChangeNotifierDelegateAndroid::FakeDefaultNetwork( | 361 void NetworkChangeNotifierDelegateAndroid::FakeDefaultNetwork( |
362 NetworkChangeNotifier::NetworkHandle network, | 362 NetworkChangeNotifier::NetworkHandle network, |
363 ConnectionType type) { | 363 ConnectionType type) { |
364 JNIEnv* env = base::android::AttachCurrentThread(); | 364 JNIEnv* env = base::android::AttachCurrentThread(); |
365 Java_NetworkChangeNotifier_fakeDefaultNetwork(env, network, type); | 365 Java_NetworkChangeNotifier_fakeDefaultNetwork(env, network, type); |
366 } | 366 } |
367 | 367 |
368 void NetworkChangeNotifierDelegateAndroid::FakeMaxBandwidthChanged( | 368 void NetworkChangeNotifierDelegateAndroid::FakeMaxBandwidthChanged( |
369 double max_bandwidth_mbps) { | 369 double max_bandwidth_mbps) { |
370 JNIEnv* env = base::android::AttachCurrentThread(); | 370 JNIEnv* env = base::android::AttachCurrentThread(); |
371 Java_NetworkChangeNotifier_fakeMaxBandwidthChanged(env, max_bandwidth_mbps); | 371 Java_NetworkChangeNotifier_fakeMaxBandwidthChanged(env, max_bandwidth_mbps); |
372 } | 372 } |
373 | 373 |
374 } // namespace net | 374 } // namespace net |
OLD | NEW |