Updated fix for Issue #1116

This commit is contained in:
Manoj Khanna
2015-03-11 19:55:31 +05:30
parent 82a2a76a33
commit bb018b8fc1
23 changed files with 163 additions and 101 deletions

View File

@@ -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();
}
}
}

View File

@@ -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();

View File

@@ -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();
}
}