diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 882e1fb13..824821136 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + { + //first we need to check if we have the necessary permissions + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission( + getActivity(), + Manifest.permission.WRITE_EXTERNAL_STORAGE) + == + PackageManager.PERMISSION_GRANTED) { + sendAppLogsViaEmail(); + } else { + //first get the necessary permission + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + REQUEST_CODE_WRITE_EXTERNAL_STORAGE); + } + } else { + sendAppLogsViaEmail(); + } + return true; + }); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + sendAppLogsViaEmail(); + } + } + } + + private void sendAppLogsViaEmail() { + String appLogs = Utils.getAppLogs(); + File appLogsFile = FileUtils.createAndGetAppLogsFile(appLogs); + Uri appLogsFilePath = Uri.fromFile(appLogsFile); + + Intent feedbackIntent = new Intent(Intent.ACTION_SEND); + feedbackIntent.setType("message/rfc822"); + feedbackIntent.putExtra(Intent.EXTRA_EMAIL, + new String[]{CommonsApplication.FEEDBACK_EMAIL}); + feedbackIntent.putExtra(Intent.EXTRA_SUBJECT, + String.format(CommonsApplication.FEEDBACK_EMAIL_SUBJECT, + BuildConfig.VERSION_NAME)); + feedbackIntent.putExtra(Intent.EXTRA_STREAM,appLogsFilePath); + + try { + startActivity(feedbackIntent); + } catch (ActivityNotFoundException e) { + Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show(); + } } } diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java index 1c816b9e1..6c3fc9a90 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java @@ -1,11 +1,17 @@ package fr.free.nrw.commons.utils; +import android.os.Environment; + import java.io.BufferedReader; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; import fr.free.nrw.commons.CommonsApplication; +import timber.log.Timber; public class FileUtils { /** @@ -53,5 +59,32 @@ public class FileUtils { return deletedAll; } + public static File createAndGetAppLogsFile(String logs) { + try { + File commonsAppDirectory = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp"); + if (!commonsAppDirectory.exists()) { + commonsAppDirectory.mkdir(); + } + File logsFile = new File(commonsAppDirectory,"logs.txt"); + if (logsFile.exists()) { + //old logs file is useless + logsFile.delete(); + } + + logsFile.createNewFile(); + + FileOutputStream outputStream = new FileOutputStream(logsFile); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); + outputStreamWriter.append(logs); + outputStreamWriter.close(); + outputStream.flush(); + outputStream.close(); + + return logsFile; + } catch (IOException ioe) { + Timber.e(ioe); + return null; + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e7825b6b..b1d580a34 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,4 +207,6 @@ Tap this message (or hit back) to skip this step. Give permission Use external storage Save pictures taken with the in-app camera on your device + Send Logs + Send logs to developers via email diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index fab5c93e7..2ceffcb8c 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -53,4 +53,9 @@ android:summary="@string/use_external_storage_summary" /> + + \ No newline at end of file