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