diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java index 5fb78383..36cac205 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentEditActivity.java @@ -162,7 +162,7 @@ public class DocumentEditActivity extends ActionBarActivity { // Cancellable progress dialog final ProgressDialog progressDialog = ProgressDialog.show(this, - getString(R.string.document_editing_title), + getString(R.string.please_wait), getString(R.string.document_editing_message), true, true, new DialogInterface.OnCancelListener() { @Override diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java index 66508ec7..044df42a 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java @@ -30,6 +30,7 @@ import com.sismics.docs.adapter.FilePagerAdapter; import com.sismics.docs.event.DocumentDeleteEvent; import com.sismics.docs.event.DocumentEditEvent; import com.sismics.docs.event.DocumentFullscreenEvent; +import com.sismics.docs.event.FileDeleteEvent; import com.sismics.docs.fragment.DocShareFragment; import com.sismics.docs.listener.JsonHttpResponseHandler; import com.sismics.docs.model.application.ApplicationContext; @@ -205,7 +206,7 @@ public class DocumentViewActivity extends ActionBarActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.document_activity, menu); + inflater.inflate(R.menu.document_view_activity, menu); return super.onCreateOptionsMenu(menu); } @@ -239,6 +240,10 @@ public class DocumentViewActivity extends ActionBarActivity { startActivityForResult(intent, REQUEST_CODE_EDIT_DOCUMENT); return true; + case R.id.delete_file: + deleteCurrentFile(); + return true; + case R.id.delete_document: deleteDocument(); return true; @@ -273,6 +278,62 @@ public class DocumentViewActivity extends ActionBarActivity { downloadFile(fileUrl, fileName, getTitle().toString(), getString(R.string.downloading_file, position + 1)); } + private void deleteCurrentFile() { + if (fileViewPager == null || filePagerAdapter == null) return; + + final JSONObject file = filePagerAdapter.getObjectAt(fileViewPager.getCurrentItem()); + if (file == null) return; + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setTitle(R.string.delete_file_title) + .setMessage(R.string.delete_file_message) + .setCancelable(true) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Dismiss the confirmation dialog + dialog.dismiss(); + + // Show a progress dialog while deleting + final ProgressDialog progressDialog = ProgressDialog.show(DocumentViewActivity.this, + getString(R.string.please_wait), + getString(R.string.file_deleting_message), true, true, + new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + FileResource.cancel(DocumentViewActivity.this); + } + }); + + // Actual delete server call + final String fileId = file.optString("id"); + FileResource.delete(DocumentViewActivity.this, fileId, new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + EventBus.getDefault().post(new FileDeleteEvent(fileId)); + } + + @Override + public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { + Toast.makeText(DocumentViewActivity.this, R.string.file_delete_failure, Toast.LENGTH_LONG).show(); + } + + @Override + public void onFinish() { + progressDialog.dismiss(); + } + }); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }).create().show(); + } + /** * Download the document (all files zipped). */ @@ -321,7 +382,7 @@ public class DocumentViewActivity extends ActionBarActivity { // Show a progress dialog while deleting final ProgressDialog progressDialog = ProgressDialog.show(DocumentViewActivity.this, - getString(R.string.document_editing_title), + getString(R.string.please_wait), getString(R.string.document_deleting_message), true, true, new DialogInterface.OnCancelListener() { @Override @@ -394,6 +455,16 @@ public class DocumentViewActivity extends ActionBarActivity { } } + /** + * A file delete event has been fired. + * + * @param event File delete event + */ + public void onEvent(FileDeleteEvent event) { + if (filePagerAdapter == null) return; + filePagerAdapter.remove(event.getFileId()); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (document == null) return; diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/FilePagerAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/FilePagerAdapter.java index 32e8b464..0170ad46 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/adapter/FilePagerAdapter.java +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/FilePagerAdapter.java @@ -103,4 +103,22 @@ public class FilePagerAdapter extends PagerAdapter { return files.optJSONObject(position); } + + /** + * Remove a file. + * + * @param fileId File ID + */ + public void remove(String fileId) { + if (files == null || fileId == null) return; + + for (int i = 0; i < files.length(); i++) { + JSONObject file = files.optJSONObject(i); + if (fileId.equals(file.optString("id"))) { + files.remove(i); + notifyDataSetChanged(); + break; + } + } + } } diff --git a/docs-android/app/src/main/java/com/sismics/docs/event/FileDeleteEvent.java b/docs-android/app/src/main/java/com/sismics/docs/event/FileDeleteEvent.java new file mode 100644 index 00000000..d7ac524b --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/event/FileDeleteEvent.java @@ -0,0 +1,31 @@ +package com.sismics.docs.event; + +/** + * File delete event. + * + * @author bgamard. + */ +public class FileDeleteEvent { + /** + * File ID. + */ + private String fileId; + + /** + * Create a document delete event. + * + * @param fileId File ID + */ + public FileDeleteEvent(String fileId) { + this.fileId = fileId; + } + + /** + * Getter of fileId. + * + * @return fileId + */ + public String getFileId() { + return fileId; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/FileResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/FileResource.java index 1f7e4331..2e594817 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/resource/FileResource.java +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/FileResource.java @@ -30,6 +30,19 @@ public class FileResource extends BaseResource { client.get(getApiUrl(context) + "/file/list?id=" + documentId, responseHandler); } + /** + * DELETE /file/id. + * + * @param context Context + * @param id ID + * @param responseHandler Callback + */ + public static void delete(Context context, String id, JsonHttpResponseHandler responseHandler) { + init(context); + + client.delete(getApiUrl(context) + "/file/" + id, responseHandler); + } + /** * PUT /file. * @@ -57,4 +70,13 @@ public class FileResource extends BaseResource { params.put("file", is, "file", "application/octet-stream", true); client.put(getApiUrl(context) + "/file", params, responseHandler); } + + /** + * Cancel pending requests. + * + * @param context Context + */ + public static void cancel(Context context) { + client.cancelRequests(context, true); + } } diff --git a/docs-android/app/src/main/res/menu/document_activity.xml b/docs-android/app/src/main/res/menu/document_view_activity.xml similarity index 88% rename from docs-android/app/src/main/res/menu/document_activity.xml rename to docs-android/app/src/main/res/menu/document_view_activity.xml index f5b6123a..1a3a4d20 100644 --- a/docs-android/app/src/main/res/menu/document_activity.xml +++ b/docs-android/app/src/main/res/menu/document_view_activity.xml @@ -34,6 +34,12 @@ android:title="@string/download_document"> + + + Save Edit document Network error, please try again - Please wait + Please wait Sending your data Delete document Delete document Really delete this document and all associated files? Network error while deleting this document Deleting document + Delete file + Really delete the current file? + Network error while deleting the current file + Deleting file Error while reading the file Sismics Docs Uploading the new file to the document Error uploading the new file + Delete current file