| 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 |