diff --git a/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java b/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java
index 588847c5..93caf893 100644
--- a/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java
+++ b/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java
@@ -21,7 +21,6 @@ public class MainApplication extends Application {
ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json);
// TODO Fullscreen preview
- // TODO Downloading
// TODO Sharing
// TODO Error feedback
// TODO Infinite scrolling on documents
diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java
index 178a67d1..57996b65 100644
--- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java
+++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentActivity.java
@@ -1,10 +1,16 @@
package com.sismics.docs.activity;
+import android.app.DownloadManager;
+import android.content.Context;
import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
+import android.os.Environment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.text.format.DateFormat;
+import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
@@ -15,6 +21,7 @@ import com.sismics.docs.R;
import com.sismics.docs.adapter.FilePagerAdapter;
import com.sismics.docs.model.application.ApplicationContext;
import com.sismics.docs.resource.FileResource;
+import com.sismics.docs.util.PreferenceUtil;
import com.sismics.docs.util.TagUtil;
import org.apache.http.Header;
@@ -30,7 +37,21 @@ import java.util.Date;
* @author bgamard
*/
public class DocumentActivity extends ActionBarActivity {
-
+ /**
+ * File view pager.
+ */
+ ViewPager fileViewPager;
+
+ /**
+ * File pager adapter.
+ */
+ FilePagerAdapter filePagerAdapter;
+
+ /**
+ * Document displayed.
+ */
+ JSONObject document;
+
@Override
protected void onCreate(final Bundle args) {
super.onCreate(args);
@@ -55,7 +76,6 @@ public class DocumentActivity extends ActionBarActivity {
return;
}
- JSONObject document;
try {
document = new JSONObject(documentJson);
} catch (JSONException e) {
@@ -117,17 +137,33 @@ public class DocumentActivity extends ActionBarActivity {
FileResource.list(this, id, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
- ViewPager fileViewPager = (ViewPager) findViewById(R.id.fileViewPager);
+ fileViewPager = (ViewPager) findViewById(R.id.fileViewPager);
fileViewPager.setOffscreenPageLimit(1);
- fileViewPager.setAdapter(new FilePagerAdapter(DocumentActivity.this, response.optJSONArray("files")));
+ filePagerAdapter = new FilePagerAdapter(DocumentActivity.this, response.optJSONArray("files"));
+ fileViewPager.setAdapter(filePagerAdapter);
findViewById(R.id.progressBar).setVisibility(View.GONE);
}
});
}
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.document_activity, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.download_file:
+ downloadCurrentFile();
+ return true;
+
+ case R.id.download_document:
+ downloadZip();
+ return true;
+
case android.R.id.home:
finish();
return true;
@@ -136,4 +172,55 @@ public class DocumentActivity extends ActionBarActivity {
return super.onOptionsItemSelected(item);
}
}
+
+ /**
+ * Download the current displayed file.
+ */
+ private void downloadCurrentFile() {
+ if (fileViewPager == null || filePagerAdapter == null) return;
+
+ JSONObject file = filePagerAdapter.getObjectAt(fileViewPager.getCurrentItem());
+ if (file == null) return;
+
+ // Build the destination filename
+ String mimeType = file.optString("mimetype");
+ int position = fileViewPager.getCurrentItem();
+ if (mimeType == null || !mimeType.contains("/")) return;
+ String ext = mimeType.split("/")[1];
+ String fileName = getTitle() + "-" + position + "." + ext;
+
+ // Download the file
+ String fileUrl = PreferenceUtil.getServerUrl(this) + "/api/file/" + file.optString("id") + "/data";
+ downloadFile(fileUrl, fileName, getTitle().toString(), getString(R.string.downloading_file, position + 1));
+ }
+
+ /**
+ * Download the document (all files zipped).
+ */
+ private void downloadZip() {
+ if (document == null) return;
+ String url = PreferenceUtil.getServerUrl(this) + "/api/file/zip?id=" + document.optString("id");
+ String fileName = getTitle() + ".zip";
+ downloadFile(url, fileName, getTitle().toString(), getString(R.string.downloading_document));
+ }
+
+ /**
+ * Download a file using Android download manager.
+ *
+ * @param url URL to download
+ * @param fileName Destination file name
+ * @param title Notification title
+ * @param description Notification description
+ */
+ private void downloadFile(String url, String fileName, String title, String description) {
+ String authToken = PreferenceUtil.getAuthToken(this);
+ DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
+ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
+ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
+ request.addRequestHeader("Cookie", "auth_token=" + authToken);
+ request.setTitle(title);
+ request.setDescription(description);
+ downloadManager.enqueue(request);
+ }
}
\ No newline at end of file
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 9bd55ed4..32e8b464 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
@@ -89,4 +89,18 @@ public class FilePagerAdapter extends PagerAdapter {
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
+
+ /**
+ * Return the object at a given position.
+ *
+ * @param position Position
+ * @return Object
+ */
+ public JSONObject getObjectAt(int position) {
+ if (files == null) {
+ return null;
+ }
+
+ return files.optJSONObject(position);
+ }
}
diff --git a/docs-android/app/src/main/res/layout/document_activity.xml b/docs-android/app/src/main/res/layout/document_activity.xml
index cc2e1206..49f1595c 100644
--- a/docs-android/app/src/main/res/layout/document_activity.xml
+++ b/docs-android/app/src/main/res/layout/document_activity.xml
@@ -15,7 +15,8 @@