Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Android webviews and Hybrid Development. A Horror Story
1.
2. @sergiandreplace
• I do Android stuff
• I’ve tried to create something
with webviews
• It was a monster
• Pain and tears
• This is my history
3. @sergiandreplace
• “A view that displays web pages”
• Since API 1
• New version in KitKat (not today)
• Is not based on Chrome
• Renderer is “special”
• Its full of bugs and issues
4. @sergiandreplace
• WebView is added to a layout like any other view
• It’s a wrapper to execute html and associated
technologies
• The Java environment and the html environment are
isolated*
• We can:
• loadUrl(String url)
• loadData(String data, String mime, String encoding)
• loadDataWithBaseUrl (String baseUrl. String data….)
• android.permission.INTERNET!!
Android app
Webview
HTML
(JS, CSS, etc)
Java
7. @sergiandreplace
• Default behaviour: open links externally (yes, it’s true)
• We should intercept the url requests and redirect back to the
webview
• We need a WebViewClient
• WebViewClient handles page events
9. @sergiandreplace
• WebViewClient handles page lifecycle and resources loading
• .onPageFinished (it’s a trap!)
• .onPageStarted
• .shouldInterceptRequest (ooooh!)
• WebChromeClient Just handles “other” events. More specific to page
itself* .
• .onProgressChanged (what the…?)
10. @sergiandreplace
• Android fragmentation is nothing compared to this
• Video full screen is handled by WebChromeClient.onShowCustomView
• Android <=2.3.3 view instanceof VideoView
• Android >3.0 view instanceof HTML5VideoView . An internal private class (d’oh!)
Field proxiedVideoFullScreen = callback.getClass().getDeclaredFields()[0];
proxiedVideoFullScreen.setAccessible(true);
Object unproxiedVideoFullScreen=proxiedVideoFullScreen.get(callback);
Field mUri= unproxiedVideoFullScreen.getClass().getSuperclass().getDeclaredField("mUri");
mUri.setAccessible(true);
path =((Uri)mUri.get(unproxiedVideoFullScreen)).toString();
11. @sergiandreplace
• Just put your web on assets and
load it
• loadUrl("file:///android_asset/...
(///!!!)
• Java vs. Javascript.Try to be as
biased as possible
• Do not mix interactive events
(touch, drag, etc)
13. @sergiandreplace
• We can inject Java objects to the WebView
• This object methods can be invoked from JavaScript
• Cool, isn’t? So cool that nobody else supports it
• Forget DODM!
• Sooo…
14. @sergiandreplace
• Just use a specific url format and capture it from WebViewClient
and Use url to put parameters
• This works in all platforms
• Uri class is our best friend for parsing urls
• Returning values? Add callback function as parameter. All calls
are asynchronous
• Basically, this is what Cordova does
18. @sergiandreplace
• Bug http://code.google.com/p/android/issues/detail?id=17535:Url with params not
working
• Sony (des)Experia
• Create a mini-browser to the web team. Don’t relay on Chrome for Android
• Abandon Android 3.0. Seriously.
• Do a lot of tests
• Hardware acceleration:“If your application performs custom drawing, test your
application on actual hardware devices with hardware acceleration turned on to find
any problems” a.k.a.: Just try