divad_1993si pudieras mandármelo al correo te lo agradecería mucho, divad_1993@hotmail.com1 month ago
Are you sure you want to
hazaelnEstoy interesado en un curso de android pueden enviarla a hazaelnmtz@gmail.com1 month ago
Are you sure you want to
brian54321hola,estoy interesado en la diapositiva me la mandas al correo djdmelo@live.com gracias9 months ago
Are you sure you want to
Carlos FumetaEstoy interesado en un curso de android... vivo en valencia, venezuela.. agradezco cualquier información .Pueden enviarla a mendez_fumeta@hotmail.com10 months ago
Are you sure you want to
Marcelo SotoAmigo me ayudarias con las diapositivas porfavor me harias un gran favor te dejo mi email allierilink@hotmail.com10 months ago
Are you sure you want to
MetalbetEstimado....me seria de mucha ayuda si pudieras enviarlo a mi correo, albertojfp@gmail.com, pues estoy a punto de terminar mi proyecto de titulo, y tengo algo relacionado a Android, y necesito interiorisarme mas en el tema.... Gracias y Saludos Metalbet10 months ago
Are you sure you want to
Ezequiel Pileggi at Ferrocarril General RocaBuen día! Quisiera descargar el archivo pero no está habilitado, me lo podrías enviar a mi correo? ezekielpileggi@hotmail.com Me sería de gran ayuda..11 months ago
Are you sure you want to
bernardbear15deseo descargar este archivo pero la opcion sta desabilitada.... me lo podrias enviar a mi correo marvel_spinal_7@hotmail.com te lo agradeceria mucho..grax11 months ago
Curso Introducción a androidPresentation Transcript
Introducción a Android
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Introducción a Android: un poco de historia
Introducción a Android: releases Versión Android Fecha release Android 1.5 (Cupcake) 30 abril de 2009 Android 1.6 (Donut) 15 septiembre de 2009 Android 2.0 (Eclair) 26 octubre de 2009 Android 2.2 (FroYo) Mayo de 2010 Gingerbread Finales de 2010
Introducción a Android: un poco de historia (II) Prototipo HTC Dream Nexus One Xperia x10 HTC Liquid GeeksPhone Samsung I7500
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Introducción a Android: ¿qué es Android?
¿Qué es?
Conjunto de software libre que incluye sistema operativo, middleware y aplicaciones.
Su objetivo es abstraer el hardware y facilitar el desarrollo de nuevas aplicaciones.
SDK: soporte y API para desarrollo de aplicaciones Android.
¿Qué no es?
Únicamente un dispositivo móvil
Una implementación JAVA ME.
Una marca de telefonía ni depende de ningún fabricante
La respuesta de Google al IPhone.
Introducción a Android: ¿qué es Android? (II)
Características:
Conectividad:
Navegador integrado, basado en WebKit
Soporte telefonía GSM, depende del hardware del teléfono
Bluetooth, EDGE, 3G y WI-FI, depende del hardware del teléfono
Software:
Gráficos optimizados con OpenGL ES 1.0 (Android 2.0 OpenGL ES 2.0)
SQLite para el almacenamiento de datos estructurados (Bases de datos)
Entorno de desarrollo: emulador, debugger, herramientas de profiling
Hardware y multimedia
Soporte multimedia, tipo MPEG4, MP3, AMR, JPG, GIF...
Camara, GPS, Brújula, acelerómetro, depende del hardware del teléfono
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Arquitectura Android
Arquitectura Android :Linux Kernel
Versión 2.6 del kernel de Linux
Android aprovecha la seguridad, gestión de memoria, gestión de procesos, red y modelo de drivers
Capa de abstracción entre el hardware y el software
Arquitectura Android:Linux Kernel (II)
Relación versiones Linux por versión Android
Versión Android Versión Linux Android 1.5 (Cupcake) 2.6.27 Android 1.6 (Donut) 2.6.29 Android 2.0 (Eclair) 2.6.29 Android 2.2 (Froyo) 2.6.32 Gingerbread 2.6.33
Arquitectura Android :Android runtime
Utiliza el Kernel de Linux para la ejecución de aplicaciones, procesos y gestión de memoria.
Formado por un conjunto de librerías base, para ofrecer funcionalidad elemental y de bajo nivel, escritas en C y C++
Máquina virtual Dalvik, con código preparado teniendo en cuenta la duración de las baterías y la limitación de memoria.
Arquitectura Android : Dalvik Virtual Machine
Condicionantes de los dispositivos móviles:
Poca duración de la batería
Recursos muy escasos (memoria, cpu)
Limitaciones visuales (pantallas poca resolución)
Compartición y priorización de recursos
Características de la DVM
Usada en entornos con restricciones de memoria y procesador
Herramienta dx convierte .class (clase o aplicación en JAVA) a dex
Ejecuta aplicaciones en formato .dex (Dalvik Executable)
Permite la ejecución de varias instancias a la vez
No es una JVM, no ejecuta bytecode
Clases de Java ME classes, AWT o Swing no están soportadas
Librerías Android (I)
android.util: paquete de utilidades del core, clases de bajo nivel
android.os: acceso a servicios básicos del sistema operativo: (mensajes, reloj...)
android.text: mostrar y parsear (transformar) cadenas de texto
android.database: gestión de las DBs, cursores, etc
android.content: servicios para el acceso a distintos tipos de recursos
android.view: clases para la gestión de las vistas
android.widget: artefactos nativos de Android: listas, botones ...
com.google.android.maps: acceso a controles nativos para mapas
Librerías Android (II)
android.app: acceso al contexto de la aplicación, Actividades y API de servicios
android.provider: acceso a ciertos Content Providers
android.telephony: acceso a los dispositivos del telefono para comunicación (call, send SMS...)
android.location: servicios basados en localización
android.media: grabación y reproducción de audio, video, imagenes..
android.opengl: motor de renderización 3D
android.hardware: acceso a la cámara, acelerómetro, brújula...
Otras librerías: OpenGL, FreeType, SGL, libc, SQLite, SSL
Arquitectura Android : Framework de aplicaciones
Proporciona una plataforma abierta para el desarrollo
El desarrollador puede acceder a los dispositivos, información de ubicación, ejecutar servicios, etc, a través del framework
Las aplicaciones del core utilizan este mismo framework
Views, Content Providers, Managers...
Arquitectura Android: Capa de aplicaciones
En esta capa de ubicarán las aplicaciones desarrolladas por el desarrollador
Aplicaciones escritas en lenguaje JAVA
Aplicaciones incluidas por defecto:
Cliente email
Gestor SMS
Navegador
Contactos
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Arquitectura de las aplicaciones: Componentes de aplicación Principales componentes para el desarrollo de aplicaciones en Android:
Entorno de desarrollo: AndroidManifest.xml
Cada aplicación debe tener un archivo AndroidManifest.xml en el directorio raíz que define los componentes de aplicación (Activities, Services, etc) que se verán a continuación
Da un nombre único a la aplicación, con formato package de Java (com.slashmobility.helloWorld ...)
Se declaran permisos y librerías necesarios para ejecutar la aplicación
Cada Activity debe tener una responsabilidad propia (alta cohesión, bajo acoplamiento)
Una aplicación Android puede contener varias Activity, una de ellas marcada como principal
Pueden usar componentes visuales, servicios, crear Intents, etc
Una Activity puede invocar a otra (subActivity)
Arquitectura de las aplicaciones: Componente Activity
Ciclo de vida de la Activity
ANR si la Activity no responde a un evento en 5 segundos
Mensaje ANR
Arquitectura de las aplicaciones: Componente Service
Se ejecutan en el background (no tienen UI).
Pueden actualizar Content Providers, lanzar Intents, notificaciones...
Tienen más prioridad que la Activity estándar
Aplicaciones que no necesitan interacción con el usuario son buenas candidatas a ser servicios
Location Manager, Media Controller, Notification Manager son ejemplos de Services.
Ciclo de vida del Service (según creación)
Arquitectura de las aplicaciones: Componente Content Provider
Mecanismo genérico para compartir datos entre aplicaciones
Permite desacoplar la capa de aplicación de la capa de datos (data-source agnostic)
Accesible utilizando una simple URI
Browser: permite leer o modificar bookmarks, historial del navegador, o búsquedas web
CallLog: permite ver o modificar el historial de llamadas (entrantes o salientes)
Contacts: Recupera, modifica, o almacena detalles de contactos
Arquitectura de las aplicaciones: Intents
Intent: usado como mecanismo para el paso de mensajes, declara la intención de realizar una acción
Utilizados para iniciar Activities o difundir mensajes.
Útiles para desacoplar componentes (no necesitan conocer implementaciones)
Existen acciones nativas que pueden ser lanzadas con los Intents (crean las Actividades para realizar esas acciones)
Arquitectura de las aplicaciones: Intents (II)
Contienen :
Action: La acción general a realizar, tal como ACTION_VIEW, ACTION_EDIT...
Data: Los datos sobre los que la acción debe operar. Estos se expresan en forma URI (Uniform Resource Identifier)
Ejemplo de pares Action / Data:
ACTION_VIEW: content://contacts/people/1
ACTION_DIAL: tel://687123456
ACTION_DIAL: content://contacts/people/2
Arquitectura de las aplicaciones: Intents (III)
Atributos adicionales:
Category: ofrece información adicional sobre el tipo de componente que debe recoger el Intent
Type: tipo MIME de los datos del Intent. No es necesario por defecto
Component: indica qué componente (clase) especificado en AndroidManifest.xml realizará la acción del Intent. Si se especifica, se entregará a una instancia de esa clase, si no Android buscará el componente que mejor considere.
Extras: información adicional, con pares key-value
Arquitectura de las aplicaciones: Intents (V)
En los Intents, se puede especificar el destinatario o no:
Si se establece un destinatario (vía setComponent(ComponentName)), se le envía directamente.
Si no hay destinatario, se debe incluir suficiente información para que Android determine el mejor componente candidato para ejecutar el Intent
Android utiliza los Intent-filters para buscar el mejor candidato
Intents: Acciones predeterminadas
ACTION_ANSWER: Abre una Actividad para gestionar llamadas entrantes.
ACTION_CALL: Inicia una llamada utilizando el número pasado en el URI.
ACTION_DELETE: Borra una entrada de datos especificados en el URI.
ACTION_DIAL: Aparece el dialer con el número especificado.
ACTION_EDIT: Invoca una actividad para editar la información del URI.
ACTION_INSERT: inserta nuevos items (por ejemplo, lista de contactos)
ACTION_PICK: recupera información de un item
ACTION_SEARCH: Invoca una actividad para realizar búsquedas.
ACTION_SENDTO: envia un mensaje a un contacto.
ACTION_SEND: envía la información especificada en el URI.
ACTION_VIEW: petición para ver una información de la mejor manera posible.
ACTION_WEB_SEARCH: realiza búsquedas Web de la información del URI.
Arquitectura de las aplicaciones: Intent filters Intent Intent
Arquitectura de las aplicaciones: Broadcast Intents Intent Intents
Arquitectura de las aplicaciones: Componente Broadcast Receiver
Broadcast Receivers son utilizados para escuchar Broadcast Intents.
Para utilizarlos, necesitan ser registrados (via código o AndroidManifest.xml)
Se utilizan Intent Filters para especificar que Intents se están esperando
Arquitectura de las aplicaciones: Resources
Los recursos (Resources) son elementos externos que se quieren incluir y referenciar en la aplicación
Ejemplos: Imagenes, videos, audio, textos...
Los recursos de /res son accesibles a través de la clase R (compilada por Android automáticamente) con R.carpeta.recurso
Soporte para i18n
Arquitectura de las aplicaciones: Interfaces de usuario
En Android, las interfaces se construyen utilizando los objetos View y ViewGroup
Las Views son el punto de interacción con el usuario
Las ViewGroup son una agrupación lógica de elementos visuales
Interfaces de usuario: Layouts
También conocidos como Layout Managers
Son extensiones de ViewGroup
Su objetivo es controlar la posición de las Views hijas en la pantalla
Se pueden anidar, es decir, incluir Layouts dentro de Layouts
Android proporciona una serie de Layouts por defecto
Interfaces de usuario: Layouts (II)
FrameLayout: el más simple, añade cada View hija en la esquina superior izquierda. Cada vez que se añade una, tapa la anterior, diseñado para mostrar un único elemento.
LinearLayout: añade cada View hija en linea recta (horizontal o vertical)
RelativeLayout: añade las Views relativamente unas a otras
TableLayout: añade las Views usando un grid (cuadrícula), a través de filas y columnas. Es similar a las tablas HTML.
AbsoluteLayout: añade las vistas dando coordenadas absolutas
LinearLayout RelativeLayout AbsoluteLayout
Arquitectura de las aplicaciones: Notificaciones al usuario
Algunos sucesos requieren ser notificados al usuario
Algunas notificaciones requieren respuesta del usuario, otras no
Ejemplos: batería baja, confirmación de recepción de un archivo, barras de progreso, etc
Para cada tipo de notificación se requerirá una manera concreta de informar al usuario: vibración, iluminación LEDs
Toast Status Ba r Dialog
Interfaces de usuario: componentes compuestos (I)
Normalmente hacen referencia a Views con funcionalidad compleja añadida
Para crear widgets, se pueden crear Views y añadirle métodos para la gestión de eventos, componentes visuales, etc
Se pueden extender (heredar) widgets de Android por defecto, sobreescribiendo la funcionalidad que se necesite
Interfaces de usuario: componentes compuestos (II) TextView EditText con un Button ListView Spinner
Interfaces de usuario: componentes compuestos (III) DatePicker TimePicker AutoComplete
Interfaces de usuario: Menus
Revelan la funcionalidad de la aplicación
Tres tipos de menús de aplicación:
Options Menu
Context Menu
Submenu
Menus: Options Menu
Contiene un máximo de 6 elementos
Si se necesitan más, se incluyen en el menú extendido (aparece al pusar el botón + )
La primera vez que se abra, Android llamará al método onCreateOptionsMenu() de la Activity
Cuando el usuario presione una opción del menú, se invocará el método onOptionsItemSelected()
Menus: Context Menu
Conceptualmente similar al botón contextual del ratón en el PC
Presión sobre la vista unos dos segundos
Al aparecer, se invocará el método onCreateContextMenu()
Al seleccionar, se invocará el método onContextItemSelected()
Menus: Submenus
Se puede añadir dentro de cualquier menú, excepto de otro submenú
Se añade a nivel de código desde el método onCreateOptionsMenu()
Igual que en los Option Menu, al pulsar de invocará el método onOptionsItemSelected()
Arquitectura de las aplicaciones: Seguridad y permisos
Seguridad basada en el Kernel de Linux, cada paquete tiene un único userID y procesos en sandbox, por lo que no pueden ser afectados entre sí
Los permisos son un mecanismo a nivel de aplicación, que permiten el acceso a un recurso determinado (Red, envío de SMS..)
Se pueden crear en AndroidManifest.xml
< permission android:name=”com.paad.DETONATE_DEVICE” android:protectionLevel=”dangerous” android:label=”Self Destruct” android:description=”@string/detonate_description”> </ permission > Y se pueden asignar en el tag activity: < activity android:name=”.MyActivity” android:label=”@string/app_name” android:permission=”com.paad.DETONATE_DEVICE” > </ activity >
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Entorno de desarrollo: emulador Android
El SDK contiene un emulador para testear las aplicaciones desarrolladas
Emula tanto hardware como software
El emulador soporta configuraciones AVD (Android Virtual Devices), para testear sobre distintas plataformas Android
Entorno de desarrollo: DDMS
Siglas de Dalvik Debug Monitor Server
Incluido en el SDK
Proporciona información del estado de una instancia Android
Se conecta al ADB (Android Debugger) y monitoriza una instancia de máquina virtual
En IDE Eclipse se puede acceder de forma integrada
Entorno de desarrollo: Hello Android! package com.android.helloandroid; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroid extends Activity { /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android"); setContentView(tv); } }
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Almacenamiento de datos
En aplicaciones típicas de escritorio, el sistema operativo ofrece el sistema de ficheros para compartir datos entre aplicaciones
En Android, los ficheros son privados por aplicación
Para compartir información, se utilizan los Content Providers
Almacenamiento de datos: Preferences
Técnica ágil para guardar datos simples de la aplicación
Los datos se almacenan en pares key/value
Usado típicamente para guardar las preferencias de la aplicación (fuentes, colores..)
Almacenamiento de datos: ficheros locales
Por defecto, sólo la aplicación puede acceder a esos ficheros (permisos Unix)
Acceso similar a Java estándar, se deben crear inputs y outpus streams
Sólo se soportan archivos creados en la misma carpeta que la aplicación
Las aplicaciones van a la ruta: /data/app (gratuitas) y /data/app-private (de pago), las nuevas versiones soportan almacenamiento en la SDCard
Almacenamiento de datos: SQLite
Cada base de datos es privada para la aplicación, pero pueden acceder todas las clases de esta
Android ofrece clases wrapper para almacenar la información en la base de datos (p.e. información de contactos)
Las bases de datos se almacenan en la carpeta /data/data/ nombre_package /databases
Para compartir la información utilizar ContentProviders
Almacenamiento de datos: SQLite (II)
Base de datos Open Source
Cumplimenación de estándares de BDs
Ligera, no requiere excesivos recursos
Las querys (consultas) se devuelven como objetos Cursor, apuntando a la información
Utilizada en reproductores MP3, iPhone y iPods
Para información detallada: http://www.sqlite.org
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Android como negocio: Android Market
Almacén de software online para dispositivos Android
La aplicación Market viene preinstalada ya en la mayoría de dispositivos
Permiten al usuario navegar y descargar aplicaciones desarrolladas por terceros
Android como negocio: Android Market
Se inicia el 28 de octubre de 2008 para disponer de un repositorio centralizado de distribución de aplicaciones
Marzo 2009: 2.300 aplicaciones, Diciembre 2009: 20.000, abril 2010: unas 50.000, con un crecimiento cercano a las 10.000 aplicaciones mensuales
Actualmente se permite subir aplicaciones de pago o gratuitas
L icencia de desarrollador (25$ USD)
El control de aplicaciones no es tan estricto como otros repositorios (AppStore)
Los usuarios evalúan la calidad de la aplicación y esto influye en su posicionamiento visual
Android como negocio: Android Market
Android como negocio: licencia Android
L a licencia Android se aplica a productos tanto gratuitos como de pago
En Android Market se pueden distribuir productos, no servicios
Las aplicaciones de pago pueden ser devueltas y reembolsadas en un plazo de 48 horas.
Las devoluciones no se permiten a datos facilmente copiables (fondos, tonos...)
Las gestiones de pago se realiza ba n a través de Google Checkout , aunque ya hay mas opciones.
70% de los ingresos para el desarrollador
Android como negocio: Modelos de negocio (II) ¿Se gana de verdad dinero?
Versión Lite / Premium:
Desarrollar una aplicación gratuita con menor funcionalidad y otra de pago con toda la funcionalidad.
Por publicidad :
Poner la aplicación de manera gratuita en el market y poner un banner ( Admob , iAd , …) que reportará ingresos recurrentes en base al número de visitas que tenga la app
Modelo en crecimiento (Ingresos por publicidad respecto al totales 2009 = 7%, 2010 = 10%… 2013 = 25%) .
Por subscripción :
Desarrollar la app en base a un servicio y se nos paga una cuota periódica por disfrutar del servicio ofrecido.
Orientado a producto. ( mobile marketing )
Android como negocio: Modelos de negocio (III)
Acciones formativas:
Cursos, webinars, laboratorios o charlas en eventos
Consultoría :
Asesorar tecnológicamente a una empresa en cómo beneficiar se de las apps móviles.
Ayuda en desarrollo:
Prestar servicios de desarrollo a otra empresa u otro desarrollador que tenga un proyecto ya empezado.
Índice
Historia
¿Qué es Android?
Arquitectura del sistema
Arquitectura de las aplicaciones
Entorno de desarrollo
Almacenamiento de datos
Android como negocio
Futuro de Android
Futuro de Android: versiones de Android
Android 1.5 (CupCake)
Release en abril de 2009
Rediseño completo de las interfaces visuales
Animación en transición entre ventanas
Mejoras en velocidad de navegador Web
AGPS
Copy/Paste dentro de una página web
Inclusión de teclado en pantalla con soporte para orientación vertical y horizontal
Android 1.6 (Donut)
Quick Search Box, caja de búsqueda en la pantalla de inicio para buscar en distintas fuentes (contactos, historial navegador...)
Optimización en la cámara
Conexión VPN y 802.1x
Pantalla para la gestión de batería y aplicaciones
Aplicaciones de Android Market ordenadas por categoría, permite consultar actualizaciones
Motor para convertir de texto a voz
Futuro de Android: versiones de Android
Android 2.0 (Eclair)
Release Android 2.0 en noviembre de 2009
Rediseño interfaz de navegador y soporte para HTML5
Cámara con zoom digital,modo scene, balance de blanco y efectos de color.
Mejoras en el teclado virtual
Soporte para nuevas resoluciones de pantalla
Bluetooth 2.1
Soporte nativo para Facebook
Mejoras en Google Maps
Futuro de Android: versiones de Android
Android 2.1 (Eclair)
Release Android 2.1 enero de 2010
Reconocimiento de voz en cualquier campo
Mejoras en el teclado virtual
Galerías 3D
Uso de “pellizcar” en galerías y Google Maps
Mejoras en Google Maps
Google Goggles para realidad aumentada
Mejoras en la optimización de la batería
Futuro de Android: versiones de Android
Android 2.2 (Froyo)
Anunciado en mayo de 2010
Soporte para compilador JIT en Dalvik para optimizar el rendimiento
Instalación de aplicaciones en la tarjeta SD, actualización automática de aplicaciones
Soporte integrado de Flash 10.1
Modo hotspot con el que el terminal puede crear una nueva red inalambrica y permitir conexiones
Futuro de Android: versiones de Android
Futuro de Android: evolución de las versiones (julio 2010)
Futuro de Android: crecimiento de Android
El primer trimestre de 2010, los dispositivos con Android se han vendido más con respecto a IPhone (28% vs 21%)
El mercado sigue dominado por los dispositivos BlackBerry, con un 36%
Actualmente, hay unas 38000 aplicaciones disponibles en Android, 1014 para WindowsMobile y unas 200000 para IPhone
Un total de unos 400 millones de descargas para Android y unos 4000 millones para IPhone
La Developer Revenue Share es de aproximadamente 70% tanto para Android, WindowsMobile y IPhone
El alta para desarrollar sobre Android es de 25$, para desarrollar sobre WindowsMobile y IPhone de 99$
Futuro de Android: crecimiento de Android
Futuro de Android: comparativa de funcionalidad
Futuro de Android: tendencias de uso de SOs en smartphones
Futuro de Android: comparativa apps de pago vs gratuitas Gratis vs De Pago Mayo 2010 - Distimo
Futuro de Android: comparativa media de precios Comparativas de precio Precio medio app de pago (Distimo Mayo 2010)
Futuro de Android: número de aplicaciones (junio 2010) Tamaño de las tiendas Número total de apps 15 Junio 2010 - Diistimo
Futuro de Android: crecimiento de aplicaciones (mayo 2010) Crecimiento tiendas Mayo 2010 - Distimo
El precio se igualará Precio medio app de pago Futuro de Android: estimaciones en precios
1–10 of 19 previous next Post a comment
1–10 of 19 previous next