mobile java with gwt: still "write once, run everywhere"

49
Mobile Java with GWT (and alternatives) Murat Yener & Alex Theedom @yenerm @alextheedom

Upload: alex-theedom

Post on 17-Mar-2018

842 views

Category:

Mobile


0 download

TRANSCRIPT

Page 1: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Mobile Java with GWT

(and alternatives)Murat Yener & Alex Theedom

@yenerm @alextheedom

Page 2: Mobile Java with GWT: Still "Write Once, Run Everywhere"

who (the hell) am I?!?

Java, Flex, GWT, iOS, Android developer

Principle Mentor at Eteration

Eclipse Committer

GDG (GTUG) Istanbul Organizer

Conference Speaker

Mobile App Developer at Intel

Page 3: Mobile Java with GWT: Still "Write Once, Run Everywhere"

as a mobile developer

Page 4: Mobile Java with GWT: Still "Write Once, Run Everywhere"

what (the hell) is this talk

about?!?

The fifth element... The Webview..

HTML5 mobile frameworks

Phonegap

keeping native UX

Page 5: Mobile Java with GWT: Still "Write Once, Run Everywhere"

so an HTML5 talk???

Facebook killed HTML5

app.. Zuckerberg said

HTML5 is not there yet!!

try fastbook from sencha

fb.html5isready.com

LinkedIn moved to native!!

so did they just fix it??

Page 6: Mobile Java with GWT: Still "Write Once, Run Everywhere"

mobile apps!

Android

iPhone

Blackberry

Windows Phone

Tablets?!?

Page 7: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Hybrid Apps: Teaching the old dog new tricks?

Page 8: Mobile Java with GWT: Still "Write Once, Run Everywhere"

html5 apps in native shell?? nuts!! this

is too complicated!!

have many of you have web development

experience?

how many of you develop native apps?

how many of you don’t like web

development just because of javascript??

Page 9: Mobile Java with GWT: Still "Write Once, Run Everywhere"

but it is slow!!

building games?

3d physics?

image or sound processing?

...

no most of the time we just do this!

Page 10: Mobile Java with GWT: Still "Write Once, Run Everywhere"

wait is this really web?

Angry Birds for Chrome (GWT)

Quake on Mobile (requires Chrome Beta for

WebGL) http://mediatojicode.com/q3bsp/

“We started with the existing Jake2 Java port of the Quake II engine,

then used the Google Web Toolkit (along with WebGL, WebSockets,

and a lot of refactoring) to cross-compile it into Javascript. You can see

the results in the video above — we were honestly a bit surprised when

we saw it pushing over 30 frames per second on our laptops (your

mileage may vary)!” from Google Code Blog...

Page 11: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Chromium WebView

Page 12: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Mobile (friendly) HTML5

Frameworks

jQueryMobile

Sencha

Zepto

mGWT

Page 13: Mobile Java with GWT: Still "Write Once, Run Everywhere"

GWT 101: java to

javascript?

GWT compiler does the

magic

Optimized high

performance javascript

cross browser

compability (upto ie6)

not really mobile look’n

feel :(

Page 14: Mobile Java with GWT: Still "Write Once, Run Everywhere"

UI & UX

Page 15: Mobile Java with GWT: Still "Write Once, Run Everywhere"

gwt frameworks?

gwt-mobile-webkit: database, storage, geolocation, widgets(?)

http://code.google.com/p/gwt-mobile-webkit/

gwtmobile: GwtMobile-UI, Gwtmobile-Persistence, GwtMobile-PhoneGap(!)

http://code.google.com/p/gwtmobile/

touch4j: Sencha,

http://www.emitrom.com/gwt4touch

mgwt: UI Widgets, GWT-Phonegap

http://code.google.com/p/mgwt/

Page 16: Mobile Java with GWT: Still "Write Once, Run Everywhere"

so what is mGWT

mobile widget library on gwt

native looking widgets for each platform

maven friendly

mvp ready (maven archetype)

and with gwt-phonegap

Page 17: Mobile Java with GWT: Still "Write Once, Run Everywhere"

where to start?

get the source https://code.google.com/p/mgwt

or download the jar

or just use maven

<dependency>

<groupId>com.googlecode.mgwt</groupId>

<artifactId>mgwt</artifactId>

<version>1.1.2</version>

</dependency>

Page 18: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Hello World!!

public class MGWTEntryPoint implements EntryPoint {

public void onModuleLoad() {

// set viewport and other settings for mobile

MGWT.applySettings(MGWTSettings.getAppSetting());

// build animation helper and attach it

AnimationHelper animationHelper = new AnimationHelper();

RootPanel.get().add(animationHelper);

// build some UI

LayoutPanel layoutPanel = new LayoutPanel();

Button button = new Button("Hello mgwt");

layoutPanel.add(button);

// animate

animationHelper.goTo(layoutPanel, Animation.SLIDE);

}

}

Page 19: Mobile Java with GWT: Still "Write Once, Run Everywhere"

using other libs:

ex. maps..

Google Maps Ver 2.0:

http://code.google.com/p/gwt-google-

apis/

Google Maps Ver 3.0:

http://code.google.com/p/gwt-google-

maps-v3/

No Javascript so far!

<inherits name='com.google.gwt.maps.GoogleMaps' />

Page 20: Mobile Java with GWT: Still "Write Once, Run Everywhere"

add a litte spice:

phonegap

geolocation

camera

accelerator

compass

phonebook

file system

even nfc

Page 21: Mobile Java with GWT: Still "Write Once, Run Everywhere"

phonegap in action

...

Button button = new Button("Hello mgwt");

button().addTapHandler(new TapHandler() {

@Override

public void onTap(TapEvent event) {

phoneGap.getNotification().alert("Done!!");

}

});

layoutPanel.add(button);

...

Page 22: Mobile Java with GWT: Still "Write Once, Run Everywhere"

phonegap, in real actionphoneGap.getGeolocation().watchPosition(geolocationOptions, new MyGeolocationCallback(){

@Overridepublic void onSuccess(Position position) {

// check accuracy

if (position.getCoordinates().getAccuracy() > 11) {

raceView.getLabel().setText("Error: Accuracy");

}

// geolocation returns mps, multiply with 3.6 to convert to kph

double speed = 3.6 * position.getCoordinates().getSpeed();

if (speed > 0.2) {// if going

raceView.getLabel().setText(speed + "km @" + position.getCoordinates().getAccuracy());

currentLocation = position;

// got the position now can start!

start();

// stop if the threshold is reached

if (isGoing && speed >= 60) {

MgwtAppEntryPoint.phoneGap.getGeolocation().clearWatch(geolocationWatcher);

endLocation = position;

calculate();

}

} else {// if stoped

raceView.getLabel().setText("get ready!!");

isGoing = false;

}

}

@Override

public void onFailure(PositionError error) {

MgwtAppEntryPoint.phoneGap.getNotification().alert("Problem getting location");

}

});

Page 23: Mobile Java with GWT: Still "Write Once, Run Everywhere"

even more...

public void onTap(TapEvent event) {

final MCheckBox check = ((MCheckBox) event.getSource());

if (check.getValue()) {

if (TWITTER.equalsIgnoreCase(type))

profileView.getBrowser().showWebPage(Service.BASE_URL + "auth/twitter");

else if (FACEBOOK.equalsIgnoreCase(type))

profileView.getBrowser().showWebPage(Service.BASE_URL + "auth/facebook");

profileView.getBrowser().addLocationChangeHandler(new

ChildBrowserLocationChangedHandler() {

@Override

public void onLocationChanged(ChildBrowserLocationChangedEvent event) {

//Do the login...

}

});

}

}

}

Page 24: Mobile Java with GWT: Still "Write Once, Run Everywhere"

going fancy, mvp!

code your UI in the View preferably in xml

via UIBinder

and your logic in the controller (activity)

sound familiar?

easy navigation

lots of boilerplate code

Page 25: Mobile Java with GWT: Still "Write Once, Run Everywhere"

mgwt, advanced

MVP

Model

View

Presenter

Maven Archetype

Page 26: Mobile Java with GWT: Still "Write Once, Run Everywhere"

connecting to backendGWT-RPC (yeah, it rocks), but in native package?

JSONP with with RequestBuilder & Autobean

JsonpRequestBuilder jsonp = new JsonpRequestBuilder();

String url = URL.encode(JSON_URL + "/sendData/" + “HelloWorld”);

jsonp.requestObject(url, new AsyncCallback<JavaScriptObject>() {

@Override

public void onFailure(Throwable caught) {

MgwtAppEntryPoint.phoneGap.getNotification().alert(caught.getMessage());

}

@Override

public void onSuccess(JavaScriptObject result) {

JSONObject jsObj = new JSONObject(result);

AutoBean<Score[]> bean = AutoBeanCodex.decode(factory, Score[].class, jsObj.toString());

Score[] scores = bean.as();

scoresCallback.onResponse(scores);

}

});

Page 27: Mobile Java with GWT: Still "Write Once, Run Everywhere"

accessing native js

can use any existing javascript

use javascript in type safe way

BUT!! don’t mess touch events!!

AND beware you are not in the safe and

optimized zone anymore!!

Page 28: Mobile Java with GWT: Still "Write Once, Run Everywhere"

JSNI

public native static String key(int index) /*-{

return $wnd.localStorage.key(index);

}-*/;

public native static void setItem(String key, String value) /*-{

$wnd.localStorage.setItem(key, value);

}-*/;

public native static String getItem(String key) /*-{

return $wnd.localStorage.getItem(key);

}-*/;

public native static void removeItem(String key) /*-{

$wnd.localStorage.removeItem(key);

}-*/;

public native static void clear() /*-{

$wnd.localStorage.clear();

}-*/;

Page 29: Mobile Java with GWT: Still "Write Once, Run Everywhere"

building my swipe panel

just like the one in sencha

wrapped swipeview from

cubiq

Page 30: Mobile Java with GWT: Still "Write Once, Run Everywhere"

mgwt groups

https://groups.google.com/forum/?fromgroups#!forum/mgwt

Page 31: Mobile Java with GWT: Still "Write Once, Run Everywhere"

daniel to rescue..

Page 32: Mobile Java with GWT: Still "Write Once, Run Everywhere"

here it is

Page 33: Mobile Java with GWT: Still "Write Once, Run Everywhere"

gwtquery

coming from jQuery, no problem!

public void onModuleLoad() {

//Hide the text and set the width and append an h1 element

$("#text").hide()

.css("width", "400px")

.prepend("<h1>GwtQuery Rocks !</h1>");

//add a click handler on the button

$("button").click(new Function(){

public void f() {

//display the text with effects and animate its background color

$("#text").as(Effects)

.clipDown()

.animate("backgroundColor: 'yellow'", 500)

.delay(1000)

.animate("backgroundColor: '#fff'", 1500);

}

});

}

Page 34: Mobile Java with GWT: Still "Write Once, Run Everywhere"

skinning

default themes for

Android (>4.0)

iOS/iOS retina (<7.0)

Blackberry

easy to create yours

https://code.google.com/p/mgwt/wiki/Styling

//append your own css as last thing in the head

MGWTStyle.injectStyleSheet("yourcssfile.css");

Page 35: Mobile Java with GWT: Still "Write Once, Run Everywhere"

wait, css in java?!?

.mgwt-Button {

display: inline-block;

float: left;

width: 145px;

height: 100px;

border: 1px solid rgba(0,0,0,0.23);

background: #ff6600;

border-radius: 6px;

box-shadow: inset -1px 0px 0px rgba(255,255,255,0.41), inset

1px 0px 0px rgba(255,255,255,0.21), inset 0px -1px 0px

rgba(0,0,0,0.21), inset 0px 1px 0px rgba(255,255,255,0.41), 0px 1px

2px rgba(0,0,0,0.21);

text-align: center;

font-size: 14px;

margin: 5px;

font-weight: bold;

text-shadow: 0px 1px 1px rgba(0,0,0,0.49);

color: white;

line-height: 124px;

}

Page 36: Mobile Java with GWT: Still "Write Once, Run Everywhere"

debugging

first class java debugging in your

IDE

GWT pretty compile and debug

javascript in your browser

use source maps and debug java

in your browser!!

use remote debugging to debug on

mobile devices

Page 37: Mobile Java with GWT: Still "Write Once, Run Everywhere"

what about others?

iOS, works like charm.. pretty much native

android, near native experience

blackberry

windows phone

tablets?

desktop??

Page 38: Mobile Java with GWT: Still "Write Once, Run Everywhere"

what can i really build?

anything!

but why not going native for games

many widgets.. lists, carousels, forms

dev friendly, you know java? just dive in!

make use of current js

windows phone? seriously?!?

Page 39: Mobile Java with GWT: Still "Write Once, Run Everywhere"

</slides>

GDG Istanbul (every 3. or 4. Saturday)

Interested in OSGi? No? ok, i thought so…

and GWT.create at San Francisco

[email protected]

@yenerm

devchronicles.com

Page 40: Mobile Java with GWT: Still "Write Once, Run Everywhere"

40% discount with promo

code

VBK43when ordering

through

wiley.com

valid until end of

December 2015

Page 41: Mobile Java with GWT: Still "Write Once, Run Everywhere"

who (the hell) am I?!?

Java (Spring/EE) developer

Microservices

Jersey Coders Mentor

Conference Speaker

Page 42: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Cross-platform Mobile

Development

Develop once run on multiple platforms

Choose just ‘one’ language

Page 43: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Two Approaches

Hybrid

Cross compile

Page 44: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Tabris

Hybrid

Java

.war

JSON

Page 45: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Lets see some code

UI coded in Java

Rendered in native UI

Page 46: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Codename One

Compile to native

C#

JDK 1.3

iOS

Windows Phone

C

Java 5

Page 47: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Lets see some code

Familiar to Swing

and GWT coders

Java 8 next release

Page 48: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Oracle Mobile Application

Framework (MAF)

Only Jdeveloper or Eclipse

Lightweight JVM

Page 49: Mobile Java with GWT: Still "Write Once, Run Everywhere"

Lets see some code

Flow define GUI

Device feature via DeviceManager