Skip to content

Commit 22a07c3

Browse files
authored
[mobile] Add a config to allow AndroidNetworkMonitor to use the new OnDefaultNetworkChangeEvent() API (envoyproxy#38659)
Commit Message: Add a config to allow AndroidNetworkMonitor to use the new OnDefaultNetworkChangeEvent() API Additional Description: Risk Level: low Testing: existing tests Docs Changes: n/a Release Notes: n/a Platform Specific Features: android only --------- Signed-off-by: Renjie Tang <[email protected]>
1 parent 78a8841 commit 22a07c3

File tree

11 files changed

+86
-25
lines changed

11 files changed

+86
-25
lines changed

mobile/library/java/io/envoyproxy/envoymobile/engine/AndroidEngineImpl.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ public class AndroidEngineImpl implements EnvoyEngine {
2323
*/
2424
public AndroidEngineImpl(Context context, EnvoyOnEngineRunning runningCallback,
2525
EnvoyLogger logger, EnvoyEventTracker eventTracker,
26-
Boolean enableProxying) {
26+
Boolean enableProxying, Boolean useNetworkChangeEvent) {
2727
this.context = context;
2828
this.envoyEngine = new EnvoyEngineImpl(runningCallback, logger, eventTracker);
2929
if (ContextUtils.getApplicationContext() == null) {
3030
ContextUtils.initApplicationContext(context.getApplicationContext());
3131
}
32-
AndroidNetworkMonitor.load(context, envoyEngine);
32+
AndroidNetworkMonitor.load(context, envoyEngine, useNetworkChangeEvent);
3333
if (enableProxying) {
3434
AndroidProxyMonitor.load(context, envoyEngine);
3535
}
@@ -89,6 +89,11 @@ public void onDefaultNetworkChanged(int network) {
8989
envoyEngine.onDefaultNetworkChanged(network);
9090
}
9191

92+
@Override
93+
public void onDefaultNetworkChangeEvent(int network) {
94+
envoyEngine.onDefaultNetworkChangeEvent(network);
95+
}
96+
9297
@Override
9398
public void onDefaultNetworkUnavailable() {
9499
envoyEngine.onDefaultNetworkUnavailable();

mobile/library/java/io/envoyproxy/envoymobile/engine/AndroidNetworkMonitor.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class AndroidNetworkMonitor {
4040
private static volatile AndroidNetworkMonitor instance = null;
4141
private ConnectivityManager connectivityManager;
4242

43-
public static void load(Context context, EnvoyEngine envoyEngine) {
43+
public static void load(Context context, EnvoyEngine envoyEngine, boolean useNetworkChangeEvent) {
4444
if (instance != null) {
4545
return;
4646
}
@@ -49,7 +49,7 @@ public static void load(Context context, EnvoyEngine envoyEngine) {
4949
if (instance != null) {
5050
return;
5151
}
52-
instance = new AndroidNetworkMonitor(context, envoyEngine);
52+
instance = new AndroidNetworkMonitor(context, envoyEngine, useNetworkChangeEvent);
5353
}
5454
}
5555

@@ -72,11 +72,14 @@ static class DefaultNetworkCallback extends NetworkCallback {
7272

7373
private final EnvoyEngine envoyEngine;
7474
private final ConnectivityManager connectivityManager;
75+
private final boolean useNetworkChangeEvent;
7576
@VisibleForTesting List<Integer> previousTransportTypes = new ArrayList<>();
7677

77-
DefaultNetworkCallback(EnvoyEngine envoyEngine, ConnectivityManager connectivityManager) {
78+
DefaultNetworkCallback(EnvoyEngine envoyEngine, ConnectivityManager connectivityManager,
79+
boolean useNetworkChangeEvent) {
7880
this.envoyEngine = envoyEngine;
7981
this.connectivityManager = connectivityManager;
82+
this.useNetworkChangeEvent = useNetworkChangeEvent;
8083
}
8184

8285
@Override
@@ -91,7 +94,7 @@ public void onCapabilitiesChanged(@NonNull Network network,
9194
// `onCapabilities` is guaranteed to be called immediately after `onAvailable`
9295
// starting with Android O, so this logic may not work on older Android versions.
9396
// https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback#onCapabilitiesChanged(android.net.Network,%20android.net.NetworkCapabilities)
94-
if (previousTransportTypes.isEmpty()) {
97+
if (previousTransportTypes.isEmpty() || useNetworkChangeEvent) {
9598
// The network was lost previously, see `onLost`.
9699
onDefaultNetworkChanged(network, networkCapabilities);
97100
} else {
@@ -170,13 +173,18 @@ private void onDefaultNetworkChanged(Network network, NetworkCapabilities networ
170173
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
171174
networkType |= EnvoyNetworkType.GENERIC.getValue();
172175
}
173-
envoyEngine.onDefaultNetworkChanged(networkType);
176+
if (useNetworkChangeEvent) {
177+
envoyEngine.onDefaultNetworkChangeEvent(networkType);
178+
} else {
179+
envoyEngine.onDefaultNetworkChanged(networkType);
180+
}
174181
}
175182
previousTransportTypes = getTransportTypes(networkCapabilities);
176183
}
177184
}
178185

179-
private AndroidNetworkMonitor(Context context, EnvoyEngine envoyEngine) {
186+
private AndroidNetworkMonitor(Context context, EnvoyEngine envoyEngine,
187+
boolean useNetworkChangeEvent) {
180188
int permission =
181189
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_NETWORK_STATE);
182190
if (permission == PackageManager.PERMISSION_DENIED) {
@@ -191,7 +199,7 @@ private AndroidNetworkMonitor(Context context, EnvoyEngine envoyEngine) {
191199
connectivityManager =
192200
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
193201
connectivityManager.registerDefaultNetworkCallback(
194-
new DefaultNetworkCallback(envoyEngine, connectivityManager));
202+
new DefaultNetworkCallback(envoyEngine, connectivityManager, useNetworkChangeEvent));
195203
}
196204

197205
/** @returns The singleton instance of {@link AndroidNetworkMonitor}. */

mobile/library/java/io/envoyproxy/envoymobile/engine/EnvoyEngine.java

+6
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ public interface EnvoyEngine {
7171
*/
7272
void onDefaultNetworkChanged(int network);
7373

74+
/**
75+
* A more modern callback into the Envoy Engine when the default network type was changed.
76+
* TODO(renjietang): Deprecate onDefaultNetworkChanged
77+
*/
78+
void onDefaultNetworkChangeEvent(int network);
79+
7480
/**
7581
* A callback into the Envoy Engine when the default network is unavailable.
7682
*/

mobile/library/java/io/envoyproxy/envoymobile/engine/EnvoyEngineImpl.java

+6
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ public void onDefaultNetworkChanged(int network) {
145145
JniLibrary.onDefaultNetworkChanged(engineHandle, network);
146146
}
147147

148+
@Override
149+
public void onDefaultNetworkChangeEvent(int network) {
150+
checkIsTerminated();
151+
JniLibrary.onDefaultNetworkChangeEvent(engineHandle, network);
152+
}
153+
148154
@Override
149155
public void onDefaultNetworkUnavailable() {
150156
checkIsTerminated();

mobile/library/java/io/envoyproxy/envoymobile/engine/JniLibrary.java

+5
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,11 @@ protected static native int registerStringAccessor(String accessorName,
234234
*/
235235
protected static native void onDefaultNetworkChanged(long engine, int networkType);
236236

237+
/**
238+
* A more modern callback into the Envoy Engine when the default network was changed.
239+
*/
240+
protected static native void onDefaultNetworkChangeEvent(long engine, int networkType);
241+
237242
/**
238243
* A callback into the Envoy Engine when the default network is unavailable.
239244
*/

mobile/library/java/org/chromium/net/impl/NativeCronvoyEngineBuilderImpl.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class NativeCronvoyEngineBuilderImpl extends CronvoyEngineBuilderImpl {
7070
private final boolean mEnablePlatformCertificatesValidation = true;
7171
private String mUpstreamTlsSni = "";
7272
private int mH3ConnectionKeepaliveInitialIntervalMilliseconds = 0;
73+
private boolean mUseNetworkChangeEvent = false;
7374

7475
private final Map<String, Boolean> mRuntimeGuards = new HashMap<>();
7576

@@ -135,6 +136,16 @@ public NativeCronvoyEngineBuilderImpl setEnableProxying(boolean enable) {
135136
return this;
136137
}
137138

139+
/**
140+
* Use a more modern network change API.
141+
*
142+
* @param enable If true, use the new API; otherwise, don't.
143+
*/
144+
public NativeCronvoyEngineBuilderImpl setUseNetworkChangeEvent(boolean use) {
145+
mUseNetworkChangeEvent = use;
146+
return this;
147+
}
148+
138149
/** Disables the DNS refresh on failure. */
139150
public NativeCronvoyEngineBuilderImpl
140151
setDisableDnsRefreshOnFailure(boolean disableDnsRefreshOnFailure) {
@@ -277,9 +288,9 @@ public ExperimentalCronetEngine build() {
277288

278289
EnvoyEngine createEngine(EnvoyOnEngineRunning onEngineRunning, EnvoyLogger envoyLogger,
279290
String logLevel) {
280-
AndroidEngineImpl engine = new AndroidEngineImpl(getContext(), onEngineRunning, envoyLogger,
281-
mEnvoyEventTracker, mEnableProxying);
282-
AndroidNetworkMonitor.load(getContext(), engine);
291+
AndroidEngineImpl engine =
292+
new AndroidEngineImpl(getContext(), onEngineRunning, envoyLogger, mEnvoyEventTracker,
293+
mEnableProxying, mUseNetworkChangeEvent);
283294
engine.runWithConfig(createEnvoyConfiguration(), logLevel);
284295
return engine;
285296
}

mobile/library/jni/jni_impl.cc

+7
Original file line numberDiff line numberDiff line change
@@ -1316,6 +1316,13 @@ Java_io_envoyproxy_envoymobile_engine_JniLibrary_onDefaultNetworkChanged(JNIEnv*
13161316
reinterpret_cast<Envoy::InternalEngine*>(engine)->onDefaultNetworkChanged(network_type);
13171317
}
13181318

1319+
extern "C" JNIEXPORT void JNICALL
1320+
Java_io_envoyproxy_envoymobile_engine_JniLibrary_onDefaultNetworkChangeEvent(JNIEnv*, jclass,
1321+
jlong engine,
1322+
jint network_type) {
1323+
reinterpret_cast<Envoy::InternalEngine*>(engine)->onDefaultNetworkChangeEvent(network_type);
1324+
}
1325+
13191326
extern "C" JNIEXPORT void JNICALL
13201327
Java_io_envoyproxy_envoymobile_engine_JniLibrary_onDefaultNetworkUnavailable(JNIEnv*, jclass,
13211328
jlong engine) {

mobile/library/kotlin/io/envoyproxy/envoymobile/AndroidEngineBuilder.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ class AndroidEngineBuilder(context: Context) : EngineBuilder() {
1212
onEngineRunning,
1313
{ level, msg -> logger?.let { it(LogLevel.from(level), msg) } },
1414
eventTracker,
15-
enableProxying
15+
enableProxying,
16+
false
1617
)
1718
}
1819
}

mobile/test/java/io/envoyproxy/envoymobile/engine/AndroidNetworkMonitorTest.java

+21-11
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class AndroidNetworkMonitorTest {
4242
@Before
4343
public void setUp() {
4444
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
45-
AndroidNetworkMonitor.load(context, mockEnvoyEngine);
45+
AndroidNetworkMonitor.load(context, mockEnvoyEngine, false);
4646
androidNetworkMonitor = AndroidNetworkMonitor.getInstance();
4747
connectivityManager = androidNetworkMonitor.getConnectivityManager();
4848
networkCapabilities =
@@ -130,7 +130,8 @@ public void testOnDefaultNetworkChangedGeneric() {
130130
@Test
131131
public void testOnCapabilitiesChangedPreviousNetworkIsEmptyCallbackIsCalledWlan() {
132132
AndroidNetworkMonitor.DefaultNetworkCallback callback =
133-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
133+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
134+
false);
134135
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
135136
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
136137
shadowOf(capabilities).addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
@@ -142,7 +143,8 @@ public void testOnCapabilitiesChangedPreviousNetworkIsEmptyCallbackIsCalledWlan(
142143
@Test
143144
public void testOnCapabilitiesChangedPreviousNetworkIsEmptyCallbackIsCalledWwan() {
144145
AndroidNetworkMonitor.DefaultNetworkCallback callback =
145-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
146+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
147+
false);
146148
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
147149
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
148150
shadowOf(capabilities).addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
@@ -154,7 +156,8 @@ public void testOnCapabilitiesChangedPreviousNetworkIsEmptyCallbackIsCalledWwan(
154156
@Test
155157
public void testOnCapabilitiesChangedPreviousNetworkIsEmptyCallbackIsCalledGeneric() {
156158
AndroidNetworkMonitor.DefaultNetworkCallback callback =
157-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
159+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
160+
false);
158161
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
159162
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
160163
shadowOf(capabilities).addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
@@ -166,7 +169,8 @@ public void testOnCapabilitiesChangedPreviousNetworkIsEmptyCallbackIsCalledGener
166169
@Test
167170
public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallbackIsCalledWwan() {
168171
AndroidNetworkMonitor.DefaultNetworkCallback callback =
169-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
172+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
173+
false);
170174
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_WIFI);
171175
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
172176
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
@@ -179,7 +183,8 @@ public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallbackIsCalledWwan
179183
@Test
180184
public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallCallbackIsCalledWlan() {
181185
AndroidNetworkMonitor.DefaultNetworkCallback callback =
182-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
186+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
187+
false);
183188
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_CELLULAR);
184189
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
185190
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
@@ -192,7 +197,8 @@ public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallCallbackIsCalled
192197
@Test
193198
public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallbackIsCalledGeneric() {
194199
AndroidNetworkMonitor.DefaultNetworkCallback callback =
195-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
200+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
201+
false);
196202
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_BLUETOOTH);
197203
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
198204
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
@@ -205,7 +211,8 @@ public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallbackIsCalledGene
205211
@Test
206212
public void testOnCapabilitiesChangedPreviousNetworkLessThanCurrentNetworkCallbackIsCalled() {
207213
AndroidNetworkMonitor.DefaultNetworkCallback callback =
208-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
214+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
215+
false);
209216
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_WIFI);
210217
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
211218
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
@@ -219,7 +226,8 @@ public void testOnCapabilitiesChangedPreviousNetworkLessThanCurrentNetworkCallba
219226
@Test
220227
public void testOnCapabilitiesChangedPreviousNetworkMoreThanCurrentNetworkCallbackIsCalled() {
221228
AndroidNetworkMonitor.DefaultNetworkCallback callback =
222-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
229+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
230+
false);
223231
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_WIFI);
224232
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_VPN);
225233
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
@@ -233,7 +241,8 @@ public void testOnCapabilitiesChangedPreviousNetworkMoreThanCurrentNetworkCallba
233241
@Test
234242
public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallbackIsNotCalled() {
235243
AndroidNetworkMonitor.DefaultNetworkCallback callback =
236-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
244+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
245+
false);
237246
callback.previousTransportTypes.add(NetworkCapabilities.TRANSPORT_WIFI);
238247
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
239248
shadowOf(capabilities).addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
@@ -246,7 +255,8 @@ public void testOnCapabilitiesChangedPreviousNetworkNotEmptyCallbackIsNotCalled(
246255
@Test
247256
public void testOnCapabilitiesChangedNoInternetCallbackIsNotCalled() {
248257
AndroidNetworkMonitor.DefaultNetworkCallback callback =
249-
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager);
258+
new AndroidNetworkMonitor.DefaultNetworkCallback(mockEnvoyEngine, connectivityManager,
259+
false);
250260
NetworkCapabilities capabilities = ShadowNetworkCapabilities.newInstance();
251261
shadowOf(capabilities).addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
252262
callback.onCapabilitiesChanged(ShadowNetwork.newInstance(0), capabilities);

mobile/test/java/org/chromium/net/impl/ErrorsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class ErrorsTest {
3737
@Before
3838
public void setUp() {
3939
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
40-
AndroidNetworkMonitor.load(context, mock(EnvoyEngine.class));
40+
AndroidNetworkMonitor.load(context, mock(EnvoyEngine.class), false);
4141
ConnectivityManager connectivityManager =
4242
AndroidNetworkMonitor.getInstance().getConnectivityManager();
4343
networkCapabilities =

mobile/test/kotlin/io/envoyproxy/envoymobile/mocks/MockEnvoyEngine.kt

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class MockEnvoyEngine : EnvoyEngine {
4343

4444
override fun onDefaultNetworkChanged(network: Int) = Unit
4545

46+
override fun onDefaultNetworkChangeEvent(network: Int) = Unit
47+
4648
override fun onDefaultNetworkUnavailable() = Unit
4749

4850
override fun setProxySettings(host: String, port: Int) = Unit

0 commit comments

Comments
 (0)