Android Reddit Reader
Contexto
Actividades realizadas por Alejandro Ismael Silva para la materia optativa "Programación en Android: Introducción" de la Facultad de Astronomía, Matemática, Física y Computación (FaMAF) perteneciente a la Universidad Nacional de Córdoba diseñada por Diego Mercado.
Step 1
Objetivos
- Conocer la comunicación entre Actividades y su ciclo de vida
Enunciado
- Descargar el proyecto desde https://github.com/mercadodiego/ActivitiesAssignment
- En la acción del Sign inLogin invocar LoginActivity
- Una vez finalizado, debera mostrar el nombre del usuario logueado en pantalla
Step 2
Objetivos
- Conocer los principios básicos de Layouts, View y ViewGroups en Android
- Modificar y agregar recursos gráficos y de texto a la aplicación
Enunciado
- Descargar el tag "layout_assignment" del repositorio https://github.com/mercadodiego/RedditReader
- Todos los textos que despliega la aplicación deben aparecer tanto en inglés como en castellano
- Cambiar el nombre de la aplicación para que aparezca como "Reddit Reader" en inglés y "Lector de Reddit" en castellano
- Cambiar el ícono de la aplicación por el de ./images/reddit_icon.png
- Cambiar el nombre de paquete de ar.edu.unc.famaf.activitiesassignment a ar.edu.unc.famaf.redditreader
- En la vista principal debe mostrarse una vista igual a ./images/screenshot1.jpg
Step 3
Objetivos
- Implementar una ListView que obtenga su contenido desde un propio ArrayAdapter
Enunciado
- Descargar el tag "adapters_assignment" del repositorio https://github.com/mercadodiego/RedditReader
- La clase
ar.edu.unc.famaf.redditreader.model.PostModel
representa un Post en Reddit. La misma ya está creada pero vacía, debe agregar los atributos relativos al título, autor, fecha de creación, numero de comentarios e imagen de preview/thumbnail con sus correspondientes setter/getter - Implementar el método
List<PostModel> getTopPosts()
de la clasear.edu.unc.famaf.redditreader.backend.Backend
. El mismo debe devolver siempre 5 instancias dePostModel
con contenido falso o dummy - Crear la clase
ar.edu.unc.famaf.redditreader.ui.PostAdapter
que extienda deandroid.widget.ArrayAdapter
e re-implementar los métodos necesarios NewsActivityFragment
debe mostrar una ListView que ocupe completamente su espacio y debe desplegar el contenido de cada uno de los Posts siguiendo el diseño implementado en la actividad previa de LayoutAssignment. Tener en cuenta que el título debe poder siempre mostrarse y la altura de cada fila debe ajustarse para permitirlo- Implementar un ViewHolder en nuestra clase
ar.edu.unc.famaf.redditreader.ui.PostAdapter
para mejorar la performance de la ListView. Mayor información en: Hold View Objects in a View Holder
Step 4
Objetivos
- Implementar una AsyncTask dentro de una ListView para ir descargando el contenido de las thumbnails desde Internet
Enunciado
- La clase
ar.edu.unc.famaf.redditreader.ui.PostAdapter
debe implementar una AsyncTask que dada una URL previamente definida en la clasear.edu.unc.famaf.redditreader.model.PostModel
, permita descargar dicha imagen y que sea parte de la ImageView representativa del preview/thumbnail - Debe emplearse un
android.widget.ProgressBar
animado mientras la imagen está siendo descargada
Step 5
Objetivos
- Realizar una llamada a un servicio REST, interpretar el Json devuelto y mostrar los resultados en pantalla.
Enunciado
- Crear la clase
ar.edu.unc.famaf.redditreader.backend.GetTopPostsTask
que obtenga el contenido vía HTTP en formato JSon de los primeros 50 Top posts de Reddit, lo interprete y devuelva como resultado unList<PostModel>
- El contenido debe mostrarse el la
ListView
de la claseNewsActivityFragment
- Cuando no hay conexión a INTERNET mostrar un error que lo indique en forma de AlertDialog
- El interprete de JSON debe estar definido en una nueva clase
ar.edu.unc.famaf.redditreader.backend.Parser
y debe implementar el siguiente método de entrada, empleando internamente una instancia de JsonReader que devuelva una nueva clase llamadaar.edu.unc.famaf.redditreader.model.Listing
(acorde a la estructura de objetos propia de la API de Reddit)
public Listing readJsonStream(InputStream in) throws IOException {....}
Tips
- La documentación oficial de la API de Reddit está disponible en Reddit API
- Para realizar una llamada REST HTTP (GET) puede emplear el siguiente snippet de código
HttpURLConnection conn = (HttpURLConnection) new URL("...").openConnection();
conn.setRequestMethod("GET");
conn.getInputStream();
Step 6
Objetivos
- Implementar una pequeña base de datos SQLite
Enunciado
- La clase
ar.edu.unc.famaf.redditreader.backend.GetTopPostsTask
debe implementar ahora el siguiente comportamiento - Invocar al servicio REST de Reddit para obtener los primeros 50 TOP posts
- Persistir los resultados en una base de datos interna
- Devolver los resultados desde la base de datos interna
- En caso de que no haya conexión a internet, se deben devolver los últimos resultados obtenidos desde la base de datos interna
- La base de datos interna debe estar implementada en una nueva clase:
ar.edu.unc.famaf.redditreader.backend.RedditDBHelper
de tipoSQLiteOpenHelper
- Solo almacena los últimos 50 posts. El resto deben borrarse.
- Los thumbnails/preview a medida que se descargan deben también almacenarse. Recordar que pueden almacenarse como un arreglo de bytes:
public static byte[] getBytes(Bitmap bitmap)
{
ByteArrayOutputStream stream=new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG,0, stream);
return stream.toByteArray();
}
public static Bitmap getImage(byte[] image)
{
return BitmapFactory.decodeByteArray(image, 0, image.length);
}
Step 7
Objetivos
- Implementar un scroll infinito donde se vayan mostrando 5 posts y mientras tanto se vayan obteniendo los próximos 5 posts.
Enunciado
1-) Implementar el siguiente método en nuestra clase ar.edu.unc.famaf.redditreader.backend.Backend
public void getNextPosts(final PostsIteratorListener listener) {...}
... donde PostsIteratorListener
es:
public interface PostsIteratorListener {
void nextPosts(List<PostModel> posts);
}
- La misma debe invocar al método nextPosts devolviendo los próximos 5 posts. Internamente la primera vez consulta al servicio web y persiste los primeros 50 resultados. Una vez que llega a dicho límite debe consultar por los próximos 50 posts y así sucesivamente.
2-) Crear la clase ar.edu.unc.famaf.redditreader.backend.EndlessScrollListener
:
Fuente: guides.codepath.com
- Nuestra
ListView
debe reimplementar onScrollListener tal como indica la fuente yNewsActivityFragment
implementarPostsIteratorListener
. Una vez que haya nuevos resultados se debe invocar al métodonotifyDataSetChanged()
de nuestro propio adapter.
Step 8
Objetivos
- Al seleccionar una celda de la lista, mostrar el detalle del post.
Enunciado
Primera parte
1-) Para "escuchar" por los eventos de selección de celda debe reimplementar el método
ListView.setOnItemClickListener(OnItemClickListener listener)
2-) Emplear la siguiente interfaz para la comunicación entre NewsActivity
y NewsActivityFragment
public interface OnPostItemSelectedListener{
void onPostItemPicked(PostModel post);
}
3-) La actividad de detalle debe llevar de nombre ar.edu.unc.famaf.redditreader.ui.NewsDetailActivity
,
con su correspondiente fragmento ar.edu.unc.famaf.redditreader.ui.NewsDetailActivityFragment
4-) Mostrar el título del post en un TextView
Segunda parte
1-) Mostrar el siguiente detalle:
- Subrredit al que pertenece
- Fecha
- Titulo
- Usuario
- Preview (si está presente)
- Link a sitio web (si corresponde)
2-) Al seleccionar link el mismo debe abrir en una nueva actividad con una WebView que despliegue el contenido web, sin abandonar la aplicación
Tip
- Para poder emplear PostModel como parte del Intent, dicho objeto debe implementar la interfaz Serializable y emplear los métodos putExtra(String name, Serializable value) y Serializable getSerializableExtra(String name) de la clase android.content.Intent
Final Assignment
Objetivos
- Integrar todos los conocimientos aprehendidos durante el curso
- Incorporar nuevos componentes sin conocimiento previo
- Reutilizar código
Enunciado
- Implementar una sola de las siguientes características:
- Desplegar los comentarios empleando un scroll infinito de a 50 noticias (no hace falta persistirlo). Considerar incorporar una sangria o algo que indique el nivel del subarbol
- Emplear un TabHost o NavigationDrawer que muestre los siguientes tipos de noticias: hot, new y top
- Implementar login/logout del usuario y permitir hacer un upVote o downVote de un post ya sea de la lista general o desde el detalle de un post
Criterios de evaluación
- Funcionalidad adecuada
- Reutilización de código
- Tolerancia a errores
- Nivel de acoplamiento y cohesión de los componentes
- Haber contemplado las correcciones las observaciones realizadas en la evaluación de cada actividad práctica
- Características/Funcionalidades adicionales incorporadas en la aplicación si las hubiese
Condiciones generales de entrega
- No deben emplearse frameworks que no sean los provistos oficialmente por la SDK de Android
- Se debe trabajar en un repositorio GIT propio. Mayor información en: Git-Basics-Working-with-Remotes
- La entrega consistirá en indicar en que TAG fue subido el mismo
- No debe contener carpetas/archivos autogenerados
- Debe compilar. De lo contrario no será considerada como una entrega valida
- Debe desarrollarse usando Android Studio 2.2 (o cualquier versión superior del canal estable)
- Conservar Minimum SDK: API Level 15 y Target SDK: API Level 23