Updated fix for Issue #1116
This commit is contained in:
@@ -36,7 +36,6 @@ import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
|
||||
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
|
||||
import org.sufficientlysecure.keychain.ui.util.Notify;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
import org.sufficientlysecure.keychain.util.Preferences;
|
||||
import org.sufficientlysecure.keychain.util.ShareHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -177,22 +176,36 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEncryptSuccess(SignEncryptResult result) {
|
||||
public void onEncryptSuccess(final SignEncryptResult result) {
|
||||
if (mDeleteAfterEncrypt) {
|
||||
for (Uri inputUri : mInputUris) {
|
||||
DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(inputUri);
|
||||
deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog");
|
||||
}
|
||||
final Uri[] inputUris = mInputUris.toArray(new Uri[mInputUris.size()]);
|
||||
DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(inputUris);
|
||||
deleteFileDialog.setOnDeletedListener(new DeleteFileDialogFragment.OnDeletedListener() {
|
||||
|
||||
@Override
|
||||
public void onDeleted() {
|
||||
if (mShareAfterEncrypt) {
|
||||
// Share encrypted message/file
|
||||
startActivity(sendWithChooserExcludingEncrypt());
|
||||
} else {
|
||||
// Save encrypted file
|
||||
result.createNotify(EncryptFilesActivity.this).show();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog");
|
||||
|
||||
mInputUris.clear();
|
||||
notifyUpdate();
|
||||
}
|
||||
|
||||
if (mShareAfterEncrypt) {
|
||||
// Share encrypted message/file
|
||||
startActivity(sendWithChooserExcludingEncrypt());
|
||||
} else {
|
||||
// Save encrypted file
|
||||
result.createNotify(EncryptFilesActivity.this).show();
|
||||
if (mShareAfterEncrypt) {
|
||||
// Share encrypted message/file
|
||||
startActivity(sendWithChooserExcludingEncrypt());
|
||||
} else {
|
||||
// Save encrypted file
|
||||
result.createNotify(EncryptFilesActivity.this).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -114,6 +114,13 @@ public class EncryptFilesFragment extends Fragment implements EncryptActivityInt
|
||||
return;
|
||||
}
|
||||
|
||||
if (mEncryptInterface.getInputUris().contains(inputUri)) {
|
||||
Notify.showNotify(getActivity(),
|
||||
getActivity().getString(R.string.error_file_added_already, FileHelper.getFilename(getActivity(), inputUri)),
|
||||
Notify.Style.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
mEncryptInterface.getInputUris().add(inputUri);
|
||||
mEncryptInterface.notifyUpdate();
|
||||
mSelectedFiles.requestFocus();
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
package org.sufficientlysecure.keychain.ui.dialog;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.DialogInterface;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
@@ -34,18 +33,22 @@ import org.sufficientlysecure.keychain.util.FileHelper;
|
||||
import org.sufficientlysecure.keychain.util.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class DeleteFileDialogFragment extends DialogFragment {
|
||||
private static final String ARG_DELETE_URI = "delete_uri";
|
||||
private static final String ARG_DELETE_URIS = "delete_uris";
|
||||
|
||||
private OnDeletedListener onDeletedListener;
|
||||
|
||||
/**
|
||||
* Creates new instance of this delete file dialog fragment
|
||||
*/
|
||||
public static DeleteFileDialogFragment newInstance(Uri deleteUri) {
|
||||
public static DeleteFileDialogFragment newInstance(Uri... deleteUris) {
|
||||
DeleteFileDialogFragment frag = new DeleteFileDialogFragment();
|
||||
Bundle args = new Bundle();
|
||||
|
||||
args.putParcelable(ARG_DELETE_URI, deleteUri);
|
||||
args.putParcelableArray(ARG_DELETE_URIS, deleteUris);
|
||||
|
||||
frag.setArguments(args);
|
||||
|
||||
@@ -59,12 +62,20 @@ public class DeleteFileDialogFragment extends DialogFragment {
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
final FragmentActivity activity = getActivity();
|
||||
|
||||
final Uri deleteUri = getArguments().getParcelable(ARG_DELETE_URI);
|
||||
final String deleteFilename = FileHelper.getFilename(getActivity(), deleteUri);
|
||||
final Uri[] deleteUris = (Uri[]) getArguments().getParcelableArray(ARG_DELETE_URIS);
|
||||
|
||||
final StringBuilder deleteFileNames = new StringBuilder();
|
||||
//Retrieving file names after deletion gives unexpected results
|
||||
final HashMap<Uri, String> deleteFileNameMap = new HashMap<>();
|
||||
for (Uri deleteUri : deleteUris) {
|
||||
String deleteFileName = FileHelper.getFilename(getActivity(), deleteUri);
|
||||
deleteFileNames.append('\n').append(deleteFileName);
|
||||
deleteFileNameMap.put(deleteUri, deleteFileName);
|
||||
}
|
||||
|
||||
CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
|
||||
|
||||
alert.setMessage(this.getString(R.string.file_delete_confirmation, deleteFilename));
|
||||
alert.setMessage(this.getString(R.string.file_delete_confirmation, deleteFileNames.toString()));
|
||||
|
||||
alert.setPositiveButton(R.string.btn_delete, new DialogInterface.OnClickListener() {
|
||||
|
||||
@@ -72,43 +83,56 @@ public class DeleteFileDialogFragment extends DialogFragment {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
dismiss();
|
||||
|
||||
// NOTE: Use Toasts, not Snackbars. When sharing to another application snackbars
|
||||
// would not show up!
|
||||
ArrayList<String> failedFileNameList = new ArrayList<>();
|
||||
|
||||
// Use DocumentsContract on Android >= 4.4
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
try {
|
||||
if (DocumentsContract.deleteDocument(getActivity().getContentResolver(), deleteUri)) {
|
||||
Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
|
||||
deleteFilename), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
for (Uri deleteUri : deleteUris) {
|
||||
// Use DocumentsContract on Android >= 4.4
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
try {
|
||||
if (DocumentsContract.deleteDocument(getActivity().getContentResolver(), deleteUri)) {
|
||||
continue;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.d(Constants.TAG, "Catched UnsupportedOperationException, can happen when delete is not supported!", e);
|
||||
}
|
||||
} catch (UnsupportedOperationException e) {
|
||||
}
|
||||
|
||||
try {
|
||||
if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
|
||||
continue;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.d(Constants.TAG, "Catched UnsupportedOperationException, can happen when delete is not supported!", e);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
|
||||
Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
|
||||
deleteFilename), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
// some Uri's a ContentResolver fails to delete is handled by the java.io.File's delete
|
||||
// via the path of the Uri
|
||||
if (new File(deleteUri.getPath()).delete()) {
|
||||
continue;
|
||||
}
|
||||
} catch (UnsupportedOperationException e) {
|
||||
Log.d(Constants.TAG, "Catched UnsupportedOperationException, can happen when delete is not supported!", e);
|
||||
|
||||
// Note: We can't delete every file...
|
||||
|
||||
failedFileNameList.add(deleteFileNameMap.get(deleteUri));
|
||||
}
|
||||
|
||||
// some Uri's a ContentResolver fails to delete is handled by the java.io.File's delete
|
||||
// via the path of the Uri
|
||||
if (new File(deleteUri.getPath()).delete()) {
|
||||
Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
|
||||
deleteFilename), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
StringBuilder failedFileNames = new StringBuilder();
|
||||
if (!failedFileNameList.isEmpty()) {
|
||||
for (String failedFileName : failedFileNameList) {
|
||||
failedFileNames.append('\n').append(failedFileName);
|
||||
}
|
||||
failedFileNames.append('\n').append(getActivity().getString(R.string.error_file_delete_failed));
|
||||
}
|
||||
|
||||
// Note: We can't delete every file...
|
||||
Toast.makeText(getActivity(), getActivity().getString(R.string.error_file_delete_failed,
|
||||
deleteFilename), Toast.LENGTH_LONG).show();
|
||||
// NOTE: Use Toasts, not Snackbars. When sharing to another application snackbars
|
||||
// would not show up!
|
||||
Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
|
||||
deleteUris.length - failedFileNameList.size(), deleteUris.length, failedFileNames.toString()),
|
||||
Toast.LENGTH_LONG).show();
|
||||
|
||||
if (onDeletedListener != null) {
|
||||
onDeletedListener.onDeleted();
|
||||
}
|
||||
}
|
||||
});
|
||||
alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
|
||||
@@ -120,4 +144,18 @@ public class DeleteFileDialogFragment extends DialogFragment {
|
||||
|
||||
return alert.show();
|
||||
}
|
||||
|
||||
public void setOnDeletedListener(OnDeletedListener onDeletedListener) {
|
||||
this.onDeletedListener = onDeletedListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for performing tasks after the deletion of files
|
||||
*/
|
||||
public interface OnDeletedListener {
|
||||
|
||||
public void onDeleted();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user