From 65636fb23c86e546dc4ce584481fa58bf72e4945 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Wed, 6 May 2015 14:40:59 -0400 Subject: [PATCH] Update captive portal sign-in app SSL error page UI. Add text and update image as per UX team recommendations. Add "Use as is and open browser" link. Bug:18791346 Bug:20038019 Bug:20486308 Change-Id: Ibf6d1493f5332e7905154cc7306645ac4c1a6283 --- .../CaptivePortalLogin/assets/locked_page.png | Bin 7864 -> 0 bytes .../assets/quantum_ic_warning_amber_96.png | Bin 0 -> 682 bytes .../CaptivePortalLogin/res/values/strings.xml | 3 + .../CaptivePortalLoginActivity.java | 77 +++++++++++++++--- 4 files changed, 70 insertions(+), 10 deletions(-) delete mode 100644 packages/CaptivePortalLogin/assets/locked_page.png create mode 100644 packages/CaptivePortalLogin/assets/quantum_ic_warning_amber_96.png diff --git a/packages/CaptivePortalLogin/assets/locked_page.png b/packages/CaptivePortalLogin/assets/locked_page.png deleted file mode 100644 index 91e1291df0dfb5d2525683be8af30c8eff1987e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7864 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 diff --git a/packages/CaptivePortalLogin/assets/quantum_ic_warning_amber_96.png b/packages/CaptivePortalLogin/assets/quantum_ic_warning_amber_96.png new file mode 100644 index 0000000000000000000000000000000000000000..08294cee4587557b09659d656dff4433797e08da GIT binary patch literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U@G)aKnlxNuxcuwao}2$Qo}D`T@S|c$?TZycaE( z$nNZB+mPGY{Wn5NVVfA^M%FD-2bRgo8E$3XCiNiS^2@dPYd&T+2%Al_&jr##Tfc5~ zt&w_g_eE1~qZhMJc5iw_=`k3h%Y9D_fRyIGCsM{--@ADg?nIpbp!$5q z$7a3Hs*GuW7FgGuR7?~3^mCH)nHS!(1^)8iuj9Bd^P>M#@0zqP#y=-17~AQqAD#Z= z%!~9-s&>Y|X4Z6`@2OLZe`LIP{z+tE&;OlSpH*wqaz3l(roH*B`uF|Sx7FN#XQ%#t z<~LjNca0~4h@SDQ$$f%keY{_nex`Bqd?>L$^IHAnelz25KPRCPP)BT;x$*pT`~=XQ z)eR@7f0?=QEQI)RCga&>)nvEn`h_zKYdTN&Job)BlZk(1^!SI+bjjn>cbu`1- zc)tG6_8ar&`k(9nVf}FH{>^t8vYB%lwlbO>xWyoyklVn!;UB}78sUPpfX<7+G|1rT L>gTe~DWM4f@={Py literal 0 HcmV?d00001 diff --git a/packages/CaptivePortalLogin/res/values/strings.xml b/packages/CaptivePortalLogin/res/values/strings.xml index 8348be9f1c5bd..b1a3852a7a8d7 100644 --- a/packages/CaptivePortalLogin/res/values/strings.xml +++ b/packages/CaptivePortalLogin/res/values/strings.xml @@ -5,5 +5,8 @@ Use this network as is Do not use this network Sign in to network + The network you’re trying to join has security issues. + For example, the login page may not belong to the organization shown. + Continue anyway via browser diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index c7b7e6a0cf558..4c907a31dd601 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -33,6 +33,7 @@ import android.os.Bundle; import android.provider.Settings; import android.util.ArrayMap; import android.util.Log; +import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.webkit.SslErrorHandler; @@ -50,6 +51,7 @@ import java.net.URL; import java.lang.InterruptedException; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.Random; public class CaptivePortalLoginActivity extends Activity { private static final String TAG = "CaptivePortalLogin"; @@ -63,6 +65,7 @@ public class CaptivePortalLoginActivity extends Activity { private String mResponseToken; private NetworkCallback mNetworkCallback; private ConnectivityManager mCm; + private boolean mLaunchBrowser = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -200,6 +203,18 @@ public class CaptivePortalLoginActivity extends Activity { mCm.unregisterNetworkCallback(mNetworkCallback); mNetworkCallback = null; } + if (mLaunchBrowser) { + // Give time for this network to become default. After 500ms just proceed. + for (int i = 0; i < 5; i++) { + // TODO: This misses when mNetwork underlies a VPN. + if (mNetwork.equals(mCm.getActiveNetwork())) break; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(mURL.toString()))); + } } private void testForCaptivePortal() { @@ -233,18 +248,30 @@ public class CaptivePortalLoginActivity extends Activity { private class MyWebViewClient extends WebViewClient { private static final String INTERNAL_ASSETS = "file:///android_asset/"; - private boolean firstPageLoad = true; + private final String mBrowserBailOutToken = Long.toString(new Random().nextLong()); + // How many Android device-independent-pixels per scaled-pixel + // dp/sp = (px/sp) / (px/dp) = (1/sp) / (1/dp) + private final float mDpPerSp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 1, + getResources().getDisplayMetrics()) / + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, + getResources().getDisplayMetrics()); + private boolean mFirstPageLoad = true; @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { - if (firstPageLoad) return; + if (url.contains(mBrowserBailOutToken)) { + mLaunchBrowser = true; + done(Result.WANTED_AS_IS); + return; + } + if (mFirstPageLoad) return; testForCaptivePortal(); } @Override public void onPageFinished(WebView view, String url) { - if (firstPageLoad) { - firstPageLoad = false; + if (mFirstPageLoad) { + mFirstPageLoad = false; // Now that WebView has loaded at least one page we know it has read in the proxy // settings. Now prompt the WebView read the Network-specific proxy settings. setWebViewProxy(); @@ -261,16 +288,46 @@ public class CaptivePortalLoginActivity extends Activity { testForCaptivePortal(); } + // Convert Android device-independent-pixels (dp) to HTML size. + private String dp(int dp) { + // HTML px's are scaled just like dp's, so just add "px" suffix. + return Integer.toString(dp) + "px"; + } + + // Convert Android scaled-pixels (sp) to HTML size. + private String sp(int sp) { + // Convert sp to dp's. + float dp = sp * mDpPerSp; + // Apply a scale factor to make things look right. + dp *= 1.3; + // Convert dp's to HTML size. + return dp((int)dp); + } + // A web page consisting of a large broken lock icon to indicate SSL failure. - final static String SSL_ERROR_HTML = ""; + private final String SSL_ERROR_HTML = "


" + + "

%s
" + + "
%s
" + + "%s"; @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { - Log.w(TAG, "SSL error; displaying broken lock icon."); - view.loadDataWithBaseURL(INTERNAL_ASSETS, SSL_ERROR_HTML, "text/HTML", "UTF-8", null); + Log.w(TAG, "SSL error; displaying SSL warning."); + final String html = String.format(SSL_ERROR_HTML, getString(R.string.ssl_error_warning), + getString(R.string.ssl_error_example), mBrowserBailOutToken, + getString(R.string.ssl_error_continue)); + view.loadDataWithBaseURL(INTERNAL_ASSETS, html, "text/HTML", "UTF-8", null); } }