diff --git a/app/build.gradle b/app/build.gradle index 586b387..9ce3973 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { compileSdk 30 defaultConfig { - applicationId "de.server47.smsexport" - minSdk 21 + applicationId "de.server47.messageexport" + minSdk 23 targetSdk 30 versionCode 1 versionName "1.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 05e1770..9fd5d6a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,11 +2,11 @@ - - + + - - + + + void startExport() + { + if(checkSelfPermission(Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED) + { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + startActivityForResult(intent, requestCodeExport); + } + else + { + tvStatus.setText(getResources().getString(R.string.permissionDenied)); + Toast.makeText(MainActivity.this, getResources().getString(R.string.permissionDenied), Toast.LENGTH_LONG).show(); + } + } + + class AsyncTaskExport extends AsyncTask { String getExportString() { @@ -82,7 +109,9 @@ public class MainActivity extends Activity { messageCount = response.size(); - publishProgress((int)Math.round(messageCount/response.size())); + tvStatus.setText(String.format(getResources().getString(R.string.exporting), String.valueOf(response.size()))); + + publishProgress((int)Math.round(messageCount/response.size()*100)); StringBuilder export = new StringBuilder(); @@ -139,15 +168,27 @@ public class MainActivity extends Activity } @Override - protected Void doInBackground(Uri... uriTree) + protected Boolean doInBackground(Uri... uriTree) { + int selectedMessageType; + if(rbRcs.isChecked()) + selectedMessageType = typeRCS; + else if(rbSms.isChecked()) + selectedMessageType = typeSMS; + else + selectedMessageType = typeMMS; + String dataToWrite = getExportString(); if(!StringUtils.isEmpty(dataToWrite)) - exportFiles(uriTree[0], dataToWrite); + return exportFiles(uriTree[0], selectedMessageType, dataToWrite); else + { + if (Looper.myLooper() == null) + Looper.prepare(); Toast.makeText(MainActivity.this, "Error reading messages. Can\'t export.", Toast.LENGTH_SHORT).show(); + } - return null; + return false; } @Override @@ -156,6 +197,17 @@ public class MainActivity extends Activity super.onProgressUpdate(values); pbStatus.setProgress(values[0]); } + + @Override + protected void onPostExecute(Boolean result) + { + super.onPostExecute(result); + + if(result) + tvStatus.setText(String.format(getResources().getString(R.string.exported), String.valueOf(messageCount))); + else + tvStatus.setText(getResources().getString(R.string.errorExporting)); + } } @Override @@ -168,19 +220,27 @@ public class MainActivity extends Activity switch (requestCode) { case requestCodeExport: - if (resultCode == RESULT_OK) - { - AsyncTask exportTask = new AsyncTaskExport(); - exportTask.execute(data.getData()); - } + AsyncTask exportTask = new AsyncTaskExport(); + exportTask.execute(data.getData()); + break; + case requestCodePermissionRequest: + startExport(); break; } } } - void exportFiles(Uri uriTree, String content) + boolean exportFiles(Uri uriTree, int messageType, String content) { - String fileName = "Message_export_" + String.valueOf(Calendar.getInstance().getTimeInMillis()) + ".xml"; + String messageTypeString; + if(messageType == typeRCS) + messageTypeString = "RCS"; + else if(messageType == typeSMS) + messageTypeString = "SMS"; + else + messageTypeString = "MMS"; + + String fileName = "Message_export_" + messageTypeString + "_" + String.valueOf(Calendar.getInstance().getTimeInMillis()) + ".xml"; DocumentFile directory = DocumentFile.fromTreeUri(this, uriTree); @@ -209,17 +269,17 @@ public class MainActivity extends Activity OutputStream out = getApplicationContext().getContentResolver().openOutputStream(exportFile.getUri()); out.write(content.getBytes()); out.close(); - - Toast.makeText(MainActivity.this, "Export complete. " + String.valueOf(messageCount) + " messages have been exported.", Toast.LENGTH_LONG).show(); + return true; } catch (IOException e) { e.printStackTrace(); - Toast.makeText(MainActivity.this, "Error while writing file.", Toast.LENGTH_LONG).show(); } } // else // Toast.makeText(MainActivity.this, getResources().getString(R.string.ConfigurationExportError), Toast.LENGTH_LONG).show(); + + return false; } List> readMessages(int messageType) @@ -250,7 +310,7 @@ public class MainActivity extends Activity Cursor cursor = getContentResolver().query(path, null, null, null, null); - if (cursor.moveToFirst()) + if (cursor != null && cursor.moveToFirst()) { // must check the result to prevent exception long messageCounter = 0; diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index cfb8def..4fd69af 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -46,11 +46,18 @@ android:minHeight="50dp" android:max="100" /> +