From bc719b31657cdde493f24d24745276547f6db90c Mon Sep 17 00:00:00 2001 From: jendib Date: Sat, 22 Nov 2014 22:18:21 +0100 Subject: [PATCH] Android: File(s) download --- .../com/sismics/docs/MainApplication.java | 1 - .../docs/activity/DocumentActivity.java | 95 ++++++++++++++++++- .../docs/adapter/FilePagerAdapter.java | 14 +++ .../src/main/res/layout/document_activity.xml | 6 +- .../src/main/res/menu/document_activity.xml | 17 ++++ .../app/src/main/res/values/strings.xml | 4 + 6 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 docs-android/app/src/main/res/menu/document_activity.xml 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 @@ diff --git a/docs-android/app/src/main/res/menu/document_activity.xml b/docs-android/app/src/main/res/menu/document_activity.xml new file mode 100644 index 00000000..2fba0a33 --- /dev/null +++ b/docs-android/app/src/main/res/menu/document_activity.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/docs-android/app/src/main/res/values/strings.xml b/docs-android/app/src/main/res/values/strings.xml index f71238ee..8551a5d0 100644 --- a/docs-android/app/src/main/res/values/strings.xml +++ b/docs-android/app/src/main/res/values/strings.xml @@ -26,5 +26,9 @@ Too long (max. %d) Required Only letters and numbers + Download current file + Downloading file number %1s + Download all files + Downloading document