project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/MessageLog.java
changeset 7346 b0f67c5b4215
parent 7332 3f2e130f9715
child 7352 641f11cdd319
equal deleted inserted replaced
7344:25b8906f901a 7346:b0f67c5b4215
     1 package org.hedgewars.hedgeroid.netplay;
     1 package org.hedgewars.hedgeroid.netplay;
     2 
     2 
       
     3 import java.util.Collection;
       
     4 import java.util.Collections;
     3 import java.util.Date;
     5 import java.util.Date;
     4 import java.util.LinkedList;
     6 import java.util.LinkedList;
     5 import java.util.List;
     7 import java.util.List;
     6 
     8 
     7 import org.hedgewars.hedgeroid.R;
     9 import org.hedgewars.hedgeroid.R;
    20 import android.text.style.RelativeSizeSpan;
    22 import android.text.style.RelativeSizeSpan;
    21 import android.text.style.StyleSpan;
    23 import android.text.style.StyleSpan;
    22 import android.util.Log;
    24 import android.util.Log;
    23 
    25 
    24 public class MessageLog {
    26 public class MessageLog {
    25 	private static final int BACKLOG_CHARS = 10000;
    27 	private static final int BACKLOG_LINES = 200;
    26 	
    28 	
    27 	private static final int INFO_COLOR = Color.GRAY;
    29 	private static final int INFO_COLOR = Color.GRAY;
    28 	private static final int CHAT_COLOR = Color.GREEN;
    30 	private static final int CHAT_COLOR = Color.GREEN;
    29 	private static final int MECHAT_COLOR = Color.CYAN;
    31 	private static final int MECHAT_COLOR = Color.CYAN;
    30 	private static final int WARN_COLOR = Color.RED;
    32 	private static final int WARN_COLOR = Color.RED;
    31 	private static final int ERROR_COLOR = Color.RED;
    33 	private static final int ERROR_COLOR = Color.RED;
    32 	
    34 	
    33 	private final Context context;
    35 	private final Context context;
    34 	private List<Observer> observers = new LinkedList<Observer>();
    36 	private List<Observer> observers = new LinkedList<Observer>();
    35 	
    37 	private List<CharSequence> log = new LinkedList<CharSequence>();
    36 	private SpannableStringBuilder log = new SpannableStringBuilder();
       
    37 	private List<Integer> lineLengths = new LinkedList<Integer>();
       
    38 	
    38 	
    39 	public MessageLog(Context context) {
    39 	public MessageLog(Context context) {
    40 		this.context = context;
    40 		this.context = context;
    41 	}
    41 	}
    42 	
    42 	
    59 		return span(s, new StyleSpan(Typeface.BOLD));
    59 		return span(s, new StyleSpan(Typeface.BOLD));
    60 	}
    60 	}
    61 	
    61 	
    62 	private void append(CharSequence msg) {
    62 	private void append(CharSequence msg) {
    63 		SpannableStringBuilder ssb = new SpannableStringBuilder();
    63 		SpannableStringBuilder ssb = new SpannableStringBuilder();
    64 		ssb.append(makeLogTime()).append(msg).append("\n");
    64 		ssb.append(makeLogTime()).append(msg);
    65 		appendRaw(ssb);
    65 		appendRaw(ssb);
    66 	}
    66 	}
    67 	
    67 	
    68 	private void appendRaw(CharSequence msg) {
    68 	private void appendRaw(CharSequence msg) {
    69 		lineLengths.add(msg.length());
    69 		if(log.size() > BACKLOG_LINES) {
    70 		log.append(msg);
    70 			log.remove(0);
    71 		while(log.length() > BACKLOG_CHARS) {
    71 			for(Observer o : observers) {
    72 			log.delete(0, lineLengths.remove(0));
    72 				o.lineRemoved();
       
    73 			}
    73 		}
    74 		}
       
    75 		log.add(msg);
    74 		for(Observer o : observers) {
    76 		for(Observer o : observers) {
    75 			o.textChanged(log);
    77 			o.lineAdded(msg);
    76 		}
    78 		}
    77 	}
    79 	}
    78 	
    80 	
    79 	void appendPlayerJoin(String playername) {
    81 	void appendPlayerJoin(String playername) {
    80 		append(withColor("***" + context.getResources().getString(R.string.log_player_join, playername), INFO_COLOR));
    82 		append(withColor("***" + context.getResources().getString(R.string.log_player_join, playername), INFO_COLOR));
   111 		case JnaFrontlib.NETCONN_MSG_TYPE_PLAYERINFO:
   113 		case JnaFrontlib.NETCONN_MSG_TYPE_PLAYERINFO:
   112 			// TODO better formatting or different way to display
   114 			// TODO better formatting or different way to display
   113 			append(msg);
   115 			append(msg);
   114 			break;
   116 			break;
   115 		case JnaFrontlib.NETCONN_MSG_TYPE_SERVERMESSAGE:
   117 		case JnaFrontlib.NETCONN_MSG_TYPE_SERVERMESSAGE:
   116 			appendRaw(span(TextUtils.concat("\n", Html.fromHtml(msg), "\n\n"), new RelativeSizeSpan(1.5f)));
   118 			appendRaw(span(TextUtils.concat("\n", Html.fromHtml(msg), "\n"), new RelativeSizeSpan(1.5f)));
   117 			break;
   119 			break;
   118 		default:
   120 		default:
   119 			Log.e("MessageLog", "Unknown messagetype "+type);
   121 			Log.e("MessageLog", "Unknown messagetype "+type);
   120 		}
   122 		}
   121 	}
   123 	}
   122 	
   124 	
   123 	void clear() {
   125 	void clear() {
       
   126 		for(Observer o : observers) {
       
   127 			o.clear();
       
   128 		}
   124 		log.clear();
   129 		log.clear();
   125 		lineLengths.clear();
       
   126 	}
   130 	}
   127 	
   131 	
   128 	public void observe(Observer o) {
   132 	public void registerObserver(Observer o) {
   129 		observers.add(o);
   133 		observers.add(o);
   130 	}
   134 	}
   131 	
   135 	
   132 	public void unobserve(Observer o) {
   136 	public void unregisterObserver(Observer o) {
   133 		observers.remove(o);
   137 		observers.remove(o);
   134 	}
   138 	}
   135 	
   139 	
   136 	public static interface Observer {
   140 	public static interface Observer {
   137 		void textChanged(Spanned text);
   141 		void lineAdded(CharSequence text);
       
   142 		void lineRemoved();
       
   143 		void clear();
       
   144 	}
       
   145 
       
   146 	public Collection<CharSequence> getLog() {
       
   147 		return Collections.unmodifiableList(log);
   138 	}
   148 	}
   139 }
   149 }