Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(413)

Side by Side Diff: net/android/network_change_notifier_delegate_android.cc

Issue 2160263002: Use supported Android network handles in Android M and newer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add test Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698