1
/*
2
* Copyright (C) 2013 The Android Open Source Project
3
*
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
7
*
8
* http://www.apache.org/licenses/LICENSE-2.0
9
*
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
15
*/
16
package com.example.android.common.logger;
17
18
import android.app.Activity;
19
import android.content.Context;
20
import android.util.*;
21
import android.widget.TextView;
22
23
/** Simple TextView which is used to output log data received through the LogNode interface.
24
*/
25
public class LogView extends TextView implements LogNode {
26
27
public LogView(Context context) {
28
super(context);
29
}
30
31
public LogView(Context context, AttributeSet attrs) {
32
super(context, attrs);
33
}
34
35
public LogView(Context context, AttributeSet attrs, int defStyle) {
36
super(context, attrs, defStyle);
37
}
38
39
/**
40
* Formats the log data and prints it out to the LogView.
41
* @param priority Log level of the data being logged. Verbose, Error, etc.
42
* @param tag Tag for for the log data. Can be used to organize log statements.
43
* @param msg The actual message to be logged. The actual message to be logged.
44
* @param tr If an exception was thrown, this can be sent along for the logging facilities
45
* to extract and print useful information.
46
*/
47
@Override
48
public void println(int priority, String tag, String msg, Throwable tr) {
49
50
51
String priorityStr = null;
52
53
// For the purposes of this View, we want to print the priority as readable text.
54
switch(priority) {
55
case android.util.Log.VERBOSE:
56
priorityStr = "VERBOSE";
57
break;
58
case android.util.Log.DEBUG:
59
priorityStr = "DEBUG";
60
break;
61
case android.util.Log.INFO:
62
priorityStr = "INFO";
63
break;
64
case android.util.Log.WARN:
65
priorityStr = "WARN";
66
break;
67
case android.util.Log.ERROR:
68
priorityStr = "ERROR";
69
break;
70
case android.util.Log.ASSERT:
71
priorityStr = "ASSERT";
72
break;
73
default:
74
break;
75
}
76
77
// Handily, the Log class has a facility for converting a stack trace into a usable string.
78
String exceptionStr = null;
79
if (tr != null) {
80
exceptionStr = android.util.Log.getStackTraceString(tr);
81
}
82
83
// Take the priority, tag, message, and exception, and concatenate as necessary
84
// into one usable line of text.
85
final StringBuilder outputBuilder = new StringBuilder();
86
87
String delimiter = "\t";
88
appendIfNotNull(outputBuilder, priorityStr, delimiter);
89
appendIfNotNull(outputBuilder, tag, delimiter);
90
appendIfNotNull(outputBuilder, msg, delimiter);
91
appendIfNotNull(outputBuilder, exceptionStr, delimiter);
92
93
// In case this was originally called from an AsyncTask or some other off-UI thread,
94
// make sure the update occurs within the UI thread.
95
((Activity) getContext()).runOnUiThread( (new Thread(new Runnable() {
96
@Override
97
public void run() {
98
// Display the text we just generated within the LogView.
99
appendToLog(outputBuilder.toString());
100
}
101
})));
102
103
if (mNext != null) {
104
mNext.println(priority, tag, msg, tr);
105
}
106
}
107
108
public LogNode getNext() {
109
return mNext;
110
}
111
112
public void setNext(LogNode node) {
113
mNext = node;
114
}
115
116
/** Takes a string and adds to it, with a separator, if the bit to be added isn't null. Since
117
* the logger takes so many arguments that might be null, this method helps cut out some of the
118
* agonizing tedium of writing the same 3 lines over and over.
119
* @param source StringBuilder containing the text to append to.
120
* @param addStr The String to append
121
* @param delimiter The String to separate the source and appended strings. A tab or comma,
122
* for instance.
123
* @return The fully concatenated String as a StringBuilder
124
*/
125
private StringBuilder appendIfNotNull(StringBuilder source, String addStr, String delimiter) {
126
if (addStr != null) {
127
if (addStr.length() == 0) {
128
delimiter = "";
129
}
130
131
return source.append(addStr).append(delimiter);
132
}
133
return source;
134
}
135
136
// The next LogNode in the chain.
137
LogNode mNext;
138
139
/** Outputs the string as a new line of log data in the LogView. */
140
public void appendToLog(String s) {
141
append("\n" + s);
142
}
143
144
145
}