diff --git a/packages/connectivity/connectivity/CHANGELOG.md b/packages/connectivity/connectivity/CHANGELOG.md index c159f9ed0792..72b6d9b6513a 100644 --- a/packages/connectivity/connectivity/CHANGELOG.md +++ b/packages/connectivity/connectivity/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.0.2 + +* Android: Fix IllegalArgumentException. +* Android: Update Example project. + ## 2.0.1 * Remove unused `test` dependency. diff --git a/packages/connectivity/connectivity/android/build.gradle b/packages/connectivity/connectivity/android/build.gradle index e1982a03cf09..30ab4789d312 100644 --- a/packages/connectivity/connectivity/android/build.gradle +++ b/packages/connectivity/connectivity/android/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.5.0' } } diff --git a/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java b/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java index 0a3a6bac0914..a8902fa62ef9 100644 --- a/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java +++ b/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/Connectivity.java @@ -10,10 +10,10 @@ import android.os.Build; /** Reports connectivity related information such as connectivity type and wifi information. */ -class Connectivity { +public class Connectivity { private ConnectivityManager connectivityManager; - Connectivity(ConnectivityManager connectivityManager) { + public Connectivity(ConnectivityManager connectivityManager) { this.connectivityManager = connectivityManager; } diff --git a/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java b/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java index 0c6554c0a5f7..ca3ccff82d2d 100644 --- a/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java +++ b/packages/connectivity/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityBroadcastReceiver.java @@ -13,7 +13,6 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; -import androidx.annotation.RequiresApi; import io.flutter.plugin.common.EventChannel; /** @@ -24,15 +23,16 @@ * io.flutter.plugin.common.EventChannel#setStreamHandler(io.flutter.plugin.common.EventChannel.StreamHandler)} * to set up the receiver. */ -class ConnectivityBroadcastReceiver extends BroadcastReceiver +public class ConnectivityBroadcastReceiver extends BroadcastReceiver implements EventChannel.StreamHandler { private Context context; private Connectivity connectivity; private EventChannel.EventSink events; private Handler mainHandler = new Handler(Looper.getMainLooper()); + private ConnectivityManager.NetworkCallback networkCallback; public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; - ConnectivityBroadcastReceiver(Context context, Connectivity connectivity) { + public ConnectivityBroadcastReceiver(Context context, Connectivity connectivity) { this.context = context; this.connectivity = connectivity; } @@ -41,7 +41,19 @@ class ConnectivityBroadcastReceiver extends BroadcastReceiver public void onListen(Object arguments, EventChannel.EventSink events) { this.events = events; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - connectivity.getConnectivityManager().registerDefaultNetworkCallback(getNetworkCallback()); + networkCallback = + new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + sendEvent(); + } + + @Override + public void onLost(Network network) { + sendEvent(); + } + }; + connectivity.getConnectivityManager().registerDefaultNetworkCallback(networkCallback); } else { context.registerReceiver(this, new IntentFilter(CONNECTIVITY_ACTION)); } @@ -50,7 +62,9 @@ public void onListen(Object arguments, EventChannel.EventSink events) { @Override public void onCancel(Object arguments) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - connectivity.getConnectivityManager().unregisterNetworkCallback(getNetworkCallback()); + if (networkCallback != null) { + connectivity.getConnectivityManager().unregisterNetworkCallback(networkCallback); + } } else { context.unregisterReceiver(this); } @@ -63,19 +77,8 @@ public void onReceive(Context context, Intent intent) { } } - @RequiresApi(api = Build.VERSION_CODES.N) - ConnectivityManager.NetworkCallback getNetworkCallback() { - return new ConnectivityManager.NetworkCallback() { - @Override - public void onAvailable(Network network) { - sendEvent(); - } - - @Override - public void onLost(Network network) { - sendEvent(); - } - }; + public ConnectivityManager.NetworkCallback getNetworkCallback() { + return networkCallback; } private void sendEvent() { diff --git a/packages/connectivity/connectivity/example/android/app/build.gradle b/packages/connectivity/connectivity/example/android/app/build.gradle index bacbc2f6f4c2..64f3d0626bf4 100644 --- a/packages/connectivity/connectivity/example/android/app/build.gradle +++ b/packages/connectivity/connectivity/example/android/app/build.gradle @@ -34,7 +34,7 @@ android { defaultConfig { applicationId "io.flutter.plugins.connectivityexample" minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -55,4 +55,6 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + testImplementation 'org.robolectric:robolectric:3.8' + testImplementation 'org.mockito:mockito-core:3.5.13' } diff --git a/packages/connectivity/connectivity/example/android/app/src/test/java/io/flutter/plugins/connectivityexample/ActivityTest.java b/packages/connectivity/connectivity/example/android/app/src/test/java/io/flutter/plugins/connectivityexample/ActivityTest.java new file mode 100644 index 000000000000..f8f4247a7ef5 --- /dev/null +++ b/packages/connectivity/connectivity/example/android/app/src/test/java/io/flutter/plugins/connectivityexample/ActivityTest.java @@ -0,0 +1,53 @@ +package io.flutter.plugins.connectivityexample; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.spy; + +import android.content.Context; +import android.net.ConnectivityManager; +import io.flutter.plugins.connectivity.Connectivity; +import io.flutter.plugins.connectivity.ConnectivityBroadcastReceiver; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +public class ActivityTest { + private ConnectivityManager connectivityManager; + + @Before + public void setUp() { + connectivityManager = + (ConnectivityManager) + RuntimeEnvironment.application.getSystemService(Context.CONNECTIVITY_SERVICE); + } + + @Test + @Config(sdk = 24, manifest = Config.NONE) + public void networkCallbackNewApi() { + Context context = RuntimeEnvironment.application; + Connectivity connectivity = spy(new Connectivity(connectivityManager)); + ConnectivityBroadcastReceiver broadcastReceiver = + spy(new ConnectivityBroadcastReceiver(context, connectivity)); + + broadcastReceiver.onListen(any(), any()); + assertNotNull(broadcastReceiver.getNetworkCallback()); + } + + @Test + @Config(sdk = 23, manifest = Config.NONE) + public void networkCallbackLowApi() { + Context context = RuntimeEnvironment.application; + Connectivity connectivity = spy(new Connectivity(connectivityManager)); + ConnectivityBroadcastReceiver broadcastReceiver = + spy(new ConnectivityBroadcastReceiver(context, connectivity)); + + broadcastReceiver.onListen(any(), any()); + assertNull(broadcastReceiver.getNetworkCallback()); + } +} diff --git a/packages/connectivity/connectivity/example/android/build.gradle b/packages/connectivity/connectivity/example/android/build.gradle index 541636cc492a..e0d7ae2c11af 100644 --- a/packages/connectivity/connectivity/example/android/build.gradle +++ b/packages/connectivity/connectivity/example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:3.5.0' } } diff --git a/packages/connectivity/connectivity/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/connectivity/connectivity/example/android/gradle/wrapper/gradle-wrapper.properties index 019065d1d650..01a286e96a21 100644 --- a/packages/connectivity/connectivity/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/connectivity/connectivity/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/packages/connectivity/connectivity/pubspec.yaml b/packages/connectivity/connectivity/pubspec.yaml index d856d1069913..91d06373ab83 100644 --- a/packages/connectivity/connectivity/pubspec.yaml +++ b/packages/connectivity/connectivity/pubspec.yaml @@ -2,7 +2,7 @@ name: connectivity description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity/connectivity -version: 2.0.1 +version: 2.0.2 flutter: plugin: