Core Class Android

/*
  Amarino - A prototyping software toolkit for Android and Arduino
  Copyright (c) 2010 Bonifaz Kaufmann.  All right reserved.
  
  This application and its library is free software; you can redistribute
  it and/or modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 3 of the License, or (at your option) any later version.
  This library 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
  Lesser General Public License for more details.
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
//package at.abraxas.amarino.log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import android.util.Log;
/**
 * 
 * @author Bonifaz Kaufmann
 *
 * $Id: Logger.java 444 2010-06-10 13:11:59Z abraxas $
 */
public class Logger {
  public static boolean enabled = true;
  public static final String KEY_IS_LOG_ENABLED = "is_log_enabled";
  private static final boolean DEBUG = true;
  private static final String TAG = "AmarinoLogger";
  
  private static final int MAX_LOG_ENTRIES = 200;
  private static ArrayList listeners = new ArrayList();
  private static List log = Collections.synchronizedList(new LinkedList());
  private static int logSize = 0;
  
  public static void d(String tag, String msg){
    String text = tag + ": " + msg;
    if (DEBUG) 
      Log.d(TAG, text);
    if (enabled)
      add(text);
    
  }
  
  public static void d(String msg){
    if (DEBUG) 
      Log.d(TAG, msg);
    if (enabled) 
      add(msg);
  }
  
  private static void add(String msg){
    synchronized (log){
      if (logSize < MAX_LOG_ENTRIES){
        logSize++;
      }
      else {
        // we don't check if elements are present, since we trust logSize
        log.remove(0);
        //log.removeFirst(); 
      }
      log.add(msg);
    }
    notifyListeners(msg.toString());
  }
  
  public static synchronized void clear(){
    logSize = 0;
    log.clear();
  }
  
  public static String getLog(){
    StringBuilder sb = new StringBuilder();
    synchronized(log){
      ListIterator iter = log.listIterator();
      while (iter.hasNext()){
        sb.append(iter.next());
        sb.append("\n");
      }
    }
    
    return sb.toString();
  }
  
  
  public static synchronized void registerLogListener(LogListener listener) {
    if (!listeners.contains(listener))
      listeners.add(listener);
  }
  
  public static synchronized void unregisterLogListener(LogListener listener) {
    listeners.remove(listener);
  }
  
  private static void notifyListeners(final String lastAddedMsg){
    if (listeners != null){
      for (LogListener ll : listeners)
        ll.logChanged(lastAddedMsg);
    }
  }
}
/**
 * 
 * @author Bonifaz Kaufmann
 *
 * $Id: LogListener.java 444 2010-06-10 13:11:59Z abraxas $
 */
 interface LogListener {
  public void logChanged(String lastAddedMsg);
}