mini curso android

Post on 06-May-2015

343 Views

Category:

Education

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

Introdução ao desenvolvimento de aplicações móveis utilizando a plataforma Android.

TRANSCRIPT

Android 100% Hands-on

GOOGLE ANdroidMario Jorge Pereira

2001

2002

2003

2004

2005

2006

2007

2008

2009

2010

2011

2012

2013

2014

2015

Por onde começar?

http://developer.android.com

ADT Bundle*:

• Eclipse + ADT plugin

• Android SDK Tools

• Android Platform-tools

*Pré requisito: JDK instalada

Desenvolvimento

Chega de Bla Bla Bla!

Vamos Começar?

Eclipse + ADT

Olá MundoFi

le >

New

> A

ndro

id A

pplic

atio

n Pr

ojec

t

File

> N

ew >

And

roid

App

licat

ion

Proj

ect

Olá Mundo

File

> N

ew >

And

roid

App

licat

ion

Proj

ect

Olá Mundo

File

> N

ew >

And

roid

App

licat

ion

Proj

ect

Olá Mundo

Olá Mundo

Para rodar precisamos do emulador

Vamos criar?

AVD Android Virtual Device Maneger

Android SDK Maneger

AVD Android Virtual Device Maneger

Inicie o emulador que voce criou?

Isso demora :( …

Depois que abrir não feche o Emulador!!

Run As.. Android application

Importante!

Activity

XML

public class OlaMundo extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); } }

src/ (código fonte: .java)"

gen/ (código gerado: R.java )"

bin/ (bytecodes: .dex)"

libs/ (bibliotecas)"

res/ (recursos: layouts, strigs, icones …)"

assets/ (outros recursos: arquivos em geral)Es

trutu

ra

<?xml version="1.0" encoding="

utf-8"?>

<resources>! <string nam

e="app_name">Alo Mundo</string

>

<string name="action_setti

ngs">Settings</string>

<string name="hello_world"

>Hello world!</string>

!</resources>

strings.xml

/* AUTO-GENERATED FILE. DO NO

T MODIFY.*/

public final class R {

public static final class

attr {

} public stat

ic final class dimen {

public static final int

activity_horizontal_margin=0x

7f040000;

public static final in

t activity_vertical_margin=0x7

f040001;

} public stati

c final class layout {

public static final in

t activity_main=0x7f030000;

} ...}

R.java

<?xml version="1.0" encoding=“

utf-8"?>

<manifest ...>

... <applicatio

n ... >

<activity

android:name="br.c

om.mariojp.olamundo.OlaMundoAc

tivity"

android:label="@st

ring/app_name" >

<intent-filter>

<action androi

d:name="android.intent.action.

MAIN" />

<category andr

oid:name="android.intent.categ

ory.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

AndroidManifest.xml

Log.[nivel](“TAG”,“MENSAGEM”);

!

Log.v (Verbose)Log.d (Debug)Log.i (Info)Log.w (Warning)Log.e (Erro)Log.wtf (...)

Log

public class OlaMundoActivity extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("Ola mundo", "onCreate");! }!}

OlaMundoActivity.java

use o logging: Log.i(“Ciclo de Vida”,”<método>”) nos métodos onCreate, onStart, onResume, onRestart, onPause, onStop e onDestroy.

Entendendo o ciclo de vida

Run As.. Android application

Quais os métodos são chamados quando a aplicação inicia?

O que Aconteceu

Quando clicar em voltar qual método é executado?

Alterando o aplicativo de Retrato para paisagem (control +F11) o que acontece?

Ainda no OlaMundo

O arquivo OlaMundoActivity.java

public class OlaMundo extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); }!}

Na pasta res/layout

1. Renomear o arquivo fragment_ola_mundo.xml para activity_ola_mundo.xml

!

2. Alterar a propriedade: tools:context=“br.com.mariojp.OlaMundoActivity”

Um pouco de Layout

activity_ola_mundo.xml

<RelativeLayout ... >

... <Button android

:id="@+id/botao"

android:layout_width="

wrap_content"

android:layout_height=

"wrap_content"

android:text="Botao" /

>

...</RelativeLayou

t>

activity_ola_mundo.xml

Run As.. Android application

<LinearLayout xmlns:android="h

ttp://schemas.android.com/apk/

res/android"

xmlns:tools="http://schema

s.android.com/tools"

android:layout_width="matc

h_parent"

android:layout_height="mat

ch_parent"

android:orientation="horiz

ontal"

tools:context="br.com.mariojp.

olamundo.OlaMundoActivity" >

!. . .

!</LinearLayout>

activity_ola_mundo.xml

Run As.. Android application

<LinearLayout xmlns:android="h

ttp://schemas.android.com/apk/

res/android"

xmlns:tools="http://schema

s.android.com/tools"

android:layout_width="matc

h_parent"

android:layout_height="mat

ch_parent"

android:orientation="verti

cal"

tools:context="br.com.mariojp.

olamundo.OlaMundoActivity" >

!. . .

!</LinearLayout>

activity_ola_mundo.xml

Run As.. Android application

<RelativeLayout ... >

... <Button android

:id="@+id/botao"

android:layout_width="

match_parent"

android:layout_height=

"wrap_content"

android:text="Botao" /

>

...</RelativeLayou

t>

activity_ola_mundo.xml

Run As.. Android application

Um pouco de Comportamento

OlaMundoActivity.java

[Tipo] var = ([Tipo]) findViewById(R.id.[id]);

!var.metodo();!

findbyid

<RelativeLayout ... >

... <TextView

android:id="@+id/texto

"

android:layout_width="

wrap_content"

android:layout_height=

"wrap_content"

android:text="@string/

hello_world" />

...</RelativeLayou

t>

activity_ola_mundo.xml

public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); TextView texto = (TextView) findViewById(R.id.texto); texto.setText("Outro Texto"); }!}

OlaMundoActivity.java

Run As.. Android application

Botão Aplicação

Listener

Clicou?

Ação do Botão

public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo);! Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new Ouvinte()); }}

OlaMundoActivity.java

public class Ouvinte implements OnClickListener {! @Override public void onClick(View clicado) { Log.i("TAG", "Botao Clicado"); }!}

Ouvinte.java

Run As.. Android application

public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i("TAG", "Botao Clicado"); } }); }}

OlaMundoActivity.java

Run As.. Android application

<RelativeLayout ... >

... <Button

android:id="@+id/botao

"

android:layout_width="

wrap_content"

android:layout_height=

"wrap_content"

android:text="Botao"

android:onClick="metod

o" />

...</RelativeLayou

t>

activity_ola_mundo.xml

public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); } public void metodo(View v) { Log.i("TAG", "Botao Clicado"); }

OlaMundoActivity.java

Run As.. Android application

Toast.makeText(this, "TEXTO", Toast.LENGTH_LONG).s

how();

!!Toast.LENGTH_LONG!Toast.LENGTH_SHORT!

TOAST

public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); } public void metodo(View v) { Toast.makeText(this, "AloMundo!", Toast.LENGTH_LONG).show();

}!}

OlaMundoActivity.java

Run As.. Android application

Faculdade

File > New > Android Application Project

Crie o projeto Android

File > New > Android Application Project

public class ListaDisciplinas extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lista_diciplinas); }}

ListaDisciplinas.java

<?xml version="1.0" encoding="

utf-8"?>

<LinearLayout

xmlns:android="http://schema

s.android.com/apk/res/android"

android:layout_width="match_

parent"

android:layout_height="match

_parent" >

! <ListView

android:id="@+id/lista

_disciplinas"

android:layout_width="

match_parent"

android:layout_height=

"match_parent" >

</ListView>

!</LinearLayout>

lista_disciplinas.xml

public class ListaDisciplinas extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lista_diciplinas);! String[] disciplinas = {"Redes", "Algoritimos", "Programacao"};

int layout = android.R.layout.simple_list_item_1;! ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,layout, disciplinas);! ListView lista = (ListView) findViewById(R.id.lista_disciplinas);

! lista.setAdapter(adapter);! }}

ListaDisciplinas.java

Run As.. Android application

public class ListaDisciplinas extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { ...! lista.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> adapter, View view,

int posicao, long id) { Toast.makeText(ListaDisciplinas.this, "Clicou "+posicao,

Toast.LENGTH_SHORT).show(); } }); }}

ListaDisciplinas.java

Run As.. Android application

public class ListaDisciplinas extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { ... lista.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick(AdapterView<?> adapter, View view, int posicao, long id) { Toast.makeText( ListaDisciplinas.this, adapter.getItemAtPosition(posicao).toString(),

Toast.LENGTH_SHORT).show(); return false; } }); }}

ListaDisciplinas.java

Run As.. Android application

O que aconteceu ate aqui?

Repare que o onItemLongClick retorna false => troque por

true.

Run As.. Android application

Vamos criar um formulário

File

> N

ew >

And

roid

XM

L Fi

le

res/layout/disciplina.xml

<?xml version="1.0" encoding="

utf-8"?>

<LinearLayout xmlns:android="h

ttp://schemas.android.com/apk/

res/android"

android:layout_width="matc

h_parent"

android:layout_height="mat

ch_parent"

android:orientation="verti

cal" >

<ImageView

android:layout_width="

wrap_content"

android:layout_height=

"wrap_content"

android:src="@drawable

/ic_launcher" />

<TextView

android:layout_width="

wrap_content"

android:layout_height=

"wrap_content"

android:text="Discipli

na" />

<EditText android:id="@+id

/disciplina"

android:layout_width="

match_parent"

android:layout_height=

"wrap_content"

android:ems="10" >

<requestFocus />

</EditText>

. . .</LinearLayout>

disciplinas.xml

<?xml version="1.0" encoding="

utf-8"?>

<LinearLayout xmlns:android=“h

ttp://schemas.android.com/apk/

res/android"

android:layout_width="matc

h_parent"

android:layout_height="mat

ch_parent"

android:orientation="verti

cal" >

!. . .! <EditText

android:id="@+id/nota2

"

android:layout_width="

match_parent"

android:layout_height=

"wrap_content"

android:ems="10"

android:inputType="num

berSigned" />

<Button android

:id="@+id/botao"

android:layout_width="

wrap_content"

android:layout_height=

"wrap_content"

android:text="Salvar"

/>

!</LinearLayout>

disciplinas.xml

Pode usar o Editor

android.app.Activity

File

> N

ew >

Cla

ss

public class DisciplinaActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.disciplina); }!}

DisciplinaActivity.java

public class ListaDisciplinas extends Activity { . . . public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.lista_disciplinas, menu); return super.onCreateOptionsMenu(menu); }}

ListaDisciplinas.java

<menu xmlns:android="http://sc

hemas.android.com/apk/res/andr

oid"

xmlns:tools="http://schema

s.android.com/tools"

tools:context="br.com.mari

ojp.faculdade.ListaDisciplinas

" >

! <item android

:id="@+id/novo"

android:showAsAction="

always"

android:icon="@android

:drawable/btn_plus"

android:title="Novo"/>

!</menu>

lista_disciplinas.xml

public class ListaDisciplinas extends Activity { . . . public boolean onOptionsItemSelected(MenuItem item) { int itemClicado = item.getItemId(); switch (itemClicado) { case R.id.novo: Intent intent = new Intent(this, Disciplina.class); startActivity(intent); break; default: break; } return super.onOptionsItemSelected(item); }}

ListaDisciplinas.java

Run As.. Android application

<?xml version="1.0" encoding=“

utf-8"?>

<manifest ...>

. . . <applicatio

n ... >

<activity android:name

="br.com.mariojp.faculdade.Dis

ciplina">

</activity>

. . . </applicati

on>

</manifest>

AndroidManifest.xml

Run As.. Android application

public class DisciplinaActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.disciplina); Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); }

DisciplinaActivity.java

Run As.. Android application

Banco de dados

Vamos pensar um pouco…

DisciplinaDAO

SQLiteOpenHelper

ListaDisciplinas

public class Disciplina { private Long id; private String disciplina; private String professor; private String email; private Double nota1; private Double nota2;// Gerar Get’s e Set's}

Disciplina.java

public class DisciplinaDAO extends SQLiteOpenHelper {! private static final String DATABASE = "BancoDisciplinas"; private static final int VERSAO = 1;! public DisciplinaDAO(Context context) { super(context, DATABASE, null, VERSAO); }!//...!}

DisciplinaDAO.java

public class DisciplinaDAO extends SQLiteOpenHelper {! private static final String DATABASE = "BancoDisciplinas"; private static final int VERSAO = 1;! public DisciplinaDAO(Context context) { super(context, DATABASE, null, VERSAO); }! public void onCreate(SQLiteDatabase db) { String ddl ="CREATE TABLE Disciplinas (id INTEGER PRIMARY KEY,"

+ " disciplina TEXT UNIQUE NOT NULL," + " professor TEXT," + " email TEXT," + " nota1 REAL, nota2 REAL);"; db.execSQL(ddl); }!//...!}

DisciplinaDAO.java

public class DisciplinaDAO extends SQLiteOpenHelper {! private static final String DATABASE = "BancoDisciplinas"; private static final int VERSAO = 1;! public DisciplinaDAO(Context context) { super(context, DATABASE, null, VERSAO); }//...! @Override public void onUpgrade(SQLiteDatabase db, int velha, int nova) {

String ddl ="DROP TABLE IF EXISTS Disciplinas"; db.execSQL(ddl); onCreate(db); }!//...}

DisciplinaDAO.java

public class DisciplinaDAO extends SQLiteOpenHelper {!//...! public void salvar(Disciplina disciplina) { ContentValues values = new ContentValues(); values.put("disciplina", disciplina.getDisciplina()); values.put("professor", disciplina.getProfessor()); values.put("email", disciplina.getEmail()); values.put("nota1", disciplina.getNota1()); values.put("nota2", disciplina.getNota2()); getWritableDatabase().insert("Disciplinas", null, values );

}!//...}

DisciplinaDAO.java

public class DisciplinaActivity extends Activity { private EditText nomeDisciplina; // ...nomeProfessor, email, nota1, nota2;

! protected void onCreate(Bundle savedInstanceState) { nomeDisciplina = (EditText) findViewById(R.id.disciplina);

//... outros findViewById! Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Disciplina disciplina = new Disciplina(); disciplina.setDisciplina(nomeDisciplina.getText().toString());

// outros set's DisciplinaDAO dao = new DisciplinaDAO(DisciplinaActivity.this);

dao.salvar(disciplina); dao.close(); finish(); } }); }}

DisciplinaActivity.java

public class ListaDisciplinas extends Activity {!private ListView lista;!protected void onCreate(Bundle savedInstanceState) {//... lista = (ListView) findViewById(R.id.lista_disciplinas);! DisciplinaDAO dao = new DisciplinaDAO(this); ArrayList<Disciplina> disciplinas= dao.getLista(); dao.close();! ArrayAdapter<Disciplina> adapter = new ArrayAdapter<Disciplina>(

this, android.R.layout.simple_list_item_1, disciplinas);

lista.setAdapter(adapter);//... }//...}

ListaDisciplinas.java

Run As.. Android application

public class ListaDisciplinas extends Activity {//...protected void onResume() { super.onResume(); DisciplinaDAO dao = new DisciplinaDAO(this); ArrayList<Disciplina> disciplinas= dao.getLista(); dao.close();! ArrayAdapter<Disciplina> adapter = new ArrayAdapter<Disciplina>(

this, layout,android.R.layout.simple_list_item_1); lista.setAdapter(adapter);}//...}

ListaDisciplinas.java

Run As.. Android application

public class ListaDisciplinas extends Activity {//... @Override protected void onResume() { super.onResume(); carregarLista(); }! private void carregarLista() { DisciplinaDAO dao = new DisciplinaDAO(this); ArrayList<Disciplina> disciplinas= dao.getLista(); dao.close(); int layout = android.R.layout.simple_list_item_1; ArrayAdapter<Disciplina> adapter = new ArrayAdapter<Disciplina>(this, layout, disciplinas); lista.setAdapter(adapter); }//...}

ListaDisciplinas.java

public class DisciplinaDAO extends SQLiteOpenHelper {//...! public void deletar(Disciplina disciplina) { String[] args = { disciplina.getId().toString() }; getWritableDatabase().delete("Disciplinas", "id=?", args); }!//...}

DisciplinaDAO.java

public class ListaDisciplinas extends Activity {!private ListView lista;!protected void onCreate(Bundle savedInstanceState) {//... lista = (ListView) findViewById(R.id.lista_disciplinas); registerForContextMenu(lista);//... }//...}

ListaDisciplinas.java

public class ListaDisciplinas extends Activity {//... @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add("Enviar E-mail"); MenuItem deletar = menu.add("Deletar"); deletar.setOnMenuItemClickListener(new OnMenuItemClickListener() {

@Override public boolean onMenuItemClick(MenuItem item) { DisciplinaDAO dao = new DisciplinaDAO(ListaDisciplinas.this);

dao.deletar(disciplina); dao.close(); carregarLista(); return false; } }); }//...}

ListaDisciplinas.java

public class ListaDisciplinas extends Activity {! private ListView lista; private Disciplina disciplina; protected void onCreate(Bundle savedInstanceState) // ... lista.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick(AdapterView<?> adapter, View view,int posicao, long id) { disciplina = (Disciplina) adapter.getItemAtPosition(posicao);

return false; } });// ... } // ...}

ListaDisciplinas.java

Run As.. Android application

lista.setOnItemClickListener(new OnItemClickListener() {! public void onItemClick(AdapterView<?> adapter, View view, int posicao, long id) {! Disciplina disciplina = (Disciplina) adapter.getItemAtPosition(posicao);

! Intent intent = new Intent(ListaDisciplinas.this,DisciplinaActivity.class);

! intent.putExtra("disciplinaSelecionada", disciplina);! startActivity(intent);! }});

ListaDisciplinas.java

public class DisciplinaActivity extends Activity { private EditText nomeDisciplina; // ...nomeProfessor, email, nota1, nota2;

protected void onCreate(Bundle savedInstanceState) { Button button = (Button) findViewById(R.id.botao); Intent intent = getIntent(); disciplinaSelecionada = (Disciplina) intent.getSerializableExtra("disciplinaSelecionada"); if(disciplinaSelecionada!=null){ button.setText("Alterar"); nomeDisciplina.setText(disciplinaSelecionada.getDisciplina());

} button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Disciplina disciplina = new Disciplina(); disciplina.setDisciplina(nomeDisciplina.getText().toString());

/. . . DisciplinaDAO dao = new DisciplinaDAO(DisciplinaActivity.this);

if(disciplinaSelecionada == null){ dao.salvar(disciplina); }else{ disciplina.setId(disciplinaSelecionada.getId());

dao.alterar(disciplina); } dao.close(); finish(); } }); }

}

DisciplinaActivity.java

public class DisciplinaDAO extends SQLiteOpenHelper {//... public void alterar(Disciplina disciplina) { ContentValues values = new ContentValues(); values.put("disciplina", disciplina.getDisciplina()); values.put("professor", disciplina.getProfessor()); values.put("email", disciplina.getEmail()); values.put("nota1", disciplina.getNota1()); values.put("nota2", disciplina.getNota2()); getWritableDatabase().update("Disciplinas", values, "id=?", new String[]{disciplina.getId().toString()}); }//...}

DisciplinaDAO.java

Run As.. Android application

public class ListaDisciplinas extends Activity { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); //. . . MenuItem email = menu.add("Enviar E-mail"); Intent intentEmail = new Intent(Intent.ACTION_SEND); intentEmail.setType("message/rfc822"); intentEmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "mariojp@gmail.com" }); intentEmail.putExtra(Intent.EXTRA_SUBJECT, "ANDROID"); intentEmail.putExtra(Intent.EXTRA_TEXT, "LEGAL!!!"); email.setIntent(intentEmail);//. . . }}

ListaDisciplinas.java

Run As.. Android application

public class DisciplinaActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { foto = (ImageView) findViewById(R.id.foto); foto.setOnClickListener(new OnClickListener() { ! @Override public void onClick(View v) { Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

caminho = Environment.getExternalStorageDirectory().toString()

+"/"+System.currentTimeMillis()+".png"; File arquivo = new File(caminho); Uri localImage = Uri.fromFile(arquivo); camera.putExtra(MediaStore.EXTRA_OUTPUT, localImage);

startActivityForResult(camera, 999); } });}}

DisciplinaActivity.java

public class DisciplinaActivity extends Activity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == 999){ if(resultCode == Activity.RESULT_OK){ Bitmap bitmap = BitmapFactory.decodeFile(caminho); Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 100, 100, true); foto.setImageBitmap(bitmapReduzido); }else{ caminho =null; } } }}

DisciplinaActivity.java

<?xml version="1.0" encoding=“

utf-8"?>

<manifest ...>

… <uses-permi

ssion android:name="android.pe

rmission.WRITE_EXTERNAL_STORAG

E" />

<uses-permission android:n

ame="android.permission.READ_E

XTERNAL_STORAGE" />

</manifest>

AndroidManifest.xml

Run As.. Android application

Esta obra está licenciada sob a licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada. Para ver uma cópia desta licença, visite http://creativecommons.org/licenses/by-sa/3.0/.

ANDROIDMario Jorge Pereira

Como me encontrar? http://www.mariojp.com.br twitter.com/@mariojp mariojp@gmail.com

top related