iLabs Toolbox Javashare 2008


Published on

A presentation held at the JavaZone conference in Oslo, 2008 describing the iLabs Mobile Toolbox, a library for making Java ME applications without intolerable pain.

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • Welcome folks. This presentation will describe a toolkit built on top of the JME software platform for mobile phones. There are several hundre million mobile phones out there with JME software installed, and we would really like more of them to more useful things than playing the same old little games. We would like to see rich applications connecting people doing all the weird things that web pages do today. If powerpoint had been able to include web content, this is the code we would have used to link to our license: <a rel="license" href=""><img alt="Creative Commons License" style="border-width:0" src="" /></a><br /><span xmlns:dc="" property="dc:title">iLabs mobile toolbox: JME applications without intolerable pain.</span> by <a xmlns:cc="" href="" property="cc:attributionName" rel="cc:attributionURL">Bjørn Remseth, Else Nordhagen, Stian Børresen</a> is licensed under a <a rel="license" href="">Creative Commons Attribution 3.0 Norway License</a>.
  • iLabs Toolbox Javashare 2008

    1. 1. iLabs mobile toolbox: Java ME applications without intolerable pain. Content is available under Creative Commons, Attribution 3.0 license Describes version 0.53b of the toolkit
    2. 2. iLabs <ul><li>Research project at Telenor R&I </li></ul><ul><li>Three year funding, 1 year left. </li></ul><ul><li>Focus: </li></ul><ul><ul><li>How to develop new forms of collaboration through open source. </li></ul></ul><ul><li>Method: </li></ul><ul><ul><li>Get dirty </li></ul></ul><ul><ul><ul><li>Real open source project: ilabs mobile toolbox </li></ul></ul></ul><ul><ul><li>Be analytical </li></ul></ul><ul><ul><ul><li>Think about both concrete and abstract issues. </li></ul></ul></ul><ul><ul><li>Report to everyone </li></ul></ul><ul><ul><ul><li>Top management, peers, nerds, suits, .. </li></ul></ul></ul>
    3. 3. Speakers Bjørn Remseth. Cand. Scient. Research scientist at Telenor Research & Innovation.   Bjørn has more than twenty years of  experience as a sysadmin, developer, systems architect and research scientist. Stian Børresen MSc. Ten years experience  in 3D graphics, web, mobile and rich client development. He is currently working as a consultant specializing in mobile application development using java. Else Nordhagen.  Dr. Scient. Research Scientist at Telenor Research & Innovation. More than thirty years of experience with object oriented design and implementation, 3D graphics, theoretical computer science and GUI design (from Smalltalk in  the  late seventies, to JME today).
    4. 4. Outline of this talk: <ul><li>Why we are doing this, history so far, design goals. </li></ul><ul><li>” Hello GUI” – simple example application </li></ul><ul><li>A tiny bit of detail: </li></ul><ul><ul><li>Important classes and object structures </li></ul></ul><ul><li>“ Application style” examples </li></ul><ul><ul><li>OpenMiniChatter – XMPP chat </li></ul></ul><ul><ul><li>OpenMiniBlogger – blog to blogger /blogspot. </li></ul></ul><ul><ul><li>OpenMiniBrowser – simple HTML rendering </li></ul></ul><ul><li>“ Widget style” example </li></ul><ul><ul><li>A Twitter client. </li></ul></ul><ul><li>Links and contact info </li></ul><ul><li>Questions </li></ul>
    5. 5. Why iLabs Toolbox? Øystein Myhre (original author) with project manager Hilde Lovett En early facebook/gtalk client. <ul><li>We like mobile applications, would like to have more, but they painful to write, so we would like to: </li></ul><ul><li>Make it easy : Remove stupid technical barriers. </li></ul><ul><li>Be inspiring : Facilitate and motivate the production of useful mobile services. </li></ul>Current core developers
    6. 6. In short <ul><li>It should be as simple to write an app that works on a mobile phone as it is to make content for the web </li></ul><ul><li>We’re not quite there yet ;) </li></ul>
    7. 7. History so far: <ul><li>Telenor R&I had several closed source Social Networking example applications written in JME. </li></ul><ul><li>First open source release June 07, second massively reworked release in March 2008. Bimonthly release cycle (, freshmeat, sourceforge). August 08: 0.52 </li></ul><ul><li>U sed by iLabs and some other projects, e.g. </li></ul><ul><ul><li>Facebook client at the University of Colorado </li></ul></ul><ul><ul><li>Green touch, application at the Oslo School of Architecture </li></ul></ul><ul><ul><li>Vaccination registration application for HISP, developed at the Informatics Department at U niv. Of Oslo </li></ul></ul><ul><ul><li>WellCom controlling set top boxes from your phone developed at Telenor R&I in a EUREKA project. </li></ul></ul>
    8. 8. Java versions
    9. 9. Design goals: <ul><li>Hide heterogeneity of devices </li></ul><ul><li>One binary per application (no conditional compilation!) </li></ul><ul><li>Remove common JME pitfalls. </li></ul><ul><ul><li>Screen handling (Forms, Canvas) </li></ul></ul><ul><ul><li>Event handling (Buttons, Menus) </li></ul></ul><ul><li>Simplify layout control of subwindows </li></ul><ul><li>Simplify drawing of text, pictures etc. </li></ul><ul><li>Adding real menus, tabbed views etc. </li></ul><ul><li>Do not require an external proxy </li></ul><ul><li>Leverage existing code for HTML , XMPP, ATOMS, Blogger... </li></ul>!Challenged!
    10. 10. Development model <ul><li>Main license : Lesser Gnu Public License (LGPL) </li></ul><ul><ul><li>To allow derivative works. </li></ul></ul><ul><li>Contributors : </li></ul><ul><ul><li>2-3 full time developers internally in Telenor R&I </li></ul></ul><ul><ul><li>Handful contributors worldwide. </li></ul></ul><ul><li>Openness : We accept anything that is remotely useful. If we ever get to the point where we have to reject something, we will start rejecting things but we are not there yet. </li></ul><ul><li>Subversion repository : Used religiously. </li></ul><ul><li>Java coding standard/checkstyle : Used but with some lapses. </li></ul><ul><li>Issue tracker : Read continously by developers. Telenor team decides what is done by Telenor team. Everyone else decides what they do. </li></ul><ul><li>Scholarships : We do scholarships. Talk to us if you have a cool project and you are a student. ;) </li></ul>
    11. 11. Example 1: How to make your own app (HelloGUI1). <ul><li>public final class HelloGUI extends AbstractIlabsMIDlet { </li></ul><ul><li>public HelloGUI() { </li></ul><ul><li>} </li></ul><ul><li>public void initialize() { </li></ul><ul><li> ApplicationView view = new ApplicationView(&quot;Hello GUI!&quot;); </li></ul><ul><li>setCanvas( new ViewCanvas(getDisplay(),view)); </li></ul><ul><li> view.setRightSoftbuttonAction( </li></ul><ul><li>new ExitAction(&quot;Exit&quot;)); </li></ul><ul><li>getCanvas().show(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>Create a new midlet by subclassing AbstractILabsMidlet </li></ul><ul><li>Override method “ initialize” in your midlet </li></ul><ul><ul><li>Set up your main view, and a canvas to draw on. </li></ul></ul><ul><ul><li>Add menu items (Action instances) if any. </li></ul></ul><ul><ul><li>Show the canvas </li></ul></ul>That wasn’t very painful was it?
    12. 12. Example 2: (HelloGui3):
    13. 13. class HelloGUI3 extends AbstractILabsMidlet public final void initialize() { ApplicationView view = new ApplicationView(&quot;Hello GUI 3!&quot;); view.addMenuItem(new ShowSelection(&quot;Item 1&quot;)); view.addMenuItem(new ShowSelection(&quot;Item 2&quot;)); view.addMenuItem(new ShowSelection(&quot;Item 3&quot;)); view.addMenuItem(new ShowSelection(&quot;Item 4&quot;)); view.setRightSoftbuttonAction(new ExitAction(&quot;Exit&quot;)); setCanvas(new ViewCanvas(getDisplay(), view)); getCanvas().show(); } User provided Built in
    14. 14. Action that change Canvas: class ShowSelection extends DisplayChangeAction { ShowSelection( final String label) { super(label); } protected void onExecute() { final Alert alert = new Alert(&quot;Hello GUI3 alert&quot;, &quot;You selected : &quot; + getLabel(), null, AlertType.INFO); alert.setTimeout(Alert.FOREVER); setCurrent(alert, getCanvas()); } }
    15. 15. Boilerplate to get things going: /** * Creates a new instance of HelloGUI3. */ public HelloGUI3() { }
    16. 16. Important concepts <ul><li>(abstract) Graphics item – Something that can be drawn. </li></ul><ul><li>(interface) InputHandler – Something that interprets user input . </li></ul><ul><li>View – Something on the screen that can respond to User input. </li></ul><ul><ul><li>Often hierarchical. </li></ul></ul><ul><ul><li>Often both GraphicsItem and InputHandler. </li></ul></ul><ul><li>Action – Command pattern that does something </li></ul>
    17. 17. HelloGUI3, hierarchical decomposition ApplicationView Title B ar MenuView PopUpMenu Clock Action 4 Action 3 Action 2 Action 1 SimpleList View
    18. 18. Example 3: OpenMiniChatter <ul><li>A Google Talk client </li></ul><ul><li>Introducing features: </li></ul><ul><ul><li>Menus </li></ul></ul><ul><ul><li>Forms </li></ul></ul><ul><ul><ul><li>Username /Password </li></ul></ul></ul><ul><ul><li>Tabbed view </li></ul></ul><ul><ul><ul><li>Switching between chats </li></ul></ul></ul><ul><ul><li>HtmlView </li></ul></ul><ul><ul><ul><li>for chat content </li></ul></ul></ul><ul><ul><li>XMPP </li></ul></ul><ul><ul><ul><li>Network protocol </li></ul></ul></ul><ul><li>XML parsing: </li></ul><ul><ul><li>MarkupReader - a pull parser </li></ul></ul><ul><ul><li>MarkupElement - creates an object structure </li></ul></ul><ul><li>Persistent storage, simple extention to JME </li></ul>Cool
    19. 19. OpenMiniChatter – dry run:
    20. 20. OpenMiniChatter - dry run - use of TabView
    21. 21. Example 4: OpenMiniBlogger <ul><li>General components + Feed protocol </li></ul><ul><li>Used towards {Blogger,blogspot}.com </li></ul><ul><li>Phone-specific browser extension: </li></ul><ul><ul><li>Camera input plugin </li></ul></ul><ul><li>XML parsing: </li></ul><ul><ul><li>MarkupReader - a pull parser </li></ul></ul><ul><ul><li>MarkupElement - creates an object structure </li></ul></ul><ul><li>Persistent storage, simple extention to JME </li></ul><ul><li>Error handling mechanism that avoid the need to create ”millions” of different types of exception classes. </li></ul><ul><li>URL encoding and parsing </li></ul><ul><li>… </li></ul>Cool
    22. 22. Blogger – dry run
    23. 23. What the HTML renderer sees < form action =“&quot; id =&quot;cameraform&quot; method =&quot;post&quot; enctype =&quot;multipart/form-data&quot;> < object name =&quot;image_file&quot; classid = &quot;clsid:1b9982cf-4be8-42dd-9599-d0f6786d128d&quot; width =&quot;60&quot; height =&quot;80&quot;> </ object > < input type =&quot;submit&quot; name =&quot;update&quot; value =&quot;Update&quot;/> </ form > What you see Live camera view
    24. 24. Blogger – upload and view:
    25. 25. Example 4: OpenMiniBrowser <ul><li>Fast </li></ul><ul><li>Simple </li></ul><ul><li>Simple Html rendering </li></ul><ul><ul><li>No </li></ul></ul><ul><ul><ul><li>css </li></ul></ul></ul><ul><ul><ul><li>tables </li></ul></ul></ul><ul><ul><ul><li>scripting </li></ul></ul></ul><ul><ul><li>But with </li></ul></ul><ul><ul><ul><li>Forms </li></ul></ul></ul><ul><ul><ul><li>cookies </li></ul></ul></ul><ul><ul><li>With extensions.. </li></ul></ul>
    26. 26. Example 4: OpenMiniBrowser public void initialize() { mView = new ApplicationView(&quot;Open Minibrowser&quot;); mCanvas = new ViewCanvas(Display.getDisplay(this), mView); mHtmlView = new HtmlView(this); mView.setMainAreaView(mHtmlView); mHtmlView.setMargins(2, Font.getDefaultFont().charWidth(' ')); mView.addMenuItem(new OpenURLAction(mHtmlView, mHomePage, &quot;Home&quot;)); mView.addMenuItem(new EnterURLAction(mHtmlView, &quot;Open url&quot;)); mView.addMenuItem(new BackUrlAction(mHtmlView, &quot;Back&quot;)); mView.addMenuItem(new ExitAction(&quot;Exit&quot;)); //a clock, displaying hours and seconds. mClock = new Clock(System.currentTimeMillis(), false); mView.addClock(mClock); mView.layout(0, 0, mCanvas.getWidth(), mCanvas.getHeight());; // Start a timer, update the clock once every minute. final Timer timer = new Timer(); timer.scheduleAtFixedRate(new ClockTask(), MILLIS_IN_ONE_MINUTE, MILLIS_IN_ONE_MINUTE);; }
    27. 27. Lessons so far
    28. 28. Lesson I: <ul><li>It’s not that hard to write useful, portable JME programs anymore ;) </li></ul><ul><li>Most layout code in our demo programs end up being based on HTML, even when we’re not really doing web browsing. </li></ul><ul><li>But we can make it even easier: </li></ul>
    29. 29. Where we started - where we ended up: <ul><li>Plain JME programming </li></ul><ul><li>Social Networking : easiest to render HTML content from others </li></ul><ul><li>HTML : also used to make the user interface </li></ul><ul><li>AHA: nice, UI just like the web :-) </li></ul><ul><li>=> Server side scripting as mobile programming method. </li></ul><ul><li>Enabling developer to make their own mobile applications without writing JME </li></ul>JME app. .jad&.jar UI elements .html
    30. 30. J2ME programs vs. server side XML xml & html J2ME App. J2ME Widger App. App. App. Widgets J2ME App. J2ME App. .jad and .jar files .jad&.jar
    31. 31. WIDGER: Widlets through markup <ul><li>A Widger (an application) </li></ul><ul><li>that runs runs Widlets (pieces of functionality living in the widger sandbox) </li></ul><ul><li>that holds Views (showing some kind of content) that have </li></ul><ul><li>Actions (that makes things happen). </li></ul>Documentation : http://
    32. 32. UngWeb in Møre og Romsdal Fylkeskommune
    33. 33. UngeWeb: Widlet for ONE news item:
    34. 34. XML for widlet for one news item: <? xml version = &quot;1.0&quot; encoding = &quot;windows-1252&quot; ?> < widlet ver = &quot;0.2&quot; id = ”tabbednyhet&quot; > < view type = &quot;tabs&quot; id = &quot;main&quot; > < view type = &quot;panel&quot; id = &quot;panel1&quot; title = &quot;Nyhet 1&quot; icon = &quot;/img/FolderExplorer.png&quot; show = &quot;true&quot; > < view type = &quot;web&quot; id = &quot;web1&quot; url = &quot;nyhet1.html&quot; ></ view > < action type = &quot;loadiwg&quot; label = &quot;Nyheter&quot; url = &quot;nyheter.iwg&quot; button = &quot;right&quot; /> </ view > < view type = &quot;panel&quot; id = &quot;panel2&quot; title = &quot;Kommentarer&quot; icon = &quot;resource://FolderExplorer.png&quot; > < view type = &quot;web&quot; id = &quot;web2&quot; url = &quot;nyhet1_kommentarer.html&quot; ></ view > < action type = &quot;reloadurl&quot; label = &quot;Oppdater&quot; for = &quot;web2&quot; /> < action type = &quot;loadiwg&quot; label = &quot;Nyheter&quot; url = &quot;nyheter.iwg&quot; button = &quot;right&quot; /> </ view > < view type = &quot;panel&quot; id = &quot;panel3&quot; title = &quot;Skriv selv&quot; icon = &quot;resource://BlogView.png&quot; > < view type = &quot;web&quot; id = &quot;web3&quot; url = &quot;nyhet1_skrivSelv.html&quot; ></ view > < action type = &quot;loadiwg&quot; label = &quot;Nyheter&quot; url = &quot;nyheter.iwg&quot; button = &quot;right&quot; /> </ view > </ view > </ widlet >
    35. 35. Integrate with authoring tools: UngWeb Edit with eZ publish Generates HTML and .iwg Widger
    36. 36. Lesson II: Supporting protocols is hard <ul><li>Protocol code is painful and error prone to write in JME, </li></ul><ul><ul><li>e.g. HTTPS :-( </li></ul></ul><ul><ul><li>FaceBook, Twitter, FEIDE (ID login), ... </li></ul></ul><ul><li>Protocols change over time </li></ul><ul><li>Workaround: exernal proxies that offload complexity </li></ul>Proxy Widger The service server
    37. 37. Two servers and one client: The Twitter Server Widger/Twitter adapter (in example demo running on an iLabs server) Widger running the Twitter Widlet
    38. 38. Widget Twitter dry run: Server side login and formatting using forms and simple html. In this case all pages are created on our server, not twitter s . Saves bytes and fixes problems with phone heterogeneity and weaknesses.
    39. 39. Server-side scripting: Advantages and Disadvantages: <ul><li>Advantages </li></ul><ul><li>Shorter development time </li></ul><ul><li>Simpler client programs </li></ul><ul><ul><li>handles more phones </li></ul></ul><ul><ul><li>smaller </li></ul></ul><ul><ul><li>faster </li></ul></ul><ul><li>No need to download & install application again when updating service. </li></ul><ul><li>Less network traffic on client due to tailored content on your server </li></ul><ul><li>Better tools on server side for program development than JME... </li></ul><ul><li>Easy to upgrade application </li></ul><ul><li>Disadvantages </li></ul><ul><li>You need a server </li></ul><ul><li>.. that scales </li></ul><ul><li>Need to handle security issues on the server </li></ul><ul><li>Limited functionality on widger, today, but you can always extend it since it is open source  </li></ul>
    40. 40. WIDGER: Widgets through markup <ul><li>A Widger (an application) </li></ul><ul><li>that runs Widgets (pieces of functionality living in the widger sandbox) </li></ul><ul><li>that holds Views (showing some kind of content) that have </li></ul><ul><li>Actions (that makes things happen). </li></ul>Documentation :
    41. 41. Example 5: Browser Widget : <?xml version=&quot;1.0&quot; encoding =&quot; windows-1252&quot; ?> <widget ver=&quot;0.2&quot; id=&quot;httpwidget&quot; >  <view id=&quot;mainview&quot; type=&quot;application&quot; >    <titlebar title=&quot;Http widget&quot; />    <subview type=&quot;web&quot; id=&quot;web1&quot; url=&quot;resource://widgets/httpwidgetindex.html&quot; > </subview>    <action type=&quot;openurl&quot; label=&quot;Home&quot; url=&quot;resource://widgets/httpwidgetindex.html&quot;for=&quot;web1&quot; />    <action type=&quot;enterurl&quot; label=&quot;Open url...&quot; for=&quot;web1&quot; />    <action type=&quot;backurl&quot; label=&quot;Back&quot; for=&quot;web1&quot; button=&quot;right&quot; />    <action type=&quot;exit&quot; label=&quot;Exit&quot; />    </view> </widget> Browser specific actions, built into widger Default exit action
    42. 42. Result: v.s: Just another widget Hand crafted JME application
    43. 43. Example 6: The Twitter Widget
    44. 44. Two servers and one client: Twitter Widget (in Widger) Widger/Twitter adapter (in example demo running on an iLabs server) Twitter server
    45. 45. Widget Twitter client: <widget> < view name =&quot;twitterview&quot; type =&quot;appview&quot; > <titlebar title=&quot;TwitterME&quot; bordercolor=&quot;#000000&quot; bgcolor = &quot;#94E4E8&quot; textcolor = &quot;#ffffff&quot;/> <view type =&quot;web&quot; name =&quot;web1&quot; url =” [...] /twitterlogin.html&quot;> </view> <action type =&quot;exit&quot; label =&quot;Exit&quot;/> </view> </widget> [...] == long url
    46. 46. Widget Twitter client: < widget ver=&quot;0.2&quot; id=&quot;twitter&quot;>     < view type=&quot;application&quot; id=&quot;main&quot;>         < titlebar title=&quot;TwitterME&quot; …         < subview type=&quot;web&quot; name=&quot;web1&quot; url=&quot;resource://widgets/twitterlogin.html&quot;> </ subview >        < action type=&quot;loadiwg&quot; label=&quot;Widgets&quot; url=&quot;resource://widgets/masterwidget.iwg&quot;/>         < action type=&quot;exit&quot; label=&quot;Exit&quot;/>      </ view > </ widget > Colors removed
    47. 47. twitterlogin.html (Plain old HTML, no surprises): <!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;> <html> <head> <title>Twitter</title> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1252&quot;> </head> <body> <p><img src=&quot;twitter.png&quot;/></p> <form action=&quot;; id=&quot;signinform&quot; method=&quot;post&quot;> <p><b>Username:</b><br> <input name=&quot;username&quot; type=&quot;text&quot; title=&quot;Enter username&quot; value=&quot;&quot; /> </p> <p> <b>Password:</b><br> <input type='password' name=&quot;pwd&quot; title=&quot;Enter password&quot; value=&quot;&quot; /> </p> <p> <input type=&quot;submit&quot; name=&quot;signin&quot; value=&quot;signin&quot; /> </p> <p><center><img src=&quot;/widger/img/twitterbird.png&quot;/></center></p> <p>Twitter is a service for friends, family, and co-workers to communicate and stay connected through the exchange of quick, frequent answers to one simple question: What are you doing?</p> </form> </body> </html> Nothing exiting happening here please move on
    48. 48. twitterME user interface (Plain old HTML, one small surprise): <!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;> <html> … <textarea name=&quot;status&quot;></textarea> <!-- <INPUT TYPE=&quot;file&quot; name=&quot;image_file&quot; id=&quot;image_file&quot;/> --> <object name=&quot;image_file&quot; classid=&quot;clsid:1b9982cf-4be8-42dd-9599-d0f6786d128d&quot; width=&quot;60&quot; height=&quot;80&quot;> </object> <input type=&quot;submit&quot; name=&quot;update&quot; value=&quot;Update&quot;/> </form> <hr> </p> <h3>Showing the latest private posts</h3><hr> <p><img src=&quot;;/><b>cnnbrk : </b><br>Embattled … Camera input
    49. 49. Widget Twitter dry run: Server side login and formatting using forms and simple html. In this case all pages are created on our server, not twitter s . Saves bytes and fixes problems with phone heterogeneity and weaknesses.
    50. 50. Where we are now.. And where to go.. <ul><li>It works! on a lot of phones. </li></ul><ul><li>Its rather clean, easy to use and extend. </li></ul><ul><li>Documentation in the code and examples - and working applications. But no tutorials. </li></ul><ul><li>A handful of users outside of the core team.  </li></ul><ul><li>Server side configuration enables new groups to make applications for mobile phones! </li></ul><ul><li>Improve look & feel (CSS, simple tables, etc.) </li></ul><ul><li>Lots of ideas for making it better! </li></ul><ul><li>Extend with phone specific functions, like the camera plugin, and telco assets (OMTP standardization initiative) </li></ul><ul><li>Further develop the server side configuration idea </li></ul><ul><li>Report progress and grow the developer community (that’s why we are here ;) </li></ul>
    51. 51. Tested for devices: <ul><li>SonyEricsson, typical phones: </li></ul><ul><ul><li>k660i (Java platform 8) w880i (Java platform 7) k550i (Java platform 7) w810i (Java platform 6) : camera ”strange” K530i </li></ul></ul><ul><li>Nokia </li></ul><ul><ul><li>Series 60 N93, Nokia N9, N73, N63, E51, E61 </li></ul></ul><ul><ul><li>Series 40: They all have limited memory and usually have problems reading large web-pages, in particular if there are large pictures </li></ul></ul><ul><ul><li>6131 </li></ul></ul><ul><ul><li>6280 – did NOT work, at least with models with early firmware </li></ul></ul><ul><li>HTC </li></ul><ul><ul><li>all models, limited functionality for versions with no camera a c cess from JME </li></ul></ul><ul><li>Motorola – newer phones, require separate build </li></ul><ul><li>Others – not tested </li></ul>
    52. 52. How do we compare with other toolkits? <ul><li>JME out of the box </li></ul><ul><ul><li>We are better in every way ;) </li></ul></ul><ul><ul><li>We have a a browser ;) </li></ul></ul><ul><li>JME Polish ( </li></ul><ul><ul><li>They have nicer layout, CSS-like stylesheets </li></ul></ul><ul><ul><li>They use conditional compilation (one binary per configuration) </li></ul></ul><ul><ul><li>They have less flexible dynamic structure (e.g. variable no. Of tabs, -only- build time configuration!) </li></ul></ul><ul><li>LWUIT (Lightweight UI Toolkit, </li></ul><ul><ul><li>They are more heavyweight  </li></ul></ul><ul><ul><li>They do look nice. </li></ul></ul><ul><ul><li>They borrow some elements from Swing, but isn’t quite Swing. </li></ul></ul><ul><ul><li>They are supported by Sun (but in a strange way, no JCP, etc.) </li></ul></ul>
    53. 53. Links: <ul><li>iLabs main page: </li></ul><ul><ul><li> </li></ul></ul><ul><li>Toolkit homepage: </li></ul><ul><li>Subversion repository homepage : </li></ul><ul><li>Issue tracker: </li></ul><ul><li>Promotion: / </li></ul><ul><li>Downloads </li></ul><ul><li> </li></ul><ul><li>Demo applications downloadable from phones: </li></ul><ul><ul><li> </li></ul></ul>
    54. 54. Questions? Please ..  ?
    55. 55. Thank you for your attention
    56. 56. XTRA
    57. 57. Example XML for a browser: <wid let > <view name=&quot;ONM08&quot; type=&quot; appview &quot;> <titlebar title=&quot;ONM 08&quot; bordercolor=&quot;#FF9900&quot; bgcolor=&quot;#444444&quot; textcolor=&quot;#ffffff&quot;/> <view type=&quot; web &quot; name=&quot;web1&quot; url=&quot;http:// ... .html&quot;></view> <action type=&quot; openurl &quot; l abel=&quot;Home” url=&quot;http:// ... .html&quot; control=&quot;web1&quot;/> <action type=&quot; useropenurl &quot; label=&quot;Open url&quot; control=&quot;web1&quot;/> <action type=&quot; backurl &quot; label=&quot;Back&quot; control=&quot;web1&quot;/> <action type=&quot; exit &quot; label=&quot;Exit&quot;/> </view> </wid let >