aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java')
-rw-r--r--app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java44
1 files changed, 20 insertions, 24 deletions
diff --git a/app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java b/app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java
index b5988272..565854b4 100644
--- a/app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java
+++ b/app/src/main/java/com/wireguard/android/preference/LogExporterPreference.java
@@ -8,22 +8,21 @@ package com.wireguard.android.preference;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.os.Environment;
import androidx.annotation.Nullable;
import com.google.android.material.snackbar.Snackbar;
import androidx.preference.Preference;
+
import android.util.AttributeSet;
import android.util.Log;
import com.wireguard.android.Application;
import com.wireguard.android.R;
+import com.wireguard.android.util.DownloadsFileSaver;
+import com.wireguard.android.util.DownloadsFileSaver.DownloadsFile;
import com.wireguard.android.util.ErrorMessages;
import com.wireguard.android.util.FragmentUtils;
import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
import java.io.InputStreamReader;
/**
@@ -41,36 +40,33 @@ public class LogExporterPreference extends Preference {
private void exportLog() {
Application.getAsyncWorker().supplyAsync(() -> {
- final File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
- final File file = new File(path, "wireguard-log.txt");
- if (!path.isDirectory() && !path.mkdirs())
- throw new IOException(
- getContext().getString(R.string.create_output_dir_error));
-
- /* We would like to simply run `builder.redirectOutput(file);`, but this is API 26.
- * Instead we have to do this dance, since logcat appends.
- */
- new FileOutputStream(file).close();
-
+ DownloadsFile outputFile = DownloadsFileSaver.save(getContext(), "wireguard-log.txt", "text/plain", true);
try {
final Process process = Runtime.getRuntime().exec(new String[]{
- "logcat", "-b", "all", "-d", "-v", "threadtime", "-f", file.getAbsolutePath(), "*:V"});
- if (process.waitFor() != 0) {
- try (final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
+ "logcat", "-b", "all", "-d", "-v", "threadtime", "*:V"});
+ try (final BufferedReader stdout = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ final BufferedReader stderr = new BufferedReader(new InputStreamReader(process.getErrorStream())))
+ {
+ String line;
+ while ((line = stdout.readLine()) != null) {
+ outputFile.getOutputStream().write(line.getBytes());
+ outputFile.getOutputStream().write('\n');
+ }
+ outputFile.getOutputStream().close();
+ stdout.close();
+ if (process.waitFor() != 0) {
final StringBuilder errors = new StringBuilder();
- errors.append("Unable to run logcat: ");
- String line;
- while ((line = reader.readLine()) != null)
+ errors.append(R.string.logcat_error);
+ while ((line = stderr.readLine()) != null)
errors.append(line);
throw new Exception(errors.toString());
}
}
} catch (final Exception e) {
- // noinspection ResultOfMethodCallIgnored
- file.delete();
+ outputFile.delete();
throw e;
}
- return file.getAbsolutePath();
+ return outputFile.getFileName();
}).whenComplete(this::exportLogComplete);
}