diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e16f58ac54..dfd4576c40 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -120,9 +120,6 @@ - - - - diff --git a/res/values/strings.xml b/res/values/strings.xml index 2cff514c5b..1fe12a948d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -352,36 +352,6 @@ Me - - Import - Export - - - Import system SMS database? - This will import - messages from the system\'s default SMS database to Signal. If you\'ve previously - imported the system\'s SMS database, importing again will result in duplicated messages. - - Import - Cancel - Import plaintext backup? - This will import - messages from a plaintext backup. If you\'ve previously imported this backup, - importing again will result in duplicated messages. - - Importing - Importing plaintext backup... - No plaintext backup found! - Error importing backup! - Import complete! - - Signal needs the SMS permission in order to import SMS messages, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"SMS\". - Signal needs the SMS permission in order to import SMS messages - Signal needs the Storage permission in order to read from external storage, but it has been permanently denied. Please continue to app settings, select \"Permissions\", then enable \"Storage\". - Signal needs the Storage permission in order to read from external storage. - Signal needs the Storage permission in order to write to external storage, but it has been permanently denied. Please continue to app settings, select \"Permissions\", then enable \"Storage\". - Signal needs the Storage permission in order to write to external storage. - Tap and hold to record a voice message, release to send diff --git a/src/org/thoughtcrime/securesms/ConversationListActivity.java b/src/org/thoughtcrime/securesms/ConversationListActivity.java index 991c573ab4..53eb4c2f7d 100644 --- a/src/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListActivity.java @@ -25,8 +25,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.widget.Toolbar; -import android.text.TextUtils; -import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -169,7 +167,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit case R.id.menu_settings: handleDisplaySettings(); return true; case R.id.menu_clear_passphrase: handleClearPassphrase(); return true; case R.id.menu_mark_all_read: handleMarkAllRead(); return true; - case R.id.menu_import_export: handleImportExport(); return true; case R.id.menu_invite: handleInvite(); return true; case R.id.menu_help: handleHelp(); return true; } @@ -225,10 +222,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit startService(intent); } - private void handleImportExport() { - startActivity(new Intent(this, ImportExportActivity.class)); - } - @SuppressLint("StaticFieldLeak") private void handleMarkAllRead() { new AsyncTask() { diff --git a/src/org/thoughtcrime/securesms/ImportExportActivity.java b/src/org/thoughtcrime/securesms/ImportExportActivity.java deleted file mode 100644 index 2924da46ce..0000000000 --- a/src/org/thoughtcrime/securesms/ImportExportActivity.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.thoughtcrime.securesms; - -import android.os.Bundle; -import android.view.MenuItem; - -import org.thoughtcrime.securesms.util.DynamicLanguage; -import org.thoughtcrime.securesms.util.DynamicTheme; - - -public class ImportExportActivity extends PassphraseRequiredActionBarActivity { - - private DynamicTheme dynamicTheme = new DynamicTheme(); - private DynamicLanguage dynamicLanguage = new DynamicLanguage(); - - @Override - protected void onPreCreate() { - dynamicTheme.onCreate(this); - } - - @Override - protected void onCreate(Bundle savedInstanceState, boolean ready) { - assert getSupportActionBar() != null; - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - initFragment(android.R.id.content, new ImportExportFragment(), dynamicLanguage.getCurrentLocale()); - } - - @Override - public void onResume() { - dynamicTheme.onResume(this); - super.onResume(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - super.onOptionsItemSelected(item); - - switch (item.getItemId()) { - case android.R.id.home: finish(); return true; - } - - return false; - } -} diff --git a/src/org/thoughtcrime/securesms/ImportExportFragment.java b/src/org/thoughtcrime/securesms/ImportExportFragment.java deleted file mode 100644 index ae787a7074..0000000000 --- a/src/org/thoughtcrime/securesms/ImportExportFragment.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.thoughtcrime.securesms; - -import android.Manifest; -import android.annotation.SuppressLint; -import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.os.AsyncTask; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v7.app.AlertDialog; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Toast; - -import org.thoughtcrime.securesms.database.NoExternalStorageException; -import org.thoughtcrime.securesms.database.PlaintextBackupImporter; -import org.thoughtcrime.securesms.permissions.Permissions; -import org.thoughtcrime.securesms.service.ApplicationMigrationService; - -import java.io.IOException; - - -public class ImportExportFragment extends Fragment { - - @SuppressWarnings("unused") - private static final String TAG = ImportExportFragment.class.getSimpleName(); - - private static final int SUCCESS = 0; - private static final int NO_SD_CARD = 1; - private static final int ERROR_IO = 2; - - private ProgressDialog progressDialog; - - @Override - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle bundle) { - View layout = inflater.inflate(R.layout.import_export_fragment, container, false); - View importSmsView = layout.findViewById(R.id.import_sms ); - View importPlaintextView = layout.findViewById(R.id.import_plaintext_backup); - - importSmsView.setOnClickListener(v -> handleImportSms()); - importPlaintextView.setOnClickListener(v -> handleImportPlaintextBackup()); - - return layout; - } - - @Override - public void onDestroy() { - super.onDestroy(); - - if (progressDialog != null && progressDialog.isShowing()) { - progressDialog.dismiss(); - progressDialog = null; - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); - } - - @SuppressWarnings("CodeBlock2Expr") - private void handleImportSms() { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setIconAttribute(R.attr.dialog_info_icon); - builder.setTitle(getActivity().getString(R.string.ImportFragment_import_system_sms_database)); - builder.setMessage(getActivity().getString(R.string.ImportFragment_this_will_import_messages_from_the_system)); - builder.setPositiveButton(getActivity().getString(R.string.ImportFragment_import), (dialog, which) -> { - Permissions.with(this) - .request(Manifest.permission.READ_SMS) - .ifNecessary() - .withPermanentDenialDialog(getString(R.string.ImportExportFragment_signal_needs_the_sms_permission_in_order_to_import_sms_messages)) - .onAllGranted(() -> { - Intent intent = new Intent(getActivity(), ApplicationMigrationService.class); - intent.setAction(ApplicationMigrationService.MIGRATE_DATABASE); - getActivity().startService(intent); - - Intent nextIntent = new Intent(getActivity(), ConversationListActivity.class); - - Intent activityIntent = new Intent(getActivity(), DatabaseMigrationActivity.class); - activityIntent.putExtra("next_intent", nextIntent); - getActivity().startActivity(activityIntent); - }) - .onAnyDenied(() -> Toast.makeText(getContext(), R.string.ImportExportFragment_signal_needs_the_sms_permission_in_order_to_import_sms_messages_toast, Toast.LENGTH_LONG).show()) - .execute(); - }); - builder.setNegativeButton(getActivity().getString(R.string.ImportFragment_cancel), null); - builder.show(); - } - - @SuppressWarnings("CodeBlock2Expr") - @SuppressLint("InlinedApi") - private void handleImportPlaintextBackup() { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setIconAttribute(R.attr.dialog_alert_icon); - builder.setTitle(getActivity().getString(R.string.ImportFragment_import_plaintext_backup)); - builder.setMessage(getActivity().getString(R.string.ImportFragment_this_will_import_messages_from_a_plaintext_backup)); - builder.setPositiveButton(getActivity().getString(R.string.ImportFragment_import), (dialog, which) -> { - Permissions.with(ImportExportFragment.this) - .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) - .ifNecessary() - .withPermanentDenialDialog(getString(R.string.ImportExportFragment_signal_needs_the_storage_permission_in_order_to_read_from_external_storage_but_it_has_been_permanently_denied)) - .onAllGranted(() -> new ImportPlaintextBackupTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)) - .onAnyDenied(() -> Toast.makeText(getContext(), R.string.ImportExportFragment_signal_needs_the_storage_permission_in_order_to_read_from_external_storage, Toast.LENGTH_LONG).show()) - .execute(); - }); - builder.setNegativeButton(getActivity().getString(R.string.ImportFragment_cancel), null); - builder.show(); - } - - @SuppressLint("StaticFieldLeak") - private class ImportPlaintextBackupTask extends AsyncTask { - - @Override - protected void onPreExecute() { - progressDialog = ProgressDialog.show(getActivity(), - getActivity().getString(R.string.ImportFragment_importing), - getActivity().getString(R.string.ImportFragment_import_plaintext_backup_elipse), - true, false); - } - - protected void onPostExecute(Integer result) { - Context context = getActivity(); - - if (progressDialog != null) - progressDialog.dismiss(); - - if (context == null) - return; - - switch (result) { - case NO_SD_CARD: - Toast.makeText(context, - context.getString(R.string.ImportFragment_no_plaintext_backup_found), - Toast.LENGTH_LONG).show(); - break; - case ERROR_IO: - Toast.makeText(context, - context.getString(R.string.ImportFragment_error_importing_backup), - Toast.LENGTH_LONG).show(); - break; - case SUCCESS: - Toast.makeText(context, - context.getString(R.string.ImportFragment_import_complete), - Toast.LENGTH_LONG).show(); - break; - } - } - - @Override - protected Integer doInBackground(Void... params) { - try { - PlaintextBackupImporter.importPlaintextFromSd(getActivity()); - return SUCCESS; - } catch (NoExternalStorageException e) { - Log.w("ImportFragment", e); - return NO_SD_CARD; - } catch (IOException e) { - Log.w("ImportFragment", e); - return ERROR_IO; - } - } - } -} \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/database/PlaintextBackupImporter.java b/src/org/thoughtcrime/securesms/database/PlaintextBackupImporter.java deleted file mode 100644 index 3b8b357b6d..0000000000 --- a/src/org/thoughtcrime/securesms/database/PlaintextBackupImporter.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.thoughtcrime.securesms.database; - -import android.content.Context; -import android.os.Environment; -import android.util.Log; - -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteStatement; - -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.StorageUtil; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.File; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; - -public class PlaintextBackupImporter { - - public static void importPlaintextFromSd(Context context) - throws NoExternalStorageException, IOException - { - Log.w("PlaintextBackupImporter", "importPlaintext()"); - SmsDatabase db = DatabaseFactory.getSmsDatabase(context); - SQLiteDatabase transaction = db.beginTransaction(); - - try { - ThreadDatabase threads = DatabaseFactory.getThreadDatabase(context); - XmlBackup backup = new XmlBackup(getPlaintextExportFile().getAbsolutePath()); - Set modifiedThreads = new HashSet<>(); - XmlBackup.XmlBackupItem item; - - while ((item = backup.getNext()) != null) { - Recipient recipient = Recipient.from(context, Address.fromExternal(context, item.getAddress()), false); - long threadId = threads.getThreadIdFor(recipient); - SQLiteStatement statement = db.createInsertStatement(transaction); - - if (item.getAddress() == null || item.getAddress().equals("null")) - continue; - - if (!isAppropriateTypeForImport(item.getType())) - continue; - - addStringToStatement(statement, 1, item.getAddress()); - addNullToStatement(statement, 2); - addLongToStatement(statement, 3, item.getDate()); - addLongToStatement(statement, 4, item.getDate()); - addLongToStatement(statement, 5, item.getProtocol()); - addLongToStatement(statement, 6, item.getRead()); - addLongToStatement(statement, 7, item.getStatus()); - addTranslatedTypeToStatement(statement, 8, item.getType()); - addNullToStatement(statement, 9); - addStringToStatement(statement, 10, item.getSubject()); - addStringToStatement(statement, 11, item.getBody()); - addStringToStatement(statement, 12, item.getServiceCenter()); - addLongToStatement(statement, 13, threadId); - modifiedThreads.add(threadId); - statement.execute(); - } - - for (long threadId : modifiedThreads) { - threads.update(threadId, true); - } - - Log.w("PlaintextBackupImporter", "Exited loop"); - } catch (XmlPullParserException e) { - Log.w("PlaintextBackupImporter", e); - throw new IOException("XML Parsing error!"); - } finally { - db.endTransaction(transaction); - } - } - - private static File getPlaintextExportFile() throws NoExternalStorageException { - File backup = new File(StorageUtil.getLegacyBackupDirectory(), "SignalPlaintextBackup.xml"); - File oldBackup = new File(Environment.getExternalStorageDirectory(), "TextSecurePlaintextBackup.xml"); - - return !backup.exists() && oldBackup.exists() ? oldBackup : backup; - } - - @SuppressWarnings("SameParameterValue") - private static void addTranslatedTypeToStatement(SQLiteStatement statement, int index, int type) { - statement.bindLong(index, SmsDatabase.Types.translateFromSystemBaseType(type)); - } - - private static void addStringToStatement(SQLiteStatement statement, int index, String value) { - if (value == null || value.equals("null")) statement.bindNull(index); - else statement.bindString(index, value); - } - - private static void addNullToStatement(SQLiteStatement statement, int index) { - statement.bindNull(index); - } - - private static void addLongToStatement(SQLiteStatement statement, int index, long value) { - statement.bindLong(index, value); - } - - private static boolean isAppropriateTypeForImport(long theirType) { - long ourType = SmsDatabase.Types.translateFromSystemBaseType(theirType); - - return ourType == MmsSmsColumns.Types.BASE_INBOX_TYPE || - ourType == MmsSmsColumns.Types.BASE_SENT_TYPE || - ourType == MmsSmsColumns.Types.BASE_SENT_FAILED_TYPE; - } -}