[:en]Tales of a GeekTrotter[:fr]Récits d'un GeekTrotter[:ja]Tales of a GeekTrotter [:en]Binary Logbook[:fr]Carnet de bord binaire[:ja]ギークの旅行

22Jan/1125

Quickly build smartphone applications (iPhone, Android, WP7, BB, Symbian) with Rhomobile RhodesDéveloppez rapidement des applications pour les mobiles (iPhone, Android, WP7, BB, Symbian) avec Rhomobile Rhodes

Yesterday, I had no idea about how to write programs for smartphones such as iPhone, Android, Windows Phone or BlackBerry.
Today, my first application is already running on my Android phone...

As a first attempt to write a mobile application, I just tried to build an application that retrieves the latest news from my school's atom feed and displays it in a native way on a smartphone (Keio University, Graduate School of SDM).
Yesterday, I had absolutely no knowledge about mobile development, except "iPhone is using the ugly Objective-C and Android is using the heavy Java".
Today, the application looks like that...

...is written in pure Ruby and is 100% native on iPhone, Android, Windows Mobile and BlackBerry!
How come?! Thanks to a powerful, light, easy and intuitive mobile framework: Rhodes (from Rhomobile).
Let see in this post how to do that.

Hier encore, je n'avais aucune idée de comment écrire des programmes pour les smartphones comme l'iPhone, Android, Windows Phone ou BlackBerry.
Aujourd'hui, ma première application tourne déjà sur mon téléphone Android...

Pour un premier test de création d'application mobile, j'ai essayé de faire une application qui récupère les dernières news depuis le flux Atom de mon école (Keio SDM) et les affiche de façon "native" sur les téléphones.
Hier je n'avais aucune connaissance sur la programmation pour téléphones si ce n'est que "l'iPhone utilise l'horrible Objective-C et Java utilise le lourd Java".
Aujourd'hui, mon application ressemble à ça...

...est écrite en pur Ruby et est 100% native sur iPhone, Android, Windows Mobile et BlackBerry !
Comment est-ce possible ?! Grâce à un framework de développement mobile puissant, léger, facile à utiliser et intuitif, j'ai nommé : Rhodes (par Rhomobile).
Voyons dans cet article comment en arriver là.

Introduction

When you face a new issue, the first thing you often do is... to Google it!
Well that's what I did, and it quickly appeared that if I want to build native applications for smartphones, I will have to write the application in different languages using different libraries; one for each OS (for example Objective-C for iOS or Java for Android) unless I use some frameworks that do the ugly conversion to native code for you!

Appcelerator Titanium

And among the frameworks, the most popular one seems to be Appcelerator Titanium.
According to their websites, it allows you to use "web technologies" (JavaScript, Python, Ruby) to develop native applications for iPhone and Android.
Sounds exciting right!

So I installed the free Titanium Plateform, downloaded an example from their website, and tried to run the example.
That's the last thing I did with that software... The software never succeed to connect to the Android SDK and I was stuck on the "loading..." (of the Android SDK) that never ran... (even after moving "adb" to the right folder and setting up the path with all the correct values...)
Then I tried the Sandbox where you can run some code snippets.
I took one of the list, the Python Hello World example and clicked "Launch".
Nothing happened...
I'm sure the problem is me because the soft is pretty popular and many people manage to use it well!
But it did not really persuade me to investigate further in the software...

Rhomobile Rhodes

I gave a try to another one, apparently less popular.
Its name is "Rhodes" from the Rhomobile family.
Unlike Appcelerator Titanium, Rhodes is really "cross-platform". Where Titanium supports only iPhone and Android, Rhodes offers you also Windows Mobile, RIM and Symbian!
However, you won't have choice for programming language: you will have to program in Ruby.
A single Ruby code can be deployed into a native application on all OS supported by Rhomobile.

But is it a drawback to use Ruby? After using it for two days... clearly not!
Rhodes is highly inspired by Rails and takes good ideas from the Rails web framework: Database Abstraction (not as complete as Rails), MVC (Model-View-Controller), auto model generation (similar to Rails scaffolding, also through rake) and many things I still did not see yet.

Let see how I ended up in 2 days with my first application running on my smartphone starting from 0.
First, we need a mobile OS SDK (Development Kit). The easiest to get and available on all platforms (unlike a very close one that you can only use from Macs... ><) is the Android SDK.

You can get the one you want but I'll explain briefly how to set up the Android one here.

Install the Java SDK

To use the Android SDK, you need the Java SDK (as native Android apps are Java apps).
So first if you don't have it, let's install it.
Go to the Java website and download the latest SDK for your system.

Note: On Windows, install the 32 bits version of the SDK even if you have a 64 bits OS. Android SDK only works with the 32 bits version (for the moment?).
On Linux, remember to switch your default SDK to the Sun proprietary one (using "alternatives").
It may also work with the OpenSDK but I never tried.

Install Android SDK

Go to the Android Developers website and install the SDK. Start the SDK Manager (asked after installed on Windows or under tools/android on Linux) and install the packages you want (probably the SDK for Android 2.3 and the updates).
On the same webpage, download the Android NDK that helps us with "performance-critical native applications". You just need to extract the archive somewhere (probably along with the SDK).

Note: Do not install the SDK in a folder that contains spaces (Not in the "Program Files" folder for example!), it may not work (use for example 'C:\android-sdk-windows' and 'C:\android-ndk-r5' instead).

Install Ruby and Rhodes

Then you need to install Ruby, RubyGems, Rake and Rhodes.

On Linux, you just need to install the packages "ruby", "rubygems", then the rake and rhodes gems ("sudo gem install rake rhodes").
On Windows, if you already have Ruby and Rubygems you need to "Start command prompt with Ruby" (search from the windows menu) and "gem install rake rhodes".
If you don't have Ruby, you can install Ruby, RubyGems and Rhodes with a all-in-one installer: Instant Rhodes.

That's all you need to use the Rhodes framework.
Let set it up. Start a command prompt with Ruby and type "rhodes-setup".
Follow the instructions to set up Rhodes.
For example for me:

ruby 1.9.2p136 (2010-12-25) [i386-mingw32]

C:\Users\Thomas>rhodes-setup
We will ask you a few questions below about your dev environment.

JDK path (required) (C:/Program Files/Java/jdk1.6.0_23):
Android SDK path (blank to skip) (): C:\android-sdk-windows
Android NDK path (blank to skip) (C://android-ndk-r5):
Windows Mobile 6 SDK CabWiz (blank to skip) ():
BlackBerry JDE 4.6 (blank to skip) ():
BlackBerry JDE 4.6 MDS (blank to skip) ():
BlackBerry JDE 4.2 (blank to skip) ():
BlackBerry JDE 4.2 MDS (blank to skip) ():

If you want to build with other BlackBerry SDK versions edit: C:/Ruby192/lib/ruby/gems/1.9.1/gems/rhodes-2.2.6/rhobuild.yml

C:\Users\Thomas>

And Rhodes is set up!

Note: If you have troubles with rake and its 'bin_path', just remove the rake.gemspec and rake-0.8.7.gemspec files in the \lib\ruby\gems\1.9.x\specifications folder and run "gem install rake" again

Hello World

To make a new application, the only thing we need to do is to extend the rhodes framework.
So first we can generate a simple "hello world" like application with one line.
From the command prompt, enter "rhodes app myapp" (changing "myapp" by whatever you want).

It will create the application template :

[[email protected] rhodes]$ rhodes app myapp
Generating with app generator:
     [ADDED]  myapp/rhoconfig.txt
     [ADDED]  myapp/build.yml
     [ADDED]  myapp/app/application.rb
     [ADDED]  myapp/app/index.erb
     [ADDED]  myapp/app/index.bb.erb
     [ADDED]  myapp/app/layout.erb
     [ADDED]  myapp/app/loading.html
     [ADDED]  myapp/Rakefile
     [ADDED]  myapp/app/loading.png
     [ADDED]  myapp/app/helpers
     [ADDED]  myapp/icon
     [ADDED]  myapp/app/Settings
     [ADDED]  myapp/public

Move to that folder (cd myapp) and you can directly try the application by typing "rake run:android"
The first time you run "rake run:android" you will have to choose a virtual device.
Just press enter to let rhodes create a new one and set it up.

Once you've done that, your first application will start in an Android Emulated window.

2011-01-21-214416_1280x705_scrot

Note: The Android Emulator is pretty slow! It can take up to 3 minutes to boot and start the application

Building your own application

Hello World is nice, but we want a real application.

As I said in the introduction, we will write a simple Atom feed parser that can display all the entries of an Atom feed in a list and allow the user to click (well, tap!) on an entry title to see its content.
The Atom feed I am taking as example is the following one: http://www.sdm.keio.ac.jp/en/atom.xml

Model

First, we need to create the model of our application.

We will store the entries in a “Feed” model, and each “feed” will have a title, a date, a link, a content and a language.
So we just generate the model automatically with rhodes:

[[email protected] myapp]$ rhodes model Feed title,date,link,content,lang
Generating with model generator:
     [ADDED]  app/Feed/index.erb
     [ADDED]  app/Feed/edit.erb
     [ADDED]  app/Feed/new.erb
     [ADDED]  app/Feed/show.erb
     [ADDED]  app/Feed/index.bb.erb
     [ADDED]  app/Feed/edit.bb.erb
     [ADDED]  app/Feed/new.bb.erb
     [ADDED]  app/Feed/show.bb.erb
     [ADDED]  app/Feed/feed_controller.rb
     [ADDED]  app/Feed/feed.rb
     [ADDED]  app/test/feed_spec.rb

It generated automatically some files for you.

It basically allows you to create new feeds, edit them, and delete them from the application.
You can have a look to the generated files to understand how Rhodes works.
In our case, we do not need to be able to add, edit et delete manually the entries so I deleted the “edit” and “new” templates (.erb) and removed the edit/update/create/delete methodes from the controller (feed_controller.erb).

XML

What we want is to populate the database from the entries in the XML file.
So we need a Ruby XML parser. And of course there are plenty of them!
Rhodes supports the popular ReXML and also has its own implementation based on ReXML (but lighter) named RhoXML. Unfortunately RhoXML doesn’t support CDATA and there are CDATA in my feed so we will have to use ReXML.

To add ReXML support, simply add the “rexml” and “set” extensions to the build.yml file at the root of your application:

extensions: ["json", "rexml", "set"]

When we start the application, we want to list all the entries of the feed.
So we want to call the “index” of the “Feed”.

Startup application

To do so, we just change the rhoconfig.txt file (root of the app) as follows:

# Startup page for your application
start_path = '/app/Feed'

def index

And what we want to do when we start the application is to list the feeds, so let’s do so by editing the index method in the feed_controller.rb as follows:

  def index
    @feeds = Feed.find(:all)
    if @feeds.empty? then
      self.update
    else
      render :action => :index, :back => :exit
    end
  end

If we already loaded the feeds, we just display the list.
If there are no feeds, we update them.

def update

You can see the full "update" method at the end of this post.
I just show you the most important part here, the part that loads the elements of the Atom feed into our @feeds variable:

require 'rexml/document'
#@@get_result contains the XML text (as a string)
doc = REXML::Document.new(@@get_result)
REXML::XPath.each(doc,"//feed/entry/") do |e|
  Feed.create(:title => e.elements['title'].text,
              :link => e.elements['link'].attributes['href'],
              :date => e.elements['published'],
              :content => e.elements['content'].texts().at(1),
              :lang => e.elements['content'].attributes['xml:lang'])
end

def refresh

We also want to be able to "refresh" the entries because when we restart the application, if you noticed the beginning of the index method, if there are some entries in the database, we just display them directly.
However the database is not destroyed when we stop the application so the entries will be directly displayed without connecting to the internet.
We can add a simple "refresh" method that empty the database and update the entries from the Atom feed:

def refresh
  Feed.delete_all
  redirect :action => :update
end

Then, when the user tap on a title form the index list, we want to display the content of the feed.
The "show" method has already been implemented for us and we don't need to change it:

def show
  @feed= Feed.find(@params['id'])
  if @feed
    render :action => :show
  else
    redirect :action => :index
  end
end

The Views (index, show)

Finally, we only need to change the automatically generated views to display the information we want!
Let see the two most important views: index and show.

The index.erb has a button on the top to manually refresh the entries and a list of all the entries (showing their title):

<h1>SDM News</h1>

Result:
Android_SDM_News_01

The show.erb shows the title, the date, and the content:

<h1><%= @feed.title %></h1>
  • <%= @feed.title %>
  • <%= @feed.date %>
  • <%= @feed.content %>

Result:
Android_SDM_News_04

And... that's it!
I added some controls, the multi-language feature and the final application was done!

Conclusion

In addition to allow you to quickly build mobile applications, Rhodes also supports native powerful APIs of the smartphones.
It is also really cross-platform as you can deploy your application to the 5 top mobile devices (iPhone, Android, Windows Phone, BlackBerry and Symbian).
Ruby is a very user-friendly programming language that is pleasant to use.
The MVC and Database Abstraction layers inherited from Rails make the code easier to maintain.

IDEs that work with Ruby/Rails also work has a charm with Rhodes.

RubyMine_Screenshot

You can find some screenshots of the quickly built application here:

You can download the complete code of the application used as an example in this tutorial here: sdmnews.zip.
From your Android device, you can install the application by clicking on the following APK link: sdmnews.apk
You need to allow unknown sources to install this quickly built application (Settings > Applications > Unknown sources) as I do not publish it to the market (yet?).

If you have any comment or question about mobile software development, feel free to comment this post!

Introduction

Quand vous êtes confronté à un nouveau problème, la première chose qu'on fait souvent est... de chercher sur Google !
Et c'est ce que j'ai fait, pour vite me rendre compte que si je voulais écrire des applications natives pour téléphones, j'allais devoir programmer dans différents langages de programmation pour différents OS (voire même me mettre à de nouveaux langages comme par exemple l'immonde Objective-C pour l'iPhone), à moins de n'utiliser des "frameworks" pour le développement sur mobile qui font tout le sale travail de conversion pour moi à partir d'une source commune.

Appcelerator Titanium

Et parmi ces framework, le plus populaire semble être Appcelerator Titanium.
D'après leur site web, ça permet d'utiliser les "technologies web" (JavaScript, Python, Ruby) pour développer des applications natives pour Android et iPhone.
Ca à l'air prometteur, pas vrai !

Donc j'ai installé ladite plateforme, téléchargé un exemple sur leur site et tenté de le faire tourner.
Ce fût la dernière chose que je fis avec ce framework... Le logiciel n'a jamais réussi à se connecter au SDK d'Android (pourtant bien installé, avec son path bien définit et "adb" dans le bon dossier...). Le logiciel restait bloqué sur "loading...".
Bien, essayons alors leurs morceaux de codes de test dans la "Sandbox" (bac à sable).
C'est un des onglets du logiciel qui permet en théorie de tester des bouts de code "dans le nuage".
J'ai sélectionné l'exemple "hello world" en Python et cliqué sur "Launch".
Rien ne se passe... Je peux attendre longtemps, rien ne bouge !

Bon étant donné la popularité du logiciel, le problème vient sans doute de moi...
Cela dit, bien que l'interface soit cool, ça m'a pas vraiment persuadé d'investiguer plus que ça...

Rhomobile Rhodes

J'ai donc donné sa chance à un autre framework, apparemment moins populaire.
Son petit nom est "Rhodes", bébé de la Rhomobile family.
Là où Appcelerator Titanium se contente de proposer l'iPhone et Android, Rhodes propose en plus Windows Mobile, RIM (BlackBerry) et Symbian !
On est dans du vrai "cross-platform" là, ça rigole pas !
Par contre, vous n'avez pas autant de choix quant au langage de programmation : il va falloir coder en Ruby.
Un programme écrit en Ruby pourra ensuite être déployer en une application native sur chacun des OS supporté.

Mais est-ce une tare d'utiliser Ruby ? Après l'avoir utilisé deux jours... clairement pas !
Rhodes est grandement inspiré de Rails et hérite des bonnes idées de ce framework : Database Abstraction (bien que moins puissante que Papa Rails), MVC (Model-View-Controller), génération automatique de code (similaire à l’échafaudage (scaffolding) de Rails, aussi via rake) et plein de choses que j'ai pas encore découvertes !

Voyons comment j'en suis arrivé en 2 jours à une application complète qui tourne sur mon téléphone en partant de 0.
Primo, on a besoin d'un kit de développement (SDK) d'un OS cible (un seul suffit pour les tests).
Le plus simple à installer et disponible sur toutes les plateformes (contrairement à un OS très fermé disponible uniquement sur des ordinateurs à pomme dont je ne citerais pas le nom... ><) est sans conteste Android SDK.

A vous de choisir celui que vous voulez, mais en guise d'information j'explique comment installer le SDK d'Android.

Installer Java SDK

Pour utiliser l'Android SDK, vous allez avoir besoin de Java SDK (étant donné que les applications Android sont nativement en Java).
Donc si vous n'avez pas encore le Java SDK, il est temps de l'installer.
Allez sur la page de téléchargement du site Java et téléchargez le dernier SDK pour votre système.

Note : Sous Windows, installez la version 32 bits de Java SDK, même si vous avez un OS 64 bits. Android SDK ne fonctionne qu'avec la version 32 bits (pour le moment ?).
Sous Linux, utilisez de préférence le SDK propriétaire de Sun (vous pouvez choisir via "alternatives") bien que ça peut aussi marcher avec OpenSDK (mais je n'ai pas vérifié)

Installer Android SDK

Aller sur le site Android Developers et installez le SDK.
Lancez le SDK Manager (proposé à la fin de l'install sous Windows ou dispo sous /tools/android sous Linux) et installez les paquets que vous voulez (probablement le SDK pour Android 2.3 et les différentes mises à jour).
Depuis cette même page, téléchargez le Android NDK qui aide à créer des applications natives dont la performance est critique. Il suffit d'extraire l'archive quelque part (probablement à côté du SDK).

Note : N'installez pas le SDK dans un dossier qui contient des espaces (donc pas dans le "Program Files" par exemple !), il ne sera pas utilisable (préférez par exemple 'C:\android-sdk-windows' et 'C:\android-ndk-r5' instead).

Installer Ruby et Rhodes

Passons à l'installation de Ruby et de Rhodes.

Sous Linux, il suffit d'installer les paquets "ruby", "rubygems", et les gems rake et rhodes ("sudo gem install rake rhodes").
Sous Windows, si vous avez déjà Ruby et RubyGems, il suffit de lancer un invité de commande avec Ruby ("Start command prompt with Ruby" from the windows menu) et de faire "gem install rake rhodes".
Si vous n'avez pas Ruby, vous pouvez installer Ruby et Rhodes avec un pack d'installation tout-en-un magique : Instant Rhodes.

C'est tout ce dont vous avez besoin pour bénéficier du framework Rhodes.
Configurons-le. Lancez un invité de commande Ruby et entrez "rhodes-setup".
Suivez les instructions pour configurer Rhodes.

Par exemple pour moi :

ruby 1.9.2p136 (2010-12-25) [i386-mingw32]

C:\Users\Thomas>rhodes-setup
We will ask you a few questions below about your dev environment.

JDK path (required) (C:/Program Files/Java/jdk1.6.0_23):
Android SDK path (blank to skip) (): C:\android-sdk-windows
Android NDK path (blank to skip) (C://android-ndk-r5):
Windows Mobile 6 SDK CabWiz (blank to skip) ():
BlackBerry JDE 4.6 (blank to skip) ():
BlackBerry JDE 4.6 MDS (blank to skip) ():
BlackBerry JDE 4.2 (blank to skip) ():
BlackBerry JDE 4.2 MDS (blank to skip) ():

If you want to build with other BlackBerry SDK versions edit: C:/Ruby192/lib/ruby/gems/1.9.1/gems/rhodes-2.2.6/rhobuild.yml

C:\Users\Thomas>

Et voilà, Rhodes est configuré !

Note : Si vous avez des problèmes avec rake et son 'bin_path', supprimez les fichiers rake.gemspec et rake-0.8.7.gemspec du dossier \lib\ruby\gems\1.9.x\specifications et relancez "gem install rake"

Hello World

Pour créer une nouvelle application, la seule chose à faire est d'étendre le framework.
Générons une sorte d'"hello world" en une ligne.
Depuis l'invité de commandes, entrez "rhodes app myapp" (en changeant "myapp" par ce-que-vous-voulez)

Ça créera la structure d'une application :

[[email protected] rhodes]$ rhodes app myapp
Generating with app generator:
     [ADDED]  myapp/rhoconfig.txt
     [ADDED]  myapp/build.yml
     [ADDED]  myapp/app/application.rb
     [ADDED]  myapp/app/index.erb
     [ADDED]  myapp/app/index.bb.erb
     [ADDED]  myapp/app/layout.erb
     [ADDED]  myapp/app/loading.html
     [ADDED]  myapp/Rakefile
     [ADDED]  myapp/app/loading.png
     [ADDED]  myapp/app/helpers
     [ADDED]  myapp/icon
     [ADDED]  myapp/app/Settings
     [ADDED]  myapp/public

Entrez dans le dossier (cd myapp) et vous pouvez dès à présent exécuter "rake run:android" pour démarrer l'application dans un émulateur Android.
La première fois que vous lancez "rake run:android" vous pourrez choisir de paramétrer manuellement la machine virtuelle Android.
Pressez simplement ENTRER pour laisser Rhodes s'occuper de ça et ce sera configuré.

Une fois cela fait, votre première application va démarrer dans un émulateur Android ressemblant à ça :

2011-01-21-214416_1280x705_scrot

Note : L'émulateur Android est très lent ! Ca peut prendre jusqu'à trois minutes pour démarrer et lancer l'application.

Créez votre propre application

Hello World c'est cool, mais on veut quelque chose de plus réel.

Comme annoncé dans l'introduction, nous allons écrire un programme qui récupère un flux Atom qui affiche de façon plus naturelle les news dans un téléphone mobile.
Nous voulons une liste avec les titres des news et que lorsqu'on clique (ou plutôt "tapote") sur un titre, ça nous affiche le contenu de la news.
Le flux Atom que je prends dans l'exemple est le suivant : http://www.sdm.keio.ac.jp/en/atom.xml
(flux Atom en Anglais des dernières news de mon école : Keio University, Graduate School of SDM).

Modèle

Primo, créons le modèle de notre application.

Nous allons stocker les news dans un modèle "Feed" et chaque "feed" aura un titre, une date, un lien, un contenu et une langue.
Nous générons ce modèle automatiquement dans Rhodes :

[[email protected] myapp]$ rhodes model Feed title,date,link,content,lang
Generating with model generator:
     [ADDED]  app/Feed/index.erb
     [ADDED]  app/Feed/edit.erb
     [ADDED]  app/Feed/new.erb
     [ADDED]  app/Feed/show.erb
     [ADDED]  app/Feed/index.bb.erb
     [ADDED]  app/Feed/edit.bb.erb
     [ADDED]  app/Feed/new.bb.erb
     [ADDED]  app/Feed/show.bb.erb
     [ADDED]  app/Feed/feed_controller.rb
     [ADDED]  app/Feed/feed.rb
     [ADDED]  app/test/feed_spec.rb

Comme on peut le voir, cela a généré pas mal de fichiers pour nous.

Nous avons de quoi créer, éditer et supprimer des feeds directement depuis l'application.
Vous pouvez jeter un coup d'oeil à ces fichiers pour comprendre comment marche Rhodes.
Dans notre cas, nous n'avons pas besoin d'ajouter, supprimer ou modifier des feeds directement depuis l'application.
Nous voulons récupérer automatiquement ces feeds depuis le flux Atom.
Donc vous pouvez supprimer les templates "edit" et "new" (.erb) et supprimer les méthodes edit/update/create/delete du controlleur (feed_controller.rb).

XML

Ce que nous voulons, c'est de remplir la base de donnée avec les feeds récupérés dans le flux Atom (XML).
Donc nous avons besoin d'un lecteur XML en Ruby, et, bien sûr, ce n'est pas ce qui manque !
Rhodes gère le populaire ReXML et possède en plus sa propre implémentation basée sur ReXML : RhoXML (plus légère que ReXML donc plus rapide, mais avec moins de fonctions). Malheureusement, RhoXML ne gère pas les tags CDATA et le flux Atom de test que j'ai choisi en contient...
Nous utiliserons donc ReXML qui marche très bien.

Pour ajouter la prise en charge de ReXML, il suffit d'ajouter “rexml” et “set” à la liste des extensions dans le fichier the build.yml (à la racine de votre application) :

extensions: ["json", "rexml", "set"]

Menu de départ

Quand nous lançons l'application, nous voulons afficher une liste des feeds.
Donc nous voulons appeler la méthode "index" (par défaut) de "Feed".

Pour cela, il suffit d'éditer notre rhoconfig.txt file (à la racine de votre app) comme suit :

# Startup page for your application
start_path = '/app/Feed'

def index

Et ce que nous voulons faire lorsqu'on lance l'application c'est lister les feeds, donc faisons ça simplement en modifiant la méthode index de feed_controller.rb comme suit :

  def index
    @feeds = Feed.find(:all)
    if @feeds.empty? then
      self.update
    else
      render :action => :index, :back => :exit
    end
  end

Si on a déjà les feeds dans la base de donnée, nous affichons juste la liste de ceux-ci.
Sinon, nous les mettons à jour.

def update

La spécification complète de la méthode update est disponible dans l'archive du code source de cette application à la fin de l'article.
Je ne copie ici que la partie la plus importante, celle qui charge le contenu XML et en extrait chaque élément dans notre variable @feeds.

require 'rexml/document'
#@@get_result contains the XML text (as a string)
doc = REXML::Document.new(@@get_result)
REXML::XPath.each(doc,"//feed/entry/") do |e|
  Feed.create(:title => e.elements['title'].text,
              :link => e.elements['link'].attributes['href'],
              :date => e.elements['published'],
              :content => e.elements['content'].texts().at(1),
              :lang => e.elements['content'].attributes['xml:lang'])
end

def refresh

Nous voulons aussi pouvoir "rafraîchir" la liste des feeds car lorsque nous relançons l'application, si vous avez remarqué au début de notre méthode index, si nous avons déjà des feeds dans la base de donnée, nous affichons ceux-la sans revérifier le fichier en ligne.
Et comme la base de données n'est pas détruite lorsqu'on quitte l'application, les news seront simplement ré-affiché lors de la prochaine exécution sans remettre à jour depuis internet.
Evidemment, à chacun d'implémenter ça comme il veut ! J'ai préféré procéder ainsi, et du coup il me faut une méthode "refresh" pour forcer la lecture du flux Atom.

def refresh
  Feed.delete_all
  redirect :action => :update
end

def show

Ensuite lorsqu'on utilisateur tapote le titre d'un feed, nous voulons afficher le contenu de ce feed.
Pour cela, la méthode "show" a déjà été implémentée et nous n'avons même pas à la changer !

def show
  @feed= Feed.find(@params['id'])
  if @feed
    render :action => :show
  else
    redirect :action => :index
  end
end

Les vues (index, show)

Enfin, il nous faut changer les "vues" pour afficher les informations qu'on veut.
Voyons les plus importantes d'entre elles : index.erb et show.erb

L'index propose un bouton en haut de l'écran pour rafraîchir manuellement les entrées et liste ensuite toutes les news.

<h1>SDM News</h1>

Le résultat :

Android_SDM_News_01

Le show.erb affiche le titre d'une news, sa date et son contenu.

<h1><%= @feed.title %></h1>
  • <%= @feed.title %>
  • <%= @feed.date %>
  • <%= @feed.content %>

Le résultat :

Android_SDM_News_04

Et... c'est terminé !
J'ai ajouté quelques vérifications, le support du multi-lingue (news en anglais et en japonais) et l'application était terminée !

Conclusion

En plus de permettre de créer rapidement des applications mobiles, Rhodes supporte les API natives des smartphones.
C'est un framework réellement cross-platform étant donné qu'on peut déployer nos applications sur les 5 fabricants d'OS pour téléphones (iPhone, Android, Windows Phone, BlackBerry et Symbian).
Ruby est un langage de programmation très agréable et facile à utiliser.
L'architecture MVC et le Database Abstraction hérité de Rails font qu'il est facile de maintenir le code.

Les IDEs qui marchent avec Ruby/Rails marche aussi très bien avec Rhodes.

RubyMine_Screenshot

Vous pouvez voir quelques captures d'écrans de ladite application ici :

Vous pouvez télécharger le code source de l'application créée dans ce tutorial ici : sdmnews.zip.
Depuis votre téléphone Android, vous pouvez installer l'application en téléchargeant et installant l'application suivante : sdmnews.apk
Vous devez autoriser les sources non identifiées pour installer cette application (Settings > Applications > Unknown sources) étant donné que je n'ai pas publié l'application sur le Market (pas encore ?).

Si vous avez des commentaires ou des questions, faites-vous donc plaisir !