package org.thoughtcrime.securesms; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragment; import org.whispersystems.textsecure.crypto.MasterSecret; import org.thoughtcrime.securesms.database.EncryptedBackupExporter; import org.thoughtcrime.securesms.database.NoExternalStorageException; import org.thoughtcrime.securesms.database.PlaintextBackupExporter; import java.io.IOException; public class ExportFragment extends SherlockFragment { private static final int SUCCESS = 0; private static final int NO_SD_CARD = 1; private static final int IO_ERROR = 2; private MasterSecret masterSecret; public void setMasterSecret(MasterSecret masterSecret) { this.masterSecret = masterSecret; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { View layout = inflater.inflate(R.layout.export_fragment, container, false); View exportEncryptedView = layout.findViewById(R.id.export_encrypted_backup); View exportPlaintextView = layout.findViewById(R.id.export_plaintext_backup); exportEncryptedView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handleExportEncryptedBackup(); } }); exportPlaintextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handleExportPlaintextBackup(); } }); return layout; } private void handleExportEncryptedBackup() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle(getActivity().getString(R.string.ExportFragment_export_to_sd_card)); builder.setMessage(getActivity().getString(R.string.ExportFragment_this_will_export_your_encrypted_keys_settings_and_messages)); builder.setPositiveButton(getActivity().getString(R.string.ExportFragment_export), new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new ExportEncryptedTask().execute(); } }); builder.setNegativeButton(getActivity().getString(R.string.ExportFragment_cancel), null); builder.show(); } private void handleExportPlaintextBackup() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle(getActivity().getString(R.string.ExportFragment_export_plaintext_to_sd_card)); builder.setMessage(getActivity().getString(R.string.ExportFragment_warning_this_will_export_the_plaintext_contents)); builder.setPositiveButton(getActivity().getString(R.string.ExportFragment_export), new Dialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new ExportPlaintextTask().execute(); } }); builder.setNegativeButton(getActivity().getString(R.string.ExportFragment_cancel), null); builder.show(); } private class ExportPlaintextTask extends AsyncTask { private ProgressDialog dialog; @Override protected void onPreExecute() { dialog = ProgressDialog.show(getActivity(), getActivity().getString(R.string.ExportFragment_exporting), getActivity().getString(R.string.ExportFragment_exporting_plaintext_to_sd_card), true, false); } @Override protected Integer doInBackground(Void... params) { try { PlaintextBackupExporter.exportPlaintextToSd(getActivity(), masterSecret); return SUCCESS; } catch (NoExternalStorageException e) { Log.w("ExportFragment", e); return NO_SD_CARD; } catch (IOException e) { Log.w("ExportFragment", e); return IO_ERROR; } } @Override protected void onPostExecute(Integer result) { Context context = getActivity(); if (dialog != null) dialog.dismiss(); if (context == null) return; switch (result) { case NO_SD_CARD: Toast.makeText(context, context.getString(R.string.ExportFragment_error_unable_to_write_to_sd_card), Toast.LENGTH_LONG).show(); break; case IO_ERROR: Toast.makeText(context, context.getString(R.string.ExportFragment_error_while_writing_to_sd_card), Toast.LENGTH_LONG).show(); break; case SUCCESS: Toast.makeText(context, context.getString(R.string.ExportFragment_success), Toast.LENGTH_LONG).show(); break; } } } private class ExportEncryptedTask extends AsyncTask { private ProgressDialog dialog; @Override protected void onPreExecute() { dialog = ProgressDialog.show(getActivity(), getActivity().getString(R.string.ExportFragment_exporting), getActivity().getString(R.string.ExportFragment_exporting_keys_settings_and_messages), true, false); } @Override protected void onPostExecute(Integer result) { Context context = getActivity(); if (dialog != null) dialog.dismiss(); if (context == null) return; switch (result) { case NO_SD_CARD: Toast.makeText(context, context.getString(R.string.ExportFragment_error_unable_to_write_to_sd_card), Toast.LENGTH_LONG).show(); break; case IO_ERROR: Toast.makeText(context, context.getString(R.string.ExportFragment_error_while_writing_to_sd_card), Toast.LENGTH_LONG).show(); break; case SUCCESS: Toast.makeText(context, context.getString(R.string.ExportFragment_success), Toast.LENGTH_LONG).show(); break; } } @Override protected Integer doInBackground(Void... params) { try { EncryptedBackupExporter.exportToSd(getActivity()); return SUCCESS; } catch (NoExternalStorageException e) { Log.w("ExportFragment", e); return NO_SD_CARD; } catch (IOException e) { Log.w("ExportFragment", e); return IO_ERROR; } } } }