/* 
 * This 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 2 of the License, or
 * (at your option) any later version.
 * 
 * This software 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 software; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 * USA.
 */
/** 
	 * Notificacion.java
	 * Autor: Alberto Población Navarro
	 * Añadido al proyecto en la version v0.2.5
	 * Añadido a:
	 		* Proyecto original: http://code.google.com/p/android-vnc-viewer/
	 		* Release: 39
	 */
package android.androidVNC;

import java.io.File;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;

public class Notificacion {
	
	//Clase utilizada para mandar las notificaciones
	private NotificationManager nm;
	//Clase que lazará nuestra aplicación en caso de seleccionar alguna notificacion en la status bar
	private PendingIntent contentIntent;
	//Contexto de la aplicación
	private Context context;
	//Icono que vamos a dibujar en las notificaciones
	private int icon = R.drawable.icon;
	//Identificador de las notificaciones
	final int ID = 0;
	
	//Aplicamos patrón singleton para asegurarnos que solo haya una instancia de la clase	
	private static Notificacion instancia = null;
	/**
	 * Constructor de instacia de esta clase. Solo se va a crear una instancia por ejecución del programa.
	 * En caso de que no se haya creado la instacia se crea, en caso contrario se devuelve la creada anteriormente.
	 * @param context contexto de ejecución del programa
	 * @return instancia de la clase.
	 */
	static synchronized Notificacion Instancia(Context context){
		if (instancia == null)
			instancia = new Notificacion(context);
		return instancia;
	}
	/**
	 * Constructor de la clase que solo se llamará una vez por ejecución de programa
	 * @param context_ contexto de ejecución
	 */
	private Notificacion(Context context_) {
		context = context_;
		// Obtemos el servicio para manejar las notificaciones
		nm= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
	    // PendingIntent es un Intent que lanzara nuestra actividad si el usuario seleciona la notifacion
		// en el panel de notificaciones
	    contentIntent = PendingIntent.getActivity(context, 0, new Intent(context,androidVNC.class), 0);
	}
	
	/**
	 * En caso de llamar a esta funciona la notificación tendra como título la propia información 
	 * y la actividad lanzada en caso de clic sobre la notificación será la propia ejecución del programa
	 * @param cadena titulo e información de la notificación
	 */
	public void notificar(String cadena){
		notificar(cadena, cadena, contentIntent);
	}
	/**
	 * Publica una notificación con un titulo e información pasados por paramámetro. 
	 * La actividad lanzada en caso de clic sobre la notificación será la propia ejecución del programa.
	 * @param titulo Título de la notificación
	 * @param texto Informaión publicada en la notificación
	 */
	public void notificar(String titulo, String texto){
		notificar(titulo, texto, contentIntent);
	}
	/**
	 * Crea una notificación con la característica de que si picamos en ella nos mostrará la imagen recien creada
	 * @param titulo Título de la notificación
	 * @param texto Informaión publicada en la notificación
	 * @param imagen Imagen que se mostrará si hacemos clic en la notificación
	 */
	public void notificar(String titulo, String texto, File imagen){
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setData(Uri.fromFile(imagen));
		ComponentName comp = new ComponentName("com.android.camera","com.android.camera.ViewImage");
		intent.setComponent(comp); 
		PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
		notificar(titulo, texto, pendingIntent);	
	}
	/**
	 * Funcion que publicará en la barra de estado una notificación con la información
	 * pasada en los parametros de la llamada.
	 * @param titulo Título de la notificación
	 * @param texto Información publicada en la notificación
	 * @param pendingIntent actividad que se ejecutará si se selecciona la notificacion en la barra de estado
	 */
	private void notificar(String titulo, String texto, PendingIntent pendingIntent){
		Notification notificacion;
		//Creamos la notificacion y configuramos su configuración
		notificacion = new Notification(icon, titulo, System.currentTimeMillis());
		notificacion.setLatestEventInfo(context, titulo, texto, pendingIntent);
		//Publicamos la notificación en la barra de estado
		nm.notify(ID, notificacion);
	}
	//Eliminamos las notificaciones de las barras de estado.
	public void eliminar(){
		nm.cancel(ID);
	}
		
}
