Java tutorial
/** * Tec ch mun 2011 for Android, is the android application used to * * review all the information that is generated during the event * Tec Ch Mun 2011 of the ITESM campus chihuahua. * You can use this application as an example of all the technologies * used in this app. * Copyright (C) 2011 Alexandro Blanco <ti3r.bubblenet@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Visit http://tec-ch-mun-2011.herokuapps.com */ package org.blanco.techmun.android.cproviders; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.blanco.techmun.android.misc.Base64Coder; import org.blanco.techmun.android.misc.XmlParser; import org.blanco.techmun.entities.Mensaje; import org.blanco.techmun.entities.Usuario; import org.json.JSONArray; import org.json.JSONObject; import android.content.Context; import android.graphics.BitmapFactory; import android.preference.PreferenceManager; import android.util.Log; /** * Class in charge of retrieving the information about the * Mesa objects from the rest services or the cached objects * This class is a helper for the content provider. * * @author Alexandro Blanco <ti3r.bubblenet@gmail.com> * */ public class MensajesFetcher { HttpClient client = null; Context context = null; /** * Default Constructor used to retrieve the mesa objects * from the rest services if needed. * * @param client The httpClient used to retrieve the mesa objects * from the rest services in case of */ public MensajesFetcher(HttpClient client, Context context) { this.client = client; this.context = context; } // private void saveOnCache(Context context, List<Mensaje> mensajes){ // try { // FileOutputStream mesasFOS = context.openFileOutput("mensajes.df", Context.MODE_PRIVATE); // ObjectOutputStream mesasOOS = new ObjectOutputStream(mesasFOS); // mesasOOS.writeObject(mensajes); // mesasOOS.close(); // PreferenceManager.getDefaultSharedPreferences(context).edit() // .putLong("mensajes_last_cache", System.currentTimeMillis()); // } catch (IOException e) { // Log.e("tachmun", "Error opening cache file for mesas in content provider. " + // "No cache will be saved",e); // } // } private List<Mensaje> tryToLoadFromCache(Context context, boolean forceCacheLoad) { Long lastCache = PreferenceManager.getDefaultSharedPreferences(context).getLong("mensajes_last_cache", 1); long diff = System.currentTimeMillis() - lastCache; if (diff < 180000 && !forceCacheLoad) { //if the cache of the mensajes is greater than 3 minutes launch a new refresh return null; } try { FileInputStream mesasFIS = context.openFileInput("mensajes.df"); ObjectInputStream mesasOIS = new ObjectInputStream(mesasFIS); List<Mensaje> result = (List<Mensaje>) mesasOIS.readObject(); mesasOIS.close(); return result; } catch (IOException e) { Log.e("tachmun", "Error opening cache file for mesas in content provider. " + "No cache will be restored", e); return null; } catch (ClassNotFoundException e) { Log.e("tachmun", "Error in cache file for mesas in content provider. " + "Something is there but is not a Mesas object. Cache no restored", e); return null; } } // private Bitmap tryToLoadFotoFromCache(Mensaje mensaje){ // Bitmap result = null; // if (mensaje == null){ // throw new IllegalArgumentException("Parameters can't be null"); // } // if (mensaje.getFoto() == null){ //Just when foto not loaded // try{ // FileInputStream fisFoto = context.openFileInput("mensaje_foto_"+mensaje.getId()); // ByteArrayOutputStream bos = new ByteArrayOutputStream(); // int b = -1; // do{ // b = fisFoto.read(); // bos.write(b); // }while (b != -1); // result = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size()); // }catch (Exception e) { // Log.e("techmun","Error loaginf foto from file",e); // } // } // return result; // } // public static void tryToSaveFotosOnCache(Context context, Mensaje mensaje){ // if (mensaje == null || context == null){ // throw new IllegalArgumentException("Parameters can't be null"); // } // //Mensaje has a valid picture // if (mensaje.getFoto() != null && !mensaje.isFailedRetrieveFoto() ){ // try { // OutputStream fosFoto = context.openFileOutput("mensaje_foto_"+mensaje.getId(), Context.MODE_PRIVATE); // mensaje.getFoto().compress(CompressFormat.PNG, 100, fosFoto ); // fosFoto.close(); // } catch (IOException e) { // Log.i("techmun", "Error while storing image on cache. " + // "Picture for mensaje "+mensaje.getId()+" will not be saved",e); // } // }else{ // Log.i("techmun", "Mensaje has not valid picture. Picture for mensaje "+mensaje.getId()+" will not be saved"); // } // // } public List<Mensaje> getMensajes() { List<Mensaje> result = null; //Do not force the cache load first in order to know if the cache is old or not // result = tryToLoadFromCache(context, false); // if (result != null){ // //If loaded from cache // return result; // } HttpResponse response; boolean retrieved = true; try { result = new ArrayList<Mensaje>(); HttpGet req = new HttpGet(TechMunContentProvider.MESAS_REST_SERVICE_BSAE_URI + "/mensajes"); response = client.execute(req); HttpEntity entity = response.getEntity(); JSONArray mensajes = XmlParser.parseJSONArrayFromHttpEntity(entity); for (int i = 0; i < mensajes.length(); i++) { JSONObject joMensaje = mensajes.getJSONObject(i); String sMensaje = joMensaje.getString("mensaje"); long id = joMensaje.getLong("id"); String sFecha = joMensaje.getString("fecha"); Usuario autor = null; if (joMensaje.has("autor")) { JSONObject joUsuario = joMensaje.getJSONObject("autor"); String saNombre = joUsuario.getString("nombre"); String saCorreo = joUsuario.getString("correo"); autor = new Usuario(saNombre, saCorreo); } Mensaje mensaje = new Mensaje(sMensaje, autor); mensaje.setFecha(new Date(Date.parse(sFecha))); mensaje.setId(id); //try to load the foto of the mensaje String encoded_foto = joMensaje.getString("encoded_foto"); if (encoded_foto != null && !encoded_foto.equals("")) { byte foto[] = Base64Coder.decode(encoded_foto.toCharArray()); mensaje.setFoto(BitmapFactory.decodeByteArray(foto, 0, foto.length)); } result.add(mensaje); } } catch (Exception e) { Log.e("techmun2011", "Error Retrieving Mensajes from internet", e); retrieved = false; } //If there is an error with the connection try to load mensajes from cache if (!retrieved) { result = tryToLoadFromCache(context, true); return result; } //saveOnCache(context, result); return result; } }