SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Desenvolvendo aplicações
    Mobile com HTML, CSS e
           JavaScript
       Aproveitando o conhecimento Web
          no desenvolvimento Mobile



fisl@urubatancom.br      http://www.urubatan.com.br
Palestrante

Rodrigo Urubatan (@urubatan no Twitter) trabalha
 com desenvolvimento de software desde 1997. Já
 desenvolveu sistemas em uma gama de linguagens
 e ambientes, incluindo Delphi, C, C++, PHP, ASP,
 ColdFusion, Assembly, Leather, Ruby e Java.
 Atualmente trabalha com pesquisa e
 desenvolvimento na HP, utilizando principalmente
 Java, Flex e Ruby, e já ministrou cursos e palestras
 em diversos eventos pelo Brasil. Autor do livro Ruby
 On Rails: Desenvolvimento Fácil e Rápido de
 Aplicações Web.

fisl@urubatancom.br           http://www.urubatan.com.br
Primeira idéia




• Symbian e WebOS suportam aplicações escritas em
  HTML+CSS+Javascript nativamente
• Seria legal fazer o mesmo para Android e iOS
• Vou criar um esqueleto de aplicação com WebKit e rodar
  minha app Symbian WRT no Android!




   fisl@urubatancom.br           http://www.urubatan.com.br
Esqueleto de aplicação
              Android
           Portando WRT para Android




fisl@urubatancom.br       http://www.urubatan.com.br
Layout (main.xml)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView android:id="@+id/webView"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>




    fisl@urubatancom.br                  http://www.urubatan.com.br
Activity

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  web = (WebView) findViewById(R.id.webView);
  WebSettings settings = web.getSettings();
  settings.setJavaScriptEnabled(true);
  settings.setJavaScriptCanOpenWindowsAutomatically(true);
  settings.setSupportMultipleWindows(true);
  settings.setSupportZoom(false);
  settings.setPluginsEnabled(true);
  web.setVerticalScrollBarEnabled(true);
  web.setHorizontalScrollBarEnabled(false);
  // Our application's main page will be loaded
  web.loadUrl("file:///android_asset/index.html");
}

     fisl@urubatancom.br                   http://www.urubatan.com.br
Port da API WRT

• É necessário expor os objetos da API WRT para a aplicação
  Android
   o device
   o widget
   o menu
• WebView.addJavascriptInterface(objetoJava,
  “nomeNoJavascript”)




   fisl@urubatancom.br           http://www.urubatan.com.br
Isto daria muito trabalho

          Uma das maiores virtudes dos
          programadores é a preguiça.



fisl@urubatancom.br        http://www.urubatan.com.br
Open Source for the Rescue

      Alguem já deve ter feito isto por mim




fisl@urubatancom.br         http://www.urubatan.com.br
Opções
• PhoneGap
   o APIs Javascript para acesso a recursos de dispositivos
     moveis
   o Suporte para iOS, Android, Symbian, Windoes Mobile,
     WebOS, Bada (em desenvolvimento), WindowsPhone 7
     (em desenvolvimento)
   o UI desenvolvida com Frameworks JS+CSS
   o Licensa BSD ou MIT o que for mais conveniente
• Titanium Mobile
   o APIs Javascript para acesso a recursos de dispositivos
     moveis
   o Suporte para iOS e Android
   o API para UI disponivel com L&F nativos
   o Apache + Comercial para modulos adicionais e suporte

   fisl@urubatancom.br            http://www.urubatan.com.br
Opção e Motivos da Escolha - 1

• Titanium Mobile
   o Falta suporte para Symbian
   o API única para todas as plataformas
   o API própria para UI
   o Possibilidade de utilizar quase o mesmo código para
     gerar aplicações Mobile e Desktop
       Nos exemplos apresentados o código é diferente*
       Mesmo assim, a possibilidade de compartilhar código
        é muito interessante
   o Ambiente de desenvolvimento próprio
   o Build service - gera aplicação nativa para android e iOS a
     partir dos fontes enviados (Serviço pago)

   fisl@urubatancom.br             http://www.urubatan.com.br
Opção e Motivos da Escolha - 2

• PhoneGap
   o Eu uso e gosto do Symbian
   o Possui uma API única para todos os dispositivos
       Com algumas excessões de coisas que funcionam e
        uma e não na outra mas isto esta documentado
   o Eu já conheço gosto de diversos frameworks Javascript
   o Existem frameworks Javascript que me permitem ter uma
     UI "nativa" em todas as plataformas
   o Possibilidade de utilizar a IDE ou editor de textos que me
     convier
   o Phonegap Build - serviço que gera apps nativas para
     todas as plataformas suportadas a partir de um código
     único (Serviço pago)
   fisl@urubatancom.br             http://www.urubatan.com.br
Desvantagens

• Em ambos os casos é necessário ter os SDKs para cada
  uma das plataformas instalado na maquina (Exceto se for
  utilizar o serviço de build)
• Em ambos os casos se for necessária para a aplicação uma
  API não disponível no framework, sera necessário
  implementar nativamente para cada uma das plataformas
  desejadas




   fisl@urubatancom.br          http://www.urubatan.com.br
PhoneGap

        Meu framework favorito para esta
                   tarefa



fisl@urubatancom.br        http://www.urubatan.com.br
APIs nativas disponíveis



Acelerometer           Camera        Capture       Compass

Connection             Contacts      Device        Events

File                   Geolocation   Media         Network

Notification           Storage



       fisl@urubatancom.br            http://www.urubatan.com.br
Frameworks disponíveis para UI




•   jQuery Mobile
•   jQTouch
•   Sencha Touch
•   Guarana-UI
•   Nokia Web Templates for High-End Devices
•   Muitos mais pela web ...




     fisl@urubatancom.br          http://www.urubatan.com.br
Pequeno exemplo




• Este é o código de uma API escrita diretamente para Nokia
  WRT portada depois para Android utilizando PhoneGap
• É uma APP gratuita disponível na OviStore




   fisl@urubatancom.br           http://www.urubatan.com.br
Mobile Pomodoro




fisl@urubatancom.br     http://www.urubatan.com.br
index.html
<html>
  <head>
    <title>Mobile Pomodoro</title>
    <link rel="stylesheet" type="text/css" href="css/basic.css"/>
    <script type="text/javascript" src="lib/jquery.min.js"></script>
    <script type="text/javascript" src="lib/jquery.json-2.2.min.js"></script>
    <script type="text/javascript" src="lib/jquery.countdown/jquery.countdown.js"></script>
    <script type="text/javascript" src="lib/pomodoro.js"></script>
    <style type="text/css">
       @import "lib/jquery.countdown/jquery.countdown.css";
    </style>
    <script type="text/javascript">
       $(document).ready(function(){
             var app = new App("mobile_pomodoro");
             app.initialize("timer");
             $("#exit_btn").click(function(evt){
                window.close();
                });

             });
</script>
   </head>




       fisl@urubatancom.br                                  http://www.urubatan.com.br
index.html (2)

  <body>
     <h1 id="header" style="background: url(icon.png) no-repeat;">
        Mobile Pomodoro
     </h1>
     <div id="screen_one" class="screen">
        <div id="timer">
        </div>
        <div id="controls">
           <div id="timer_pomodoro" class="button pomodoro">Start Pomodoro</div>
           <div id="timer_break" class="button break">Take a Break</div>
           <div id="exit_btn" class="button exit">Exit</div>
        </div>
     </div>
  </body>
</html>




      fisl@urubatancom.br                                http://www.urubatan.com.br
basic.css

body {
  font-family:Verdana;
  background-color:#1c1c1c;
  color: #fff;
  margin: 0;
  padding: 0;
}
#header {
    text-indent: 50px;
fisl@urubatancom.br           http://www.urubatan.com.br
basic.css (2)

.button {
    height: 30px;
    line-height: 30px;
    text-align: center;
    text-indent: 30px;
    vertical-align: middle;
    background-repeat: no-repeat;
    right: 20px;
    left: 20px;
fisl@urubatancom.br           http://www.urubatan.com.br
basic.css (3)

.break {
    background-image:
   url('../images/coffee_mug.png');
}
.exit {
    background-image: url('../images/exit.png');
}
#timer {
    background-color: #1C1C1C;
fisl@urubatancom.br            http://www.urubatan.com.br
pomodoro.js

function App(name){
   this.settings = {
      pomodoro_time: 25,
      interval_time: 5
   };
this.history = [];
   this.name = name;
   this.saveSettings = function(){
      if (window.widget) {
          widget.setPreferenceForKey($.toJSON(this.settings), 'settings');
      }
   }
   this.saveHistory = function(){
      if (window.widget) {
          widget.setPreferenceForKey($.toJSON(this.history), 'history');
      }
   }




       fisl@urubatancom.br                                     http://www.urubatan.com.br
pomodoro.js (2)

  this.loadSettings = function(){
     if (window.widget) {
         var rawJSON = window.widget.preferenceForKey('settings');
         if (rawJSON != "" && rawJSON != null && rawJSON != undefined) {
             this.settings = $.evalJSON(rawJSON);
         }
     }
     $(this).trigger("settings_loaded");
  }
  this.loadHistory = function(){
     if (window.widget) {
         var rawJSON = window.widget.preferenceForKey('history');
         if (rawJSON != "" && rawJSON != null && rawJSON != undefined) {
             this.history = $.evalJSON(rawJSON);
         }
     }
     $(this).trigger("settings_loaded");
  }
  this.loadSettings();
  this.loadHistory();
fisl@urubatancom.br                                  http://www.urubatan.com.br
  window.app = this;
pomodoro.js (3)

App.prototype.initialize = function(timer_id){
  window.app.timer_id = timer_id;
  $("#" + timer_id).countdown({
      until: 0,
      format: 'HMS'
  });
  $("#" + timer_id + "_pomodoro").click(window.app.startPomodoro);
  $("#" + timer_id + "_break").click(window.app.startBreak);
  $('body').append('<div id="' + window.app.name + 'player" style="display:none"></div>');
  if (window.menu) {
      window.menu.showSoftkeys();
      var pomodoroMenu = new MenuItem("Start Pomodoro", 101);
      pomodoroMenu.onSelect = function(idx){
         window.app.startPomodoro();
      }
      var breakMenu = new MenuItem("Take a Break", 111);
      breakMenu.onSelect = function(idx){
         window.app.startBreak();
      }
      window.menu.clear();
fisl@urubatancom.br                                   http://www.urubatan.com.br
      window.menu.append(pomodoroMenu);
pomodoro.js(4)

App.prototype.timeUp = function(){
   window.app.playSound();
   window.app.vibrate();
}
App.prototype.startPomodoro = function(evt){
   var time = window.app.settings.pomodoro_time * 60;
   $('#' + window.app.timer_id).countdown("change", {
       until: time,
       format: 'HMS',
       onExpiry: window.app.timeUp
   });
   return false;
}
App.prototype.startBreak = function(evt){
   var time = window.app.settings.interval_time * 60;
   $('#' + window.app.timer_id).countdown("change", {
       until: time,
       format: 'HMS',
       onExpiry: window.app.timeUp
   });
 fisl@urubatancom.br                                  http://www.urubatan.com.br
   return false;
Problemas

   API para menus ainda não disponível multi
    plataforma
          Mas isto raramente é utilizado para dispositivos
           touch screen
   Algumas vezes é necessário adicionar alguns Ifs
    para adicionar código especifico para alguma
    plataforma



fisl@urubatancom.br                http://www.urubatan.com.br
Geolocalization

// onSuccess Callback
// This method accepts a `Position` object, which
   contains
// the current GPS coordinates
//
var onSuccess = function(position) {
   alert('Latitude: '  + position.coords.latitude
   + 'n' +
        'Longitude: '  + position.coords.longitude
fisl@urubatancom.br         http://www.urubatan.com.br
Captura de Imagens

navigator.camera.getPicture(onSuccess, onFail, {
  quality: 50,
  destinationType:
  Camera.DestinationType.FILE_URI });

function onSuccess(imageURI) {
  var image =
  document.getElementById('myImage');
  image.src = imageURI;
fisl@urubatancom.br          http://www.urubatan.com.br
?!?!?!

fisl@urubatancom.br       http://www.urubatan.com.br
Referências
    http://www.urubatan.com.br
    http://phonegap.com
    jQuery Mobile
    JQTouch
    Sencha Touch
    Guarana-UI
    Nokia Web Templates for High-End Devices
    Http://livro.urubatan.com.br



    fisl@urubatancom.br             http://www.urubatan.com.br

Weitere ähnliche Inhalte

Was ist angesagt?

Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereJuliano Martins
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJSRodrigo Branas
 
Autenticação com AngularJS e loadOnDemand
Autenticação com AngularJS e loadOnDemandAutenticação com AngularJS e loadOnDemand
Autenticação com AngularJS e loadOnDemandDouglas Lira
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaNelson Glauber Leal
 
O Poderoso AngularJS
O Poderoso AngularJSO Poderoso AngularJS
O Poderoso AngularJSBeto Muniz
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideSergio Azevedo
 
Acessibilidade na Web: Construíndo páginas para pessoas e não só para máquinas
Acessibilidade na Web: Construíndo páginas para pessoas e não só para máquinasAcessibilidade na Web: Construíndo páginas para pessoas e não só para máquinas
Acessibilidade na Web: Construíndo páginas para pessoas e não só para máquinasReinaldo Ferraz
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)Zeno Rocha
 
A saga dos 12 tópicos de acessibilidade na Web
A saga dos 12 tópicos de acessibilidade na WebA saga dos 12 tópicos de acessibilidade na Web
A saga dos 12 tópicos de acessibilidade na WebReinaldo Ferraz
 
Acessibilidade na Web - Desenvolvendo para pessoas e não só para máquinas
Acessibilidade na Web - Desenvolvendo para pessoas e não só para máquinasAcessibilidade na Web - Desenvolvendo para pessoas e não só para máquinas
Acessibilidade na Web - Desenvolvendo para pessoas e não só para máquinasCentro Web
 
Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...
Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...
Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...Centro Web
 
Portando sua aplicação web para iphone
Portando sua aplicação web para iphonePortando sua aplicação web para iphone
Portando sua aplicação web para iphoneRenato Nitta
 
HTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da WebHTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da WebDiego Pessoa
 
Android Wear - Workshop por @cesarnogcps
Android Wear - Workshop por @cesarnogcpsAndroid Wear - Workshop por @cesarnogcps
Android Wear - Workshop por @cesarnogcpsCesar Augusto Nogueira
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
Tutorial sobre Jquery
Tutorial sobre JqueryTutorial sobre Jquery
Tutorial sobre JqueryIvo Calado
 
Tutorial sobre Bootstrap
Tutorial sobre BootstrapTutorial sobre Bootstrap
Tutorial sobre BootstrapIvo Calado
 

Was ist angesagt? (20)

Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
 
Vue.js
Vue.jsVue.js
Vue.js
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 
Autenticação com AngularJS e loadOnDemand
Autenticação com AngularJS e loadOnDemandAutenticação com AngularJS e loadOnDemand
Autenticação com AngularJS e loadOnDemand
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certa
 
O Poderoso AngularJS
O Poderoso AngularJSO Poderoso AngularJS
O Poderoso AngularJS
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-Side
 
Acessibilidade na Web: Construíndo páginas para pessoas e não só para máquinas
Acessibilidade na Web: Construíndo páginas para pessoas e não só para máquinasAcessibilidade na Web: Construíndo páginas para pessoas e não só para máquinas
Acessibilidade na Web: Construíndo páginas para pessoas e não só para máquinas
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
Conhecendo o Android Wear
Conhecendo o Android WearConhecendo o Android Wear
Conhecendo o Android Wear
 
A saga dos 12 tópicos de acessibilidade na Web
A saga dos 12 tópicos de acessibilidade na WebA saga dos 12 tópicos de acessibilidade na Web
A saga dos 12 tópicos de acessibilidade na Web
 
Acessibilidade na Web - Desenvolvendo para pessoas e não só para máquinas
Acessibilidade na Web - Desenvolvendo para pessoas e não só para máquinasAcessibilidade na Web - Desenvolvendo para pessoas e não só para máquinas
Acessibilidade na Web - Desenvolvendo para pessoas e não só para máquinas
 
Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...
Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...
Html acessivel - Um guia rápido para melhorar a acessibilidade das suas págin...
 
Portando sua aplicação web para iphone
Portando sua aplicação web para iphonePortando sua aplicação web para iphone
Portando sua aplicação web para iphone
 
HTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da WebHTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da Web
 
Curso AngularJS - Parte 2
Curso AngularJS - Parte 2Curso AngularJS - Parte 2
Curso AngularJS - Parte 2
 
Android Wear - Workshop por @cesarnogcps
Android Wear - Workshop por @cesarnogcpsAndroid Wear - Workshop por @cesarnogcps
Android Wear - Workshop por @cesarnogcps
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
Tutorial sobre Jquery
Tutorial sobre JqueryTutorial sobre Jquery
Tutorial sobre Jquery
 
Tutorial sobre Bootstrap
Tutorial sobre BootstrapTutorial sobre Bootstrap
Tutorial sobre Bootstrap
 

Ähnlich wie Desenvolvendo aplicacoes mobile_com_html_css_

Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaJoselito Nascimento
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sitesthiagolima
 
PHP e o Desenvolvimento Mobile Web - PHPhederal
PHP e o Desenvolvimento Mobile Web - PHPhederalPHP e o Desenvolvimento Mobile Web - PHPhederal
PHP e o Desenvolvimento Mobile Web - PHPhederalBruno Fernandes "PorKaria"
 
Aula Aula03 estrutura phone_gap
Aula Aula03 estrutura phone_gapAula Aula03 estrutura phone_gap
Aula Aula03 estrutura phone_gapRoberson Alves
 
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...Cristofer Sousa
 
Criando uma arquitetura de front-end do zero
Criando uma arquitetura de front-end do zeroCriando uma arquitetura de front-end do zero
Criando uma arquitetura de front-end do zeroEduardo Shiota Yasuda
 
Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023Nelson Glauber Leal
 
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Stefanini
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHPigorpimentel
 
Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Rodrigo Kono
 
Palestra urutai-mobile
Palestra urutai-mobilePalestra urutai-mobile
Palestra urutai-mobileRogerio Fontes
 
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebNovo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebLeonardo Balter
 
Programação Android Phonegap 1
Programação Android Phonegap 1Programação Android Phonegap 1
Programação Android Phonegap 1Adilmar Dantas
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScriptHeider Lopes
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Phonegap - Framework Mobile
Phonegap - Framework MobilePhonegap - Framework Mobile
Phonegap - Framework MobileIldyone Martins
 

Ähnlich wie Desenvolvendo aplicacoes mobile_com_html_css_ (20)

Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
 
JQuery Mobile
JQuery MobileJQuery Mobile
JQuery Mobile
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
 
O poder das Progressive Web Apps
O poder das Progressive Web AppsO poder das Progressive Web Apps
O poder das Progressive Web Apps
 
PHP e o Desenvolvimento Mobile Web - PHPhederal
PHP e o Desenvolvimento Mobile Web - PHPhederalPHP e o Desenvolvimento Mobile Web - PHPhederal
PHP e o Desenvolvimento Mobile Web - PHPhederal
 
Aula Aula03 estrutura phone_gap
Aula Aula03 estrutura phone_gapAula Aula03 estrutura phone_gap
Aula Aula03 estrutura phone_gap
 
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
 
Criando uma arquitetura de front-end do zero
Criando uma arquitetura de front-end do zeroCriando uma arquitetura de front-end do zero
Criando uma arquitetura de front-end do zero
 
Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023
 
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
 
PHP e o Desenvolvimento Mobile Web
PHP e o Desenvolvimento Mobile WebPHP e o Desenvolvimento Mobile Web
PHP e o Desenvolvimento Mobile Web
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
 
Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3Surpreenda-se com o Silverlight 3
Surpreenda-se com o Silverlight 3
 
Palestra urutai-mobile
Palestra urutai-mobilePalestra urutai-mobile
Palestra urutai-mobile
 
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebNovo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
 
Programação Android Phonegap 1
Programação Android Phonegap 1Programação Android Phonegap 1
Programação Android Phonegap 1
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScript
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Phonegap - Framework Mobile
Phonegap - Framework MobilePhonegap - Framework Mobile
Phonegap - Framework Mobile
 

Mehr von Rodrigo Urubatan

Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?Rodrigo Urubatan
 
Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?Rodrigo Urubatan
 
2018 the conf put git to work - increase the quality of your rails project...
2018 the conf   put git to work -  increase the quality of your rails project...2018 the conf   put git to work -  increase the quality of your rails project...
2018 the conf put git to work - increase the quality of your rails project...Rodrigo Urubatan
 
2018 RubyHACK: put git to work - increase the quality of your rails project...
2018 RubyHACK:  put git to work -  increase the quality of your rails project...2018 RubyHACK:  put git to work -  increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...Rodrigo Urubatan
 
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...Rodrigo Urubatan
 
Your first game with unity3d framework
Your first game with unity3d frameworkYour first game with unity3d framework
Your first game with unity3d frameworkRodrigo Urubatan
 
Tdc Floripa 2017 - 8 falácias da programação distribuída
Tdc Floripa 2017 -  8 falácias da programação distribuídaTdc Floripa 2017 -  8 falácias da programação distribuída
Tdc Floripa 2017 - 8 falácias da programação distribuídaRodrigo Urubatan
 
Rubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDDRubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDDRodrigo Urubatan
 
resolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddresolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddRodrigo Urubatan
 
vantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remotovantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remotoRodrigo Urubatan
 
Using BDD to Solve communication problems
Using BDD to Solve communication problemsUsing BDD to Solve communication problems
Using BDD to Solve communication problemsRodrigo Urubatan
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextFull Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextRodrigo Urubatan
 
Ruby para programadores java
Ruby para programadores javaRuby para programadores java
Ruby para programadores javaRodrigo Urubatan
 
Treinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HPTreinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HPRodrigo Urubatan
 
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Ruby on rails  impressione a você mesmo, seu chefe e seu clienteRuby on rails  impressione a você mesmo, seu chefe e seu cliente
Ruby on rails impressione a você mesmo, seu chefe e seu clienteRodrigo Urubatan
 

Mehr von Rodrigo Urubatan (20)

Ruby code smells
Ruby code smellsRuby code smells
Ruby code smells
 
Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby is it possible? is it fast? should we use it?
 
Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?Data science in ruby, is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?
 
2018 the conf put git to work - increase the quality of your rails project...
2018 the conf   put git to work -  increase the quality of your rails project...2018 the conf   put git to work -  increase the quality of your rails project...
2018 the conf put git to work - increase the quality of your rails project...
 
2018 RubyHACK: put git to work - increase the quality of your rails project...
2018 RubyHACK:  put git to work -  increase the quality of your rails project...2018 RubyHACK:  put git to work -  increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...
 
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
 
Your first game with unity3d framework
Your first game with unity3d frameworkYour first game with unity3d framework
Your first game with unity3d framework
 
Tdc Floripa 2017 - 8 falácias da programação distribuída
Tdc Floripa 2017 -  8 falácias da programação distribuídaTdc Floripa 2017 -  8 falácias da programação distribuída
Tdc Floripa 2017 - 8 falácias da programação distribuída
 
Rubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDDRubyconf2016 - Solving communication problems in distributed teams with BDD
Rubyconf2016 - Solving communication problems in distributed teams with BDD
 
resolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddresolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bdd
 
vantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remotovantagens e desvantagens de trabalhar remoto
vantagens e desvantagens de trabalhar remoto
 
Using BDD to Solve communication problems
Using BDD to Solve communication problemsUsing BDD to Solve communication problems
Using BDD to Solve communication problems
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full TextFull Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
 
Ruby para programadores java
Ruby para programadores javaRuby para programadores java
Ruby para programadores java
 
Treinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HPTreinamento html5, css e java script apresentado na HP
Treinamento html5, css e java script apresentado na HP
 
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Ruby on rails  impressione a você mesmo, seu chefe e seu clienteRuby on rails  impressione a você mesmo, seu chefe e seu cliente
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
 
Mini curso rails 3
Mini curso rails 3Mini curso rails 3
Mini curso rails 3
 

Desenvolvendo aplicacoes mobile_com_html_css_

  • 1. Desenvolvendo aplicações Mobile com HTML, CSS e JavaScript Aproveitando o conhecimento Web no desenvolvimento Mobile fisl@urubatancom.br http://www.urubatan.com.br
  • 2. Palestrante Rodrigo Urubatan (@urubatan no Twitter) trabalha com desenvolvimento de software desde 1997. Já desenvolveu sistemas em uma gama de linguagens e ambientes, incluindo Delphi, C, C++, PHP, ASP, ColdFusion, Assembly, Leather, Ruby e Java. Atualmente trabalha com pesquisa e desenvolvimento na HP, utilizando principalmente Java, Flex e Ruby, e já ministrou cursos e palestras em diversos eventos pelo Brasil. Autor do livro Ruby On Rails: Desenvolvimento Fácil e Rápido de Aplicações Web. fisl@urubatancom.br http://www.urubatan.com.br
  • 3. Primeira idéia • Symbian e WebOS suportam aplicações escritas em HTML+CSS+Javascript nativamente • Seria legal fazer o mesmo para Android e iOS • Vou criar um esqueleto de aplicação com WebKit e rodar minha app Symbian WRT no Android! fisl@urubatancom.br http://www.urubatan.com.br
  • 4. Esqueleto de aplicação Android Portando WRT para Android fisl@urubatancom.br http://www.urubatan.com.br
  • 5. Layout (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <WebView android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> fisl@urubatancom.br http://www.urubatan.com.br
  • 6. Activity @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); web = (WebView) findViewById(R.id.webView); WebSettings settings = web.getSettings(); settings.setJavaScriptEnabled(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setSupportMultipleWindows(true); settings.setSupportZoom(false); settings.setPluginsEnabled(true); web.setVerticalScrollBarEnabled(true); web.setHorizontalScrollBarEnabled(false); // Our application's main page will be loaded web.loadUrl("file:///android_asset/index.html"); } fisl@urubatancom.br http://www.urubatan.com.br
  • 7. Port da API WRT • É necessário expor os objetos da API WRT para a aplicação Android o device o widget o menu • WebView.addJavascriptInterface(objetoJava, “nomeNoJavascript”) fisl@urubatancom.br http://www.urubatan.com.br
  • 8. Isto daria muito trabalho Uma das maiores virtudes dos programadores é a preguiça. fisl@urubatancom.br http://www.urubatan.com.br
  • 9. Open Source for the Rescue Alguem já deve ter feito isto por mim fisl@urubatancom.br http://www.urubatan.com.br
  • 10. Opções • PhoneGap o APIs Javascript para acesso a recursos de dispositivos moveis o Suporte para iOS, Android, Symbian, Windoes Mobile, WebOS, Bada (em desenvolvimento), WindowsPhone 7 (em desenvolvimento) o UI desenvolvida com Frameworks JS+CSS o Licensa BSD ou MIT o que for mais conveniente • Titanium Mobile o APIs Javascript para acesso a recursos de dispositivos moveis o Suporte para iOS e Android o API para UI disponivel com L&F nativos o Apache + Comercial para modulos adicionais e suporte fisl@urubatancom.br http://www.urubatan.com.br
  • 11. Opção e Motivos da Escolha - 1 • Titanium Mobile o Falta suporte para Symbian o API única para todas as plataformas o API própria para UI o Possibilidade de utilizar quase o mesmo código para gerar aplicações Mobile e Desktop  Nos exemplos apresentados o código é diferente*  Mesmo assim, a possibilidade de compartilhar código é muito interessante o Ambiente de desenvolvimento próprio o Build service - gera aplicação nativa para android e iOS a partir dos fontes enviados (Serviço pago) fisl@urubatancom.br http://www.urubatan.com.br
  • 12. Opção e Motivos da Escolha - 2 • PhoneGap o Eu uso e gosto do Symbian o Possui uma API única para todos os dispositivos  Com algumas excessões de coisas que funcionam e uma e não na outra mas isto esta documentado o Eu já conheço gosto de diversos frameworks Javascript o Existem frameworks Javascript que me permitem ter uma UI "nativa" em todas as plataformas o Possibilidade de utilizar a IDE ou editor de textos que me convier o Phonegap Build - serviço que gera apps nativas para todas as plataformas suportadas a partir de um código único (Serviço pago) fisl@urubatancom.br http://www.urubatan.com.br
  • 13. Desvantagens • Em ambos os casos é necessário ter os SDKs para cada uma das plataformas instalado na maquina (Exceto se for utilizar o serviço de build) • Em ambos os casos se for necessária para a aplicação uma API não disponível no framework, sera necessário implementar nativamente para cada uma das plataformas desejadas fisl@urubatancom.br http://www.urubatan.com.br
  • 14. PhoneGap Meu framework favorito para esta tarefa fisl@urubatancom.br http://www.urubatan.com.br
  • 15. APIs nativas disponíveis Acelerometer Camera Capture Compass Connection Contacts Device Events File Geolocation Media Network Notification Storage fisl@urubatancom.br http://www.urubatan.com.br
  • 16. Frameworks disponíveis para UI • jQuery Mobile • jQTouch • Sencha Touch • Guarana-UI • Nokia Web Templates for High-End Devices • Muitos mais pela web ... fisl@urubatancom.br http://www.urubatan.com.br
  • 17. Pequeno exemplo • Este é o código de uma API escrita diretamente para Nokia WRT portada depois para Android utilizando PhoneGap • É uma APP gratuita disponível na OviStore fisl@urubatancom.br http://www.urubatan.com.br
  • 18. Mobile Pomodoro fisl@urubatancom.br http://www.urubatan.com.br
  • 19. index.html <html> <head> <title>Mobile Pomodoro</title> <link rel="stylesheet" type="text/css" href="css/basic.css"/> <script type="text/javascript" src="lib/jquery.min.js"></script> <script type="text/javascript" src="lib/jquery.json-2.2.min.js"></script> <script type="text/javascript" src="lib/jquery.countdown/jquery.countdown.js"></script> <script type="text/javascript" src="lib/pomodoro.js"></script> <style type="text/css"> @import "lib/jquery.countdown/jquery.countdown.css"; </style> <script type="text/javascript"> $(document).ready(function(){ var app = new App("mobile_pomodoro"); app.initialize("timer"); $("#exit_btn").click(function(evt){ window.close(); }); }); </script> </head> fisl@urubatancom.br http://www.urubatan.com.br
  • 20. index.html (2) <body> <h1 id="header" style="background: url(icon.png) no-repeat;"> Mobile Pomodoro </h1> <div id="screen_one" class="screen"> <div id="timer"> </div> <div id="controls"> <div id="timer_pomodoro" class="button pomodoro">Start Pomodoro</div> <div id="timer_break" class="button break">Take a Break</div> <div id="exit_btn" class="button exit">Exit</div> </div> </div> </body> </html> fisl@urubatancom.br http://www.urubatan.com.br
  • 21. basic.css body { font-family:Verdana; background-color:#1c1c1c; color: #fff; margin: 0; padding: 0; } #header { text-indent: 50px; fisl@urubatancom.br http://www.urubatan.com.br
  • 22. basic.css (2) .button { height: 30px; line-height: 30px; text-align: center; text-indent: 30px; vertical-align: middle; background-repeat: no-repeat; right: 20px; left: 20px; fisl@urubatancom.br http://www.urubatan.com.br
  • 23. basic.css (3) .break { background-image: url('../images/coffee_mug.png'); } .exit { background-image: url('../images/exit.png'); } #timer { background-color: #1C1C1C; fisl@urubatancom.br http://www.urubatan.com.br
  • 24. pomodoro.js function App(name){ this.settings = { pomodoro_time: 25, interval_time: 5 }; this.history = []; this.name = name; this.saveSettings = function(){ if (window.widget) { widget.setPreferenceForKey($.toJSON(this.settings), 'settings'); } } this.saveHistory = function(){ if (window.widget) { widget.setPreferenceForKey($.toJSON(this.history), 'history'); } } fisl@urubatancom.br http://www.urubatan.com.br
  • 25. pomodoro.js (2) this.loadSettings = function(){ if (window.widget) { var rawJSON = window.widget.preferenceForKey('settings'); if (rawJSON != "" && rawJSON != null && rawJSON != undefined) { this.settings = $.evalJSON(rawJSON); } } $(this).trigger("settings_loaded"); } this.loadHistory = function(){ if (window.widget) { var rawJSON = window.widget.preferenceForKey('history'); if (rawJSON != "" && rawJSON != null && rawJSON != undefined) { this.history = $.evalJSON(rawJSON); } } $(this).trigger("settings_loaded"); } this.loadSettings(); this.loadHistory(); fisl@urubatancom.br http://www.urubatan.com.br window.app = this;
  • 26. pomodoro.js (3) App.prototype.initialize = function(timer_id){ window.app.timer_id = timer_id; $("#" + timer_id).countdown({ until: 0, format: 'HMS' }); $("#" + timer_id + "_pomodoro").click(window.app.startPomodoro); $("#" + timer_id + "_break").click(window.app.startBreak); $('body').append('<div id="' + window.app.name + 'player" style="display:none"></div>'); if (window.menu) { window.menu.showSoftkeys(); var pomodoroMenu = new MenuItem("Start Pomodoro", 101); pomodoroMenu.onSelect = function(idx){ window.app.startPomodoro(); } var breakMenu = new MenuItem("Take a Break", 111); breakMenu.onSelect = function(idx){ window.app.startBreak(); } window.menu.clear(); fisl@urubatancom.br http://www.urubatan.com.br window.menu.append(pomodoroMenu);
  • 27. pomodoro.js(4) App.prototype.timeUp = function(){ window.app.playSound(); window.app.vibrate(); } App.prototype.startPomodoro = function(evt){ var time = window.app.settings.pomodoro_time * 60; $('#' + window.app.timer_id).countdown("change", { until: time, format: 'HMS', onExpiry: window.app.timeUp }); return false; } App.prototype.startBreak = function(evt){ var time = window.app.settings.interval_time * 60; $('#' + window.app.timer_id).countdown("change", { until: time, format: 'HMS', onExpiry: window.app.timeUp }); fisl@urubatancom.br http://www.urubatan.com.br return false;
  • 28. Problemas  API para menus ainda não disponível multi plataforma  Mas isto raramente é utilizado para dispositivos touch screen  Algumas vezes é necessário adicionar alguns Ifs para adicionar código especifico para alguma plataforma fisl@urubatancom.br http://www.urubatan.com.br
  • 29. Geolocalization // onSuccess Callback // This method accepts a `Position` object, which contains // the current GPS coordinates // var onSuccess = function(position) { alert('Latitude: ' + position.coords.latitude + 'n' + 'Longitude: ' + position.coords.longitude fisl@urubatancom.br http://www.urubatan.com.br
  • 30. Captura de Imagens navigator.camera.getPicture(onSuccess, onFail, { quality: 50, destinationType: Camera.DestinationType.FILE_URI }); function onSuccess(imageURI) { var image = document.getElementById('myImage'); image.src = imageURI; fisl@urubatancom.br http://www.urubatan.com.br
  • 31. ?!?!?! fisl@urubatancom.br http://www.urubatan.com.br
  • 32. Referências  http://www.urubatan.com.br  http://phonegap.com  jQuery Mobile  JQTouch  Sencha Touch  Guarana-UI  Nokia Web Templates for High-End Devices  Http://livro.urubatan.com.br fisl@urubatancom.br http://www.urubatan.com.br