Merge pull request #7572 from osmandapp/ShareLogcat

Share logcat file
This commit is contained in:
max-klaus 2019-09-18 12:21:02 +03:00 committed by GitHub
commit c4dc274e33
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 91 additions and 8 deletions

View file

@ -1009,9 +1009,13 @@ public class OsmandApplication extends MultiDexApplication {
}
public void sendCrashLog() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"crash@osmand.net"});
File file = getAppPath(OsmandApplication.EXCEPTION_PATH);
sendCrashLog(file);
}
public void sendCrashLog(File file) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"crash@osmand.net"});
intent.putExtra(Intent.EXTRA_STREAM, AndroidUtils.getUriForFile(this, file));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("vnd.android.cursor.dir/email");

View file

@ -9,7 +9,9 @@ import android.support.v7.app.ActionBar;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@ -19,11 +21,14 @@ import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.OsmandActionBarActivity;
import net.osmand.plus.activities.ActionBarProgressActivity;
import org.apache.commons.logging.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
@ -33,10 +38,14 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class LogcatActivity extends OsmandActionBarActivity {
public class LogcatActivity extends ActionBarProgressActivity {
public static final String LOGCAT_PATH = "logcat.log";
public static int MAX_BUFFER_LOG = 1000;
private static final int SHARE_ID = 0;
private static final Log log = PlatformUtil.getLog(LogcatActivity.class);
private LogcatAsyncTask logcatAsyncTask;
@ -90,6 +99,15 @@ public class LogcatActivity extends OsmandActionBarActivity {
stopLogcatAsyncTask();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add(0, SHARE_ID, 0, R.string.shared_string_export);
item.setIcon(R.drawable.ic_action_gshare_dark);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
@ -97,6 +115,9 @@ public class LogcatActivity extends OsmandActionBarActivity {
case android.R.id.home:
finish();
return true;
case SHARE_ID:
startSaveLogsAsyncTask();
return true;
}
return false;
@ -113,12 +134,17 @@ public class LogcatActivity extends OsmandActionBarActivity {
});
}
public void startLogcatAsyncTask() {
private void startSaveLogsAsyncTask() {
SaveLogsAsyncTask saveLogsAsyncTask = new SaveLogsAsyncTask(this, logsMap.values());
saveLogsAsyncTask.execute();
}
private void startLogcatAsyncTask() {
logcatAsyncTask = new LogcatAsyncTask(this, "*:E");
logcatAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void stopLogcatAsyncTask() {
private void stopLogcatAsyncTask() {
if (logcatAsyncTask != null && logcatAsyncTask.getStatus() == AsyncTask.Status.RUNNING) {
logcatAsyncTask.cancel(false);
logcatAsyncTask.stopLogging();
@ -133,7 +159,8 @@ public class LogcatActivity extends OsmandActionBarActivity {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
View itemView = inflater.inflate(R.layout.bottom_sheet_item_description_long, viewGroup, false);
TextView itemView = (TextView) inflater.inflate(R.layout.bottom_sheet_item_description_long, viewGroup, false);
itemView.setGravity(Gravity.CENTER_VERTICAL);
return new LogViewHolder(itemView);
}
@ -176,6 +203,58 @@ public class LogcatActivity extends OsmandActionBarActivity {
}
}
public static class SaveLogsAsyncTask extends AsyncTask<Void, String, File> {
private WeakReference<LogcatActivity> logcatActivity;
private Collection<String> logs;
SaveLogsAsyncTask(LogcatActivity logcatActivity, Collection<String> logs) {
this.logcatActivity = new WeakReference<>(logcatActivity);
this.logs = logs;
}
@Override
protected void onPreExecute() {
LogcatActivity activity = logcatActivity.get();
if (activity != null) {
activity.setSupportProgressBarIndeterminateVisibility(true);
}
}
@Override
protected File doInBackground(Void... voids) {
File file = logcatActivity.get().getMyApplication().getAppPath(LOGCAT_PATH);
try {
if (file.exists()) {
file.delete();
}
StringBuilder stringBuilder = new StringBuilder();
for (String log : logs) {
stringBuilder.append(log);
stringBuilder.append("\n");
}
if (file.getParentFile().canWrite()) {
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
writer.write(stringBuilder.toString());
writer.close();
}
} catch (Exception e) {
log.error(e);
}
return file;
}
@Override
protected void onPostExecute(File file) {
LogcatActivity activity = logcatActivity.get();
if (activity != null) {
activity.setSupportProgressBarIndeterminateVisibility(false);
activity.getMyApplication().sendCrashLog(file);
}
}
}
public static class LogcatAsyncTask extends AsyncTask<Void, String, Void> {
private Process processLogcat;
@ -192,7 +271,7 @@ public class LogcatActivity extends OsmandActionBarActivity {
protected Void doInBackground(Void... voids) {
try {
String filter = String.valueOf(android.os.Process.myPid());
String[] command = {"logcat", filterLevel, " | grep " + filter, "-T", String.valueOf(MAX_BUFFER_LOG)};
String[] command = {"logcat", filterLevel, "--pid=" + filter, "-T", String.valueOf(MAX_BUFFER_LOG)};
processLogcat = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(processLogcat.getInputStream()));