Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java |
| index 4c370f847e7d93a16e7d6c5a10e0cd33b0b5bbcb..9c3faa8057517ec89e1330f33860dd9a6e756a30 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java |
| @@ -4,18 +4,31 @@ |
| package org.chromium.chrome.browser.feedback; |
| +import android.os.AsyncTask; |
| + |
| import org.chromium.base.CalledByNative; |
| import org.chromium.base.JNINamespace; |
| +import org.chromium.base.Log; |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.VisibleForTesting; |
| import org.chromium.chrome.browser.profiles.Profile; |
| +import java.io.IOException; |
| +import java.net.HttpURLConnection; |
| +import java.net.MalformedURLException; |
| +import java.net.URL; |
| + |
| /** |
| * A utility class for checking if the device is currently connected to the Internet. |
| */ |
| @JNINamespace("chrome::android") |
| public final class ConnectivityChecker { |
| - private static final String DEFAULT_NO_CONTENT_URL = "http://clients4.google.com/generate_204"; |
| + private static final String TAG = "ConnectivityChecker"; |
| + |
| + private static final String DEFAULT_HTTP_NO_CONTENT_URL = |
| + "http://clients4.google.com/generate_204"; |
| + private static final String DEFAULT_HTTPS_NO_CONTENT_URL = |
| + "https://clients4.google.com/generate_204"; |
| /** |
| * A callback for whether the device is currently connected to the Internet. |
| @@ -29,8 +42,69 @@ public final class ConnectivityChecker { |
| /** |
| * Starts an asynchronous request for checking whether the device is currently connected to the |
| - * Internet. The result passed to the callback denotes whether the attempt to connect to the |
| - * server was successful. |
| + * Internet using the Android system network stack. The result passed to the callback denotes |
| + * whether the attempt to connect to the server was successful. |
| + * |
| + * If the profile or URL is invalid, the callback will be called with false. |
| + * The server reply for the URL must respond with HTTP 204 without any redirects for the |
| + * connectivity check to be successful. |
| + * |
| + * This method takes ownership of the callback object until the callback has happened. |
| + * This method must be called on the main thread. |
|
Yaron
2015/05/15 15:57:50
If it must be called on UI thread why are you post
nyquist
2015/05/15 16:32:18
Because I believe that as a caller of this API, it
Yaron
2015/05/15 17:06:04
Fair enough
|
| + * @param timeoutMs number of milliseconds to wait before giving up waiting for a connection. |
| + * @param callback the callback which will get the result. |
| + */ |
| + public static void checkConnectivitySystemNetworkStack( |
| + boolean useHttps, int timeoutMs, final ConnectivityCheckerCallback callback) { |
| + try { |
| + URL url = useHttps ? new URL(DEFAULT_HTTPS_NO_CONTENT_URL) |
| + : new URL(DEFAULT_HTTP_NO_CONTENT_URL); |
| + checkConnectivitySystemNetworkStack(url, timeoutMs, callback); |
| + } catch (MalformedURLException e) { |
| + Log.w(TAG, "Failed to predefined URL: " + e); |
| + ThreadUtils.postOnUiThread(new Runnable() { |
| + @Override |
| + public void run() { |
| + callback.onResult(false); |
| + } |
| + }); |
| + } |
| + } |
| + |
| + static void checkConnectivitySystemNetworkStack( |
| + final URL url, final int timeoutMs, final ConnectivityCheckerCallback callback) { |
| + new AsyncTask<String, Void, Boolean>() { |
| + @Override |
| + protected Boolean doInBackground(String... strings) { |
| + try { |
| + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); |
| + conn.setInstanceFollowRedirects(false); |
| + conn.setRequestMethod("GET"); |
| + conn.setDoInput(false); |
| + conn.setDoOutput(false); |
| + conn.setConnectTimeout(timeoutMs); |
| + conn.setReadTimeout(timeoutMs); |
| + |
| + conn.connect(); |
| + int responseCode = conn.getResponseCode(); |
| + return responseCode == HttpURLConnection.HTTP_NO_CONTENT; |
| + } catch (IOException e) { |
| + return false; |
| + } |
| + } |
| + |
| + @Override |
| + protected void onPostExecute(Boolean connected) { |
| + callback.onResult(connected); |
| + } |
| + }.execute(); |
|
Yaron
2015/05/15 15:57:50
can you use THREAD_POOL_EXECUTOR to not block the
nyquist
2015/05/15 16:32:18
Sorry. Yes! Done.
|
| + } |
| + |
| + /** |
| + * Starts an asynchronous request for checking whether the device is currently connected to the |
| + * Internet using the Chrome network stack. The result passed to the callback denotes whether |
| + *the |
| + * attempt to connect to the server was successful. |
| * |
| * If the profile or URL is invalid, the callback will be called with false. |
| * The server reply for the URL must respond with HTTP 204 without any redirects for the |
| @@ -42,13 +116,14 @@ public final class ConnectivityChecker { |
| * @param timeoutMs number of milliseconds to wait before giving up waiting for a connection. |
| * @param callback the callback which will get the result. |
| */ |
| - public static void checkConnectivity( |
| - Profile profile, long timeoutMs, ConnectivityCheckerCallback callback) { |
| - checkConnectivity(profile, DEFAULT_NO_CONTENT_URL, timeoutMs, callback); |
| + public static void checkConnectivityChromeNetworkStack(Profile profile, boolean useHttps, |
| + long timeoutMs, ConnectivityCheckerCallback callback) { |
| + String url = useHttps ? DEFAULT_HTTPS_NO_CONTENT_URL : DEFAULT_HTTP_NO_CONTENT_URL; |
| + checkConnectivityChromeNetworkStack(profile, url, timeoutMs, callback); |
| } |
| @VisibleForTesting |
| - static void checkConnectivity( |
| + static void checkConnectivityChromeNetworkStack( |
| Profile profile, String url, long timeoutMs, ConnectivityCheckerCallback callback) { |
| ThreadUtils.assertOnUiThread(); |
| nativeCheckConnectivity(profile, url, timeoutMs, callback); |