Merge "Changed BugReportReceiver to send zipped bugreports." into mnc-dev
This commit is contained in:
@@ -33,11 +33,22 @@ import android.os.FileUtils;
|
|||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.support.v4.content.FileProvider;
|
import android.support.v4.content.FileProvider;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
import android.util.Log;
|
||||||
import android.util.Patterns;
|
import android.util.Patterns;
|
||||||
|
|
||||||
import com.google.android.collect.Lists;
|
import com.google.android.collect.Lists;
|
||||||
|
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,30 +84,14 @@ public class BugreportReceiver extends BroadcastReceiver {
|
|||||||
final Uri bugreportUri = FileProvider.getUriForFile(context, AUTHORITY, bugreportFile);
|
final Uri bugreportUri = FileProvider.getUriForFile(context, AUTHORITY, bugreportFile);
|
||||||
final Uri screenshotUri = FileProvider.getUriForFile(context, AUTHORITY, screenshotFile);
|
final Uri screenshotUri = FileProvider.getUriForFile(context, AUTHORITY, screenshotFile);
|
||||||
|
|
||||||
Intent sendIntent = buildSendIntent(context, bugreportUri, screenshotUri);
|
boolean isPlainText = bugreportFile.getName().toLowerCase().endsWith(".txt");
|
||||||
Intent notifIntent;
|
if (!isPlainText) {
|
||||||
|
// Already zipped, send it right away.
|
||||||
// Send through warning dialog by default
|
sendBugreportNotification(context, bugreportFile, screenshotFile);
|
||||||
if (getWarningState(context, STATE_SHOW) == STATE_SHOW) {
|
|
||||||
notifIntent = buildWarningIntent(context, sendIntent);
|
|
||||||
} else {
|
} else {
|
||||||
notifIntent = sendIntent;
|
// Asynchronously zip the file first, then send it.
|
||||||
|
sendZippedBugreportNotification(context, bugreportFile, screenshotFile);
|
||||||
}
|
}
|
||||||
notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
|
|
||||||
final Notification.Builder builder = new Notification.Builder(context)
|
|
||||||
.setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
|
|
||||||
.setContentTitle(context.getString(R.string.bugreport_finished_title))
|
|
||||||
.setTicker(context.getString(R.string.bugreport_finished_title))
|
|
||||||
.setContentText(context.getString(R.string.bugreport_finished_text))
|
|
||||||
.setContentIntent(PendingIntent.getActivity(
|
|
||||||
context, 0, notifIntent, PendingIntent.FLAG_CANCEL_CURRENT))
|
|
||||||
.setAutoCancel(true)
|
|
||||||
.setLocalOnly(true)
|
|
||||||
.setColor(context.getColor(
|
|
||||||
com.android.internal.R.color.system_notification_accent_color));
|
|
||||||
|
|
||||||
NotificationManager.from(context).notify(TAG, 0, builder.build());
|
|
||||||
|
|
||||||
// Clean up older bugreports in background
|
// Clean up older bugreports in background
|
||||||
final PendingResult result = goAsync();
|
final PendingResult result = goAsync();
|
||||||
@@ -140,6 +135,107 @@ public class BugreportReceiver extends BroadcastReceiver {
|
|||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a bugreport notitication.
|
||||||
|
*/
|
||||||
|
private static void sendBugreportNotification(Context context, File bugreportFile,
|
||||||
|
File screenshotFile) {
|
||||||
|
// Files are kept on private storage, so turn into Uris that we can
|
||||||
|
// grant temporary permissions for.
|
||||||
|
final Uri bugreportUri = FileProvider.getUriForFile(context, AUTHORITY, bugreportFile);
|
||||||
|
final Uri screenshotUri = FileProvider.getUriForFile(context, AUTHORITY, screenshotFile);
|
||||||
|
|
||||||
|
Intent sendIntent = buildSendIntent(context, bugreportUri, screenshotUri);
|
||||||
|
Intent notifIntent;
|
||||||
|
|
||||||
|
// Send through warning dialog by default
|
||||||
|
if (getWarningState(context, STATE_SHOW) == STATE_SHOW) {
|
||||||
|
notifIntent = buildWarningIntent(context, sendIntent);
|
||||||
|
} else {
|
||||||
|
notifIntent = sendIntent;
|
||||||
|
}
|
||||||
|
notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
|
||||||
|
final Notification.Builder builder = new Notification.Builder(context)
|
||||||
|
.setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
|
||||||
|
.setContentTitle(context.getString(R.string.bugreport_finished_title))
|
||||||
|
.setTicker(context.getString(R.string.bugreport_finished_title))
|
||||||
|
.setContentText(context.getString(R.string.bugreport_finished_text))
|
||||||
|
.setContentIntent(PendingIntent.getActivity(
|
||||||
|
context, 0, notifIntent, PendingIntent.FLAG_CANCEL_CURRENT))
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setLocalOnly(true)
|
||||||
|
.setColor(context.getColor(
|
||||||
|
com.android.internal.R.color.system_notification_accent_color));
|
||||||
|
|
||||||
|
NotificationManager.from(context).notify(TAG, 0, builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a zipped bugreport notification.
|
||||||
|
*/
|
||||||
|
private static void sendZippedBugreportNotification(final Context context,
|
||||||
|
final File bugreportFile, final File screenshotFile) {
|
||||||
|
new AsyncTask<Void, Void, Void>() {
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params) {
|
||||||
|
File zippedFile = zipBugreport(bugreportFile);
|
||||||
|
sendBugreportNotification(context, zippedFile, screenshotFile);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Zips a bugreport file, returning the path to the new file (or to the
|
||||||
|
* original in case of failure).
|
||||||
|
*/
|
||||||
|
private static File zipBugreport(File bugreportFile) {
|
||||||
|
byte[] bytes = read(bugreportFile);
|
||||||
|
if (bytes == null) {
|
||||||
|
// Could not read bugreport, return original.
|
||||||
|
return bugreportFile;
|
||||||
|
}
|
||||||
|
String bugreportPath = bugreportFile.getAbsolutePath();
|
||||||
|
String zippedPath = bugreportPath.replace(".txt", ".zip");
|
||||||
|
Log.v(TAG, "zipping " + bugreportPath + " as " + zippedPath);
|
||||||
|
File bugreportZippedFile = new File(zippedPath);
|
||||||
|
try (ZipOutputStream zos = new ZipOutputStream(
|
||||||
|
new BufferedOutputStream(new FileOutputStream(bugreportZippedFile)))) {
|
||||||
|
ZipEntry entry = new ZipEntry("bugreport.txt");
|
||||||
|
zos.putNextEntry(entry);
|
||||||
|
zos.write(bytes);
|
||||||
|
zos.closeEntry();
|
||||||
|
// Delete old file;
|
||||||
|
boolean deleted = bugreportFile.delete();
|
||||||
|
if (deleted) {
|
||||||
|
Log.v(TAG, "deleted original bugreport (" + bugreportPath + ")");
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "could not delete original bugreport (" + bugreportPath + ")");
|
||||||
|
}
|
||||||
|
return bugreportZippedFile;
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "exception zipping file " + zippedPath, e);
|
||||||
|
return bugreportFile; // Return original.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the content of file, or {@code null} in case of error. */
|
||||||
|
private static byte[] read(File file) {
|
||||||
|
try (ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||||
|
InputStream input = new FileInputStream(file)) {
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int read = 0;
|
||||||
|
while ((read = input.read(buffer)) != -1) {
|
||||||
|
output.write(buffer, 0, read);
|
||||||
|
}
|
||||||
|
return output.toByteArray();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "IOException reading " + file.getAbsolutePath(), e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the best matching {@link Account} based on build properties.
|
* Find the best matching {@link Account} based on build properties.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user