99import android .os .Bundle ;
1010import android .util .Log ;
1111import android .view .View ;
12+ import android .webkit .CookieSyncManager ;
1213import android .webkit .SslErrorHandler ;
1314import android .webkit .WebChromeClient ;
1415import android .webkit .WebResourceError ;
1516import android .webkit .WebResourceRequest ;
1617import android .webkit .WebResourceResponse ;
1718import android .webkit .WebView ;
1819import android .webkit .WebViewClient ;
20+ import android .widget .FrameLayout ;
1921import android .widget .ProgressBar ;
2022
2123import java .net .MalformedURLException ;
@@ -26,6 +28,125 @@ public class QueueActivity extends AppCompatActivity {
2628 private String queueUrl ;
2729 private String targetUrl ;
2830 private String userId ;
31+ private WebView webview ;
32+ private URL target ;
33+ private URL queue ;
34+ private static WebView previousWebView ;
35+
36+ WebViewClient webviewClient = new WebViewClient () {
37+
38+ @ Override
39+ public void onPageFinished (WebView view , String url ) {
40+ super .onPageFinished (view , url );
41+ CookieSyncManager .getInstance ().sync ();
42+ }
43+
44+ @ Override
45+ public void onReceivedHttpError (WebView view , WebResourceRequest request , WebResourceResponse errorResponse ) {
46+ String errorMessage ;
47+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
48+ errorMessage = String .format ("%s %s: %s %s" , request .getMethod (), request .getUrl (), errorResponse .getStatusCode (), errorResponse .getReasonPhrase ());
49+ } else {
50+ errorMessage = errorResponse .toString ();
51+ }
52+ Log .v ("QueueActivity" , String .format ("%s: %s" , "onReceivedHttpError" , errorMessage ));
53+ super .onReceivedHttpError (view , request , errorResponse );
54+ }
55+
56+ @ Override
57+ public void onReceivedError (WebView view , WebResourceRequest request , WebResourceError error ) {
58+ String errorMessage ;
59+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
60+ errorMessage = String .format ("%s %s: %s %s" , request .getMethod (), request .getUrl (), error .getErrorCode (), error .getDescription ());
61+ } else {
62+ errorMessage = error .toString ();
63+ }
64+ Log .v ("QueueActivity" , String .format ("%s: %s" , "onReceivedError" , errorMessage ));
65+ super .onReceivedError (view , request , error );
66+ }
67+
68+ @ Override
69+ public void onReceivedSslError (WebView view , final SslErrorHandler handler , SslError error ) {
70+ handler .cancel ();
71+ broadcastQueueError ("SslError, code: " + error .getPrimaryError ());
72+ disposeWebview (webview );
73+ }
74+
75+ public boolean shouldOverrideUrlLoading (WebView view , String urlString ) {
76+ Log .v ("QueueITEngine" , "URL loading: " + urlString );
77+ URL url ;
78+ try {
79+ url = new URL (urlString );
80+ } catch (MalformedURLException e ) {
81+ throw new RuntimeException (e );
82+ }
83+
84+ boolean isQueueItUrl = queue .getHost ().contains (url .getHost ());
85+ if (isQueueItUrl ) {
86+ boolean needsRewrite = QueueUrlHelper .urlUpdateNeeded (urlString , userId );
87+ if (needsRewrite ) {
88+ urlString = QueueUrlHelper .updateUrl (urlString , userId );
89+ Log .v ("QueueITEngine" , "URL intercepting: " + urlString );
90+ }
91+ broadcastChangedQueueUrl (urlString );
92+ if (needsRewrite ){
93+ webview .loadUrl (urlString );
94+ return true ;
95+ }
96+ }
97+ boolean isTarget = target .getHost ().contains (url .getHost ());
98+ if (isTarget ) {
99+ Uri uri = Uri .parse (urlString );
100+ String queueItToken = uri .getQueryParameter ("queueittoken" );
101+ broadcastQueuePassed (queueItToken );
102+ disposeWebview (webview );
103+ return true ;
104+ }
105+ if (!isQueueItUrl ) {
106+ Intent browserIntent = new Intent (Intent .ACTION_VIEW , Uri .parse (urlString ));
107+ startActivity (browserIntent );
108+ return true ;
109+ }
110+ return false ;
111+ }
112+ };
113+
114+ private static void cleanupWebView (){
115+ if (previousWebView ==null ) return ;
116+ previousWebView .destroy ();
117+ previousWebView = null ;
118+ }
119+
120+ @ Override
121+ protected void onCreate (Bundle savedInstanceState ) {
122+ super .onCreate (savedInstanceState );
123+ setContentView (R .layout .activity_queue );
124+ readActivityUrls (savedInstanceState );
125+ cleanupWebView ();
126+ final ProgressBar progressBar = (ProgressBar ) findViewById (R .id .progressBar );
127+
128+ FrameLayout layout = (FrameLayout ) findViewById (R .id .relativeLayout );
129+ webview = new WebView (this );
130+ layout .addView (webview );
131+ previousWebView = webview ;
132+ webview .getSettings ().setJavaScriptEnabled (true );
133+ webview .setWebChromeClient (new WebChromeClient () {
134+ @ Override
135+ public void onProgressChanged (WebView view , int newProgress ) {
136+ Log .v ("Progress" , Integer .toString (newProgress ));
137+ if (newProgress < 100 ) {
138+ progressBar .setVisibility (View .VISIBLE );
139+ } else {
140+ progressBar .setVisibility (View .GONE );
141+ }
142+ progressBar .setProgress (newProgress );
143+ super .onProgressChanged (view , newProgress );
144+ }
145+ });
146+ webview .setWebViewClient (webviewClient );
147+ Log .v ("QueueITEngine" , "Loading initial URL: " + queueUrl );
148+ webview .loadUrl (queueUrl );
149+ }
29150
30151 @ Override
31152 protected void onSaveInstanceState (Bundle outState ) {
@@ -40,19 +161,10 @@ protected void onDestroy() {
40161 if (isFinishing ()) {
41162 broadcastQueueActivityClosed ();
42163 }
43-
44164 super .onDestroy ();
45165 }
46166
47- @ Override
48- protected void onCreate (Bundle savedInstanceState ) {
49- super .onCreate (savedInstanceState );
50- setContentView (R .layout .activity_queue );
51-
52- final ProgressBar progressBar = (ProgressBar ) findViewById (R .id .progressBar );
53-
54- final WebView webView = (WebView ) findViewById (R .id .webView );
55-
167+ private void readActivityUrls (Bundle savedInstanceState ) {
56168 if (savedInstanceState == null ) {
57169 Bundle extras = getIntent ().getExtras ();
58170 if (extras == null ) {
@@ -69,104 +181,12 @@ protected void onCreate(Bundle savedInstanceState) {
69181 userId = (String ) savedInstanceState .getSerializable ("userId" );
70182 }
71183
72- final URL target ;
73- final URL queue ;
74184 try {
75185 target = new URL (targetUrl );
76186 queue = new URL (queueUrl );
77187 } catch (MalformedURLException e ) {
78188 throw new RuntimeException (e );
79189 }
80-
81- Log .v ("QueueITEngine" , "Loading initial URL: " + queueUrl );
82-
83- webView .getSettings ().setJavaScriptEnabled (true );
84- webView .setWebChromeClient (new WebChromeClient () {
85- @ Override
86- public void onProgressChanged (WebView view , int newProgress ) {
87- Log .v ("Progress" , Integer .toString (newProgress ));
88- if (newProgress < 100 ) {
89- progressBar .setVisibility (View .VISIBLE );
90- } else {
91- progressBar .setVisibility (View .GONE );
92- }
93- progressBar .setProgress (newProgress );
94- super .onProgressChanged (view , newProgress );
95- }
96- });
97-
98- webView .setWebViewClient (new WebViewClient () {
99-
100- @ Override
101- public void onReceivedHttpError (WebView view , WebResourceRequest request , WebResourceResponse errorResponse ) {
102- String errorMessage ;
103- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
104- errorMessage = String .format ("%s %s: %s %s" , request .getMethod (), request .getUrl (), errorResponse .getStatusCode (), errorResponse .getReasonPhrase ());
105- } else {
106- errorMessage = errorResponse .toString ();
107- }
108- Log .v ("QueueActivity" , String .format ("%s: %s" , "onReceivedHttpError" , errorMessage ));
109- super .onReceivedHttpError (view , request , errorResponse );
110- }
111-
112- @ Override
113- public void onReceivedError (WebView view , WebResourceRequest request , WebResourceError error ) {
114- String errorMessage ;
115- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
116- errorMessage = String .format ("%s %s: %s %s" , request .getMethod (), request .getUrl (), error .getErrorCode (), error .getDescription ());
117- } else {
118- errorMessage = error .toString ();
119- }
120- Log .v ("QueueActivity" , String .format ("%s: %s" , "onReceivedError" , errorMessage ));
121- super .onReceivedError (view , request , error );
122- }
123-
124- @ Override
125- public void onReceivedSslError (WebView view , final SslErrorHandler handler , SslError error ) {
126- handler .cancel ();
127- broadcastQueueError ("SslError, code: " + error .getPrimaryError ());
128- disposeWebview (webView );
129- }
130-
131- public boolean shouldOverrideUrlLoading (WebView view , String urlString ) {
132- Log .v ("QueueITEngine" , "URL loading: " + urlString );
133-
134- URL url ;
135- try {
136- url = new URL (urlString );
137- } catch (MalformedURLException e ) {
138- throw new RuntimeException (e );
139- }
140-
141- boolean isQueueUrl = queue .getHost ().contains (url .getHost ());
142- if (isQueueUrl ) {
143- if (QueueUrlHelper .urlUpdateNeeded (urlString , userId )) {
144- urlString = QueueUrlHelper .updateUrl (urlString , userId );
145- Log .v ("QueueITEngine" , "URL intercepting: " + urlString );
146- webView .loadUrl (urlString );
147- return true ;
148- }
149- broadcastChangedQueueUrl (urlString );
150- }
151- boolean isTarget = target .getHost ().contains (url .getHost ());
152- if (isTarget ) {
153- Uri uri = Uri .parse (urlString );
154- String queueItToken = uri .getQueryParameter ("queueittoken" );
155-
156- broadcastQueuePassed (queueItToken );
157- disposeWebview (webView );
158- return true ;
159- }
160- if (!isQueueUrl ) {
161- Intent browserIntent = new Intent (Intent .ACTION_VIEW , Uri .parse (urlString ));
162- startActivity (browserIntent );
163- return true ;
164- }
165-
166- return false ;
167- }
168- });
169- webView .loadUrl (queueUrl );
170190 }
171191
172192 private void broadcastChangedQueueUrl (String urlString ) {
0 commit comments