OSDN Git Service

Make CaptivePortalLogin app exit if underlying Network disconnects.
authorPaul Jensen <pauljensen@google.com>
Fri, 26 Sep 2014 19:19:17 +0000 (15:19 -0400)
committerPaul Jensen <pauljensen@google.com>
Tue, 30 Sep 2014 18:34:04 +0000 (14:34 -0400)
The app is no longer useful if the underlying Network has disconnected
and could get in the way of another signing into another Network.

bug:17672087
Change-Id: I26e820444640975e7fd4dd73244f4d4f4b40cb5e

packages/CaptivePortalLogin/AndroidManifest.xml
packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java

index c5fb167..2ec15be 100644 (file)
@@ -20,6 +20,7 @@
     package="com.android.captiveportallogin" >
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
     <application android:label="@string/app_name" >
         <activity
index ae52a1e..b3a6e88 100644 (file)
@@ -20,7 +20,10 @@ import android.app.Activity;
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
 import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.provider.Settings.Global;
@@ -55,6 +58,7 @@ public class CaptivePortalLoginActivity extends Activity {
 
     private URL mURL;
     private int mNetId;
+    private NetworkCallback mNetworkCallback;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -73,7 +77,27 @@ public class CaptivePortalLoginActivity extends Activity {
         getActionBar().setDisplayShowHomeEnabled(false);
 
         mNetId = Integer.parseInt(getIntent().getStringExtra(Intent.EXTRA_TEXT));
-        ConnectivityManager.setProcessDefaultNetwork(new Network(mNetId));
+        final Network network = new Network(mNetId);
+        ConnectivityManager.setProcessDefaultNetwork(network);
+
+        // Exit app if Network disappears.
+        final NetworkCapabilities networkCapabilities =
+                ConnectivityManager.from(this).getNetworkCapabilities(network);
+        if (networkCapabilities == null) {
+            finish();
+            return;
+        }
+        mNetworkCallback = new NetworkCallback() {
+            @Override
+            public void onLost(Network lostNetwork) {
+                if (network.equals(lostNetwork)) done(false);
+            }
+        };
+        final NetworkRequest.Builder builder = new NetworkRequest.Builder();
+        for (int transportType : networkCapabilities.getTransportTypes()) {
+            builder.addTransportType(transportType);
+        }
+        ConnectivityManager.from(this).registerNetworkCallback(builder.build(), mNetworkCallback);
 
         WebView myWebView = (WebView) findViewById(R.id.webview);
         WebSettings webSettings = myWebView.getSettings();
@@ -84,6 +108,7 @@ public class CaptivePortalLoginActivity extends Activity {
     }
 
     private void done(boolean use_network) {
+        ConnectivityManager.from(this).unregisterNetworkCallback(mNetworkCallback);
         Intent intent = new Intent(ACTION_CAPTIVE_PORTAL_LOGGED_IN);
         intent.putExtra(Intent.EXTRA_TEXT, String.valueOf(mNetId));
         intent.putExtra(LOGGED_IN_RESULT, use_network ? "1" : "0");