1 package com.android.tv.feedbackconsent; 2 3 import android.util.Log; 4 5 import androidx.annotation.NonNull; 6 7 import java.io.BufferedReader; 8 import java.io.IOException; 9 import java.io.InputStream; 10 import java.io.InputStreamReader; 11 import java.util.ArrayList; 12 import java.util.Arrays; 13 import java.util.List; 14 15 /** 16 * Generates and returns diagnostic data (such as logs, dumpsys, etc) from a device. 17 */ 18 final class TvFeedbackConsentDataCollector { 19 20 private static final String TAG = TvFeedbackConsentDataCollector.class.getSimpleName(); 21 22 private List<String> mSystemLogs = new ArrayList<>(0); 23 private final TvFeedbackConsentDataCollectorCallback mDataCollectorCallback; 24 TvFeedbackConsentDataCollector(TvFeedbackConsentDataCollectorCallback callback)25 TvFeedbackConsentDataCollector(TvFeedbackConsentDataCollectorCallback callback) { 26 mDataCollectorCallback = callback; 27 } 28 getSystemLogs()29 public List<String> getSystemLogs() { 30 return mSystemLogs; 31 } 32 setSystemLogs(List<String> systemLogs)33 private void setSystemLogs(List<String> systemLogs) { 34 this.mSystemLogs = systemLogs; 35 } 36 37 /** 38 * Collects system logs through logcat (usually around 1-2 MB for the default 10,000 lines). 39 */ collectSystemLogs(long numLines)40 public void collectSystemLogs(long numLines) { 41 List<String> systemLogsCommand = 42 Arrays.asList("logcat", "-d", "-v", "time", "-t", String.valueOf(numLines)); 43 setSystemLogs(runCommand(systemLogsCommand)); 44 mDataCollectorCallback.onSystemLogsReady(); 45 } 46 47 @NonNull runCommand(List<String> command)48 private List<String> runCommand(List<String> command) { 49 List<String> output = new ArrayList<>(0); 50 try { 51 Process proc = new ProcessBuilder(command).start(); 52 53 try (InputStream stream = proc.getInputStream()) { 54 BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 55 56 String line; 57 while ((line = reader.readLine()) != null) { 58 output.add(line.trim()); 59 } 60 } 61 } catch (IOException e) { 62 Log.e(TAG, "Caught exception while running command.", e); 63 } 64 return output; 65 } 66 67 /** 68 * Interface defining callbacks for data collection. 69 * 70 * @hide 71 */ 72 interface TvFeedbackConsentDataCollectorCallback { 73 /** 74 * Callback invoked when system Logs are ready 75 */ onSystemLogsReady()76 void onSystemLogsReady(); 77 } 78 } 79