1 /* 2 * Copyright (C) 2014 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 17 package com.android.testingcamera2; 18 19 import java.util.Date; 20 import java.text.SimpleDateFormat; 21 22 import android.annotation.SuppressLint; 23 import android.content.Context; 24 import android.graphics.Color; 25 import android.os.Handler; 26 import android.os.Looper; 27 import android.text.Spannable; 28 import android.text.SpannableString; 29 import android.text.method.ScrollingMovementMethod; 30 import android.text.style.ForegroundColorSpan; 31 import android.util.AttributeSet; 32 import android.util.TypedValue; 33 import android.view.Gravity; 34 import android.view.View; 35 import android.view.MotionEvent; 36 import android.widget.LinearLayout; 37 import android.widget.TextView; 38 39 public class LogPane extends LinearLayout implements TLog.Logger { 40 41 private final TextView mLogTextView; 42 private final Handler mHandler; 43 44 @SuppressLint("SimpleDateFormat") 45 private SimpleDateFormat mDateFormatter = new SimpleDateFormat("HH:mm:ss.SSS : "); 46 LogPane(Context context, AttributeSet attrs)47 public LogPane(Context context, AttributeSet attrs) { 48 super(context, attrs); 49 50 mHandler = new Handler(Looper.getMainLooper()); 51 52 this.setOrientation(VERTICAL); 53 54 TextView titleText = new TextView(context); 55 titleText.setText(R.string.log_pane_label); 56 titleText.setTextSize(TypedValue.COMPLEX_UNIT_PX, 57 context.getResources().getDimension(R.dimen.pane_title_text)); 58 LinearLayout.LayoutParams titleTextLayoutParams = 59 new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 60 61 this.addView(titleText, titleTextLayoutParams); 62 63 mLogTextView = new TextView(context); 64 mLogTextView.setFreezesText(true); 65 LinearLayout.LayoutParams logTextLayoutParams = 66 new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 67 logTextLayoutParams.leftMargin = 40; 68 mLogTextView.setLayoutParams(logTextLayoutParams); 69 mLogTextView.setLines(10); 70 mLogTextView.setMovementMethod(new ScrollingMovementMethod()); 71 mLogTextView.setOnTouchListener(new View.OnTouchListener() { 72 @Override 73 public boolean onTouch(View view, MotionEvent event) { 74 // Allow scrolling of text while inside a scroll view 75 view.getParent().requestDisallowInterceptTouchEvent(true); 76 return false; 77 } 78 }); 79 mLogTextView.setGravity(Gravity.BOTTOM); 80 81 this.addView(mLogTextView); 82 } 83 84 @Override addToLog(final String text, boolean error)85 public void addToLog(final String text, boolean error) { 86 StringBuffer logEntry = new StringBuffer(32); 87 logEntry.append("\n").append(mDateFormatter.format(new Date())); 88 logEntry.append(text); 89 final Spannable logLine = new SpannableString(logEntry.toString()); 90 91 int lineColor = error ? Color.RED : Color.WHITE; 92 logLine.setSpan(new ForegroundColorSpan(lineColor), 0, logLine.length(), 93 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 94 95 mHandler.post(new Runnable() { 96 public void run() { 97 mLogTextView.append(logLine); 98 } 99 }); 100 } 101 } 102