package com.tencent.wstt.gt.log.logcat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collections; import java.util.List; import android.text.TextUtils; public class SingleLogcatReader extends AbsLogcatReader { private Process logcatProcess; private BufferedReader bufferedReader; private String logBuffer; private String lastLine; public SingleLogcatReader(boolean recordingMode, String logBuffer, String lastLine) throws IOException { super(recordingMode); this.logBuffer = logBuffer; this.lastLine = lastLine; init(); } private void init() throws IOException { // use the "time" log so we can see what time the logs were logged at logcatProcess = LogcatHelper.getLogcatProcess(logBuffer); bufferedReader = new BufferedReader(new InputStreamReader(logcatProcess .getInputStream()), 8192); } public String getLogBuffer() { return logBuffer; } @Override public void killQuietly() { if (logcatProcess != null) { RuntimeHelper.destroy(logcatProcess); } // post-jellybean, we just kill the process, so there's no need // to close the bufferedReader. Anyway, it just hangs. if (VersionHelper.getVersionSdkIntCompat() < VersionHelper.VERSION_JELLYBEAN && bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public String readLine() throws IOException { String line = bufferedReader.readLine(); if (recordingMode && lastLine != null) { // still skipping past the 'last line' if (lastLine.equals(line) || isAfterLastTime(line)) { lastLine = null; // indicates we've passed the last line } } return line; } private boolean isAfterLastTime(String line) { // doing a string comparison is sufficient to determine whether this line is chronologically // after the last line, because the format they use is exactly the same and // lists larger time period before smaller ones return isDatedLogLine(lastLine) && isDatedLogLine(line) && line.compareTo(lastLine) > 0; } private boolean isDatedLogLine(String line) { // 18 is the size of the logcat timestamp return (!TextUtils.isEmpty(line) && line.length() >= 18 && Character.isDigit(line.charAt(0))); } @Override public boolean readyToRecord() { if (!recordingMode) { return false; } return lastLine == null; } @Override public List<Process> getProcesses() { return Collections.singletonList(logcatProcess); } }