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 } |