From a0356845b144c973448308bedefb11af60e86eb8 Mon Sep 17 00:00:00 2001 From: jendib Date: Thu, 15 Jan 2015 01:49:11 +0100 Subject: [PATCH] Android: event listeners on main thread, files UI polish --- .../com/sismics/docs/MainApplication.java | 2 - .../docs/activity/DocumentViewActivity.java | 82 ++++++++++++------- .../docs/adapter/FilePagerAdapter.java | 28 +++++-- .../com/sismics/docs/event/FileAddEvent.java | 45 ++++++++++ .../docs/fragment/DocListFragment.java | 8 +- .../docs/fragment/DocShareFragment.java | 4 +- .../docs/service/FileUploadService.java | 4 + 7 files changed, 128 insertions(+), 45 deletions(-) create mode 100644 docs-android/app/src/main/java/com/sismics/docs/event/FileAddEvent.java 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 2894d73e..5fd305e1 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,8 +21,6 @@ public class MainApplication extends Application { ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json); // TODO Fullscreen preview - // TODO Event on file uploaded to refresh file list - // TODO Files deleting super.onCreate(); } 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 044df42a..305e363c 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.FileAddEvent; import com.sismics.docs.event.FileDeleteEvent; import com.sismics.docs.fragment.DocShareFragment; import com.sismics.docs.listener.JsonHttpResponseHandler; @@ -132,7 +133,6 @@ public class DocumentViewActivity extends ActionBarActivity { private void refreshDocument(JSONObject document) { this.document = document; - String id = document.optString("id"); String title = document.optString("title"); String date = DateFormat.getDateFormat(this).format(new Date(document.optLong("create_date"))); String description = document.optString("description"); @@ -178,29 +178,7 @@ public class DocumentViewActivity extends ActionBarActivity { sharedImageView.setVisibility(shared ? View.VISIBLE : View.GONE); // Grab the attached files - final View progressBar = findViewById(R.id.progressBar); - final TextView filesEmptyView = (TextView) findViewById(R.id.filesEmptyView); - fileViewPager = (ViewPager) findViewById(R.id.fileViewPager); - fileViewPager.setOffscreenPageLimit(1); - - FileResource.list(this, id, new JsonHttpResponseHandler() { - @Override - public void onSuccess(int statusCode, Header[] headers, JSONObject response) { - JSONArray files = response.optJSONArray("files"); - filePagerAdapter = new FilePagerAdapter(DocumentViewActivity.this, files); - fileViewPager.setAdapter(filePagerAdapter); - - progressBar.setVisibility(View.GONE); - if (files.length() == 0) filesEmptyView.setVisibility(View.VISIBLE); - } - - @Override - public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { - filesEmptyView.setText(R.string.error_loading_files); - progressBar.setVisibility(View.GONE); - filesEmptyView.setVisibility(View.VISIBLE); - } - }); + updateFiles(); } @Override @@ -425,7 +403,7 @@ public class DocumentViewActivity extends ActionBarActivity { * * @param event Document fullscreen event */ - public void onEvent(DocumentFullscreenEvent event) { + public void onEventMainThread(DocumentFullscreenEvent event) { findViewById(R.id.detailLayout).setVisibility(event.isFullscreen() ? View.GONE : View.VISIBLE); } @@ -434,7 +412,7 @@ public class DocumentViewActivity extends ActionBarActivity { * * @param event Document edit event */ - public void onEvent(DocumentEditEvent event) { + public void onEventMainThread(DocumentEditEvent event) { if (document == null) return; if (event.getDocument().optString("id").equals(document.optString("id"))) { // The current document has been modified, refresh it @@ -447,7 +425,7 @@ public class DocumentViewActivity extends ActionBarActivity { * * @param event Document delete event */ - public void onEvent(DocumentDeleteEvent event) { + public void onEventMainThread(DocumentDeleteEvent event) { if (document == null) return; if (event.getDocumentId().equals(document.optString("id"))) { // The current document has been deleted, close this activity @@ -460,9 +438,23 @@ public class DocumentViewActivity extends ActionBarActivity { * * @param event File delete event */ - public void onEvent(FileDeleteEvent event) { + public void onEventMainThread(FileDeleteEvent event) { if (filePagerAdapter == null) return; filePagerAdapter.remove(event.getFileId()); + final TextView filesEmptyView = (TextView) findViewById(R.id.filesEmptyView); + if (filePagerAdapter.getCount() == 0) filesEmptyView.setVisibility(View.VISIBLE); + } + + /** + * A file add event has been fired. + * + * @param event File add event + */ + public void onEventMainThread(FileAddEvent event) { + if (document == null) return; + if (document.optString("id").equals(event.getDocumentId())) { + updateFiles(); + } } @Override @@ -499,6 +491,40 @@ public class DocumentViewActivity extends ActionBarActivity { } } + /** + * Refresh files list. + */ + private void updateFiles() { + if (document == null) return; + + final View progressBar = findViewById(R.id.progressBar); + final TextView filesEmptyView = (TextView) findViewById(R.id.filesEmptyView); + fileViewPager = (ViewPager) findViewById(R.id.fileViewPager); + fileViewPager.setOffscreenPageLimit(1); + fileViewPager.setAdapter(null); + progressBar.setVisibility(View.VISIBLE); + filesEmptyView.setVisibility(View.GONE); + + FileResource.list(this, document.optString("id"), new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + JSONArray files = response.optJSONArray("files"); + filePagerAdapter = new FilePagerAdapter(DocumentViewActivity.this, files); + fileViewPager.setAdapter(filePagerAdapter); + + progressBar.setVisibility(View.GONE); + if (files.length() == 0) filesEmptyView.setVisibility(View.VISIBLE); + } + + @Override + public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { + filesEmptyView.setText(R.string.error_loading_files); + progressBar.setVisibility(View.GONE); + filesEmptyView.setVisibility(View.VISIBLE); + } + }); + } + @Override protected void onDestroy() { EventBus.getDefault().unregister(this); 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 0170ad46..bff09062 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 @@ -15,6 +15,9 @@ import com.sismics.docs.util.PreferenceUtil; import org.json.JSONArray; import org.json.JSONObject; +import java.util.ArrayList; +import java.util.List; + import it.sephiroth.android.library.imagezoom.ImageViewTouch; import it.sephiroth.android.library.imagezoom.ImageViewTouchBase; @@ -25,7 +28,7 @@ public class FilePagerAdapter extends PagerAdapter { /** * Files list. */ - private JSONArray files; + private List files; /** * AQuery. @@ -42,8 +45,11 @@ public class FilePagerAdapter extends PagerAdapter { */ private String authToken; - public FilePagerAdapter(Context context, JSONArray files) { - this.files = files; + public FilePagerAdapter(Context context, JSONArray filesArray) { + this.files = new ArrayList<>(); + for (int i = 0; i < filesArray.length(); i++) { + files.add(filesArray.optJSONObject(i)); + } this.context = context; this.authToken = PreferenceUtil.getAuthToken(context); aq = new AQuery(context); @@ -55,7 +61,7 @@ public class FilePagerAdapter extends PagerAdapter { ImageViewTouch fileImageView = (ImageViewTouch) view.findViewById(R.id.fileImageView); ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.fileProgressBar); - JSONObject file = files.optJSONObject(position); + JSONObject file = files.get(position); String fileUrl = PreferenceUtil.getServerUrl(context) + "/api/file/" + file.optString("id") + "/data?size=web"; aq.id(fileImageView) .image(new BitmapAjaxCallback() @@ -82,7 +88,7 @@ public class FilePagerAdapter extends PagerAdapter { return 0; } - return files.length(); + return files.size(); } @Override @@ -101,7 +107,7 @@ public class FilePagerAdapter extends PagerAdapter { return null; } - return files.optJSONObject(position); + return files.get(position); } /** @@ -112,13 +118,17 @@ public class FilePagerAdapter extends PagerAdapter { public void remove(String fileId) { if (files == null || fileId == null) return; - for (int i = 0; i < files.length(); i++) { - JSONObject file = files.optJSONObject(i); + for (JSONObject file : files) { if (fileId.equals(file.optString("id"))) { - files.remove(i); + files.remove(file); notifyDataSetChanged(); break; } } } + + @Override + public int getItemPosition(Object object) { + return POSITION_NONE; + } } diff --git a/docs-android/app/src/main/java/com/sismics/docs/event/FileAddEvent.java b/docs-android/app/src/main/java/com/sismics/docs/event/FileAddEvent.java new file mode 100644 index 00000000..3b3fa61f --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/event/FileAddEvent.java @@ -0,0 +1,45 @@ +package com.sismics.docs.event; + +/** + * File add event. + * + * @author bgamard. + */ +public class FileAddEvent { + /** + * Document ID. + */ + private String documentId; + /** + * File ID. + */ + private String fileId; + + /** + * Create a file add event. + * + * @param fileId File ID + */ + public FileAddEvent(String documentId, String fileId) { + this.documentId = documentId; + this.fileId = fileId; + } + + /** + * Getter of fileId. + * + * @return fileId + */ + public String getFileId() { + return fileId; + } + + /** + * Getter of documentId. + * + * @return documentId + */ + public String getDocumentId() { + return documentId; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/fragment/DocListFragment.java b/docs-android/app/src/main/java/com/sismics/docs/fragment/DocListFragment.java index 7e7dd99a..3122128b 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/fragment/DocListFragment.java +++ b/docs-android/app/src/main/java/com/sismics/docs/fragment/DocListFragment.java @@ -150,7 +150,7 @@ public class DocListFragment extends Fragment { * * @param event Search event */ - public void onEvent(SearchEvent event) { + public void onEventMainThread(SearchEvent event) { query = event.getQuery(); loadDocuments(getView(), true); } @@ -160,7 +160,7 @@ public class DocListFragment extends Fragment { * * @param event Document edit event */ - public void onEvent(DocumentEditEvent event) { + public void onEventMainThread(DocumentEditEvent event) { adapter.updateDocument(event.getDocument()); } @@ -169,7 +169,7 @@ public class DocListFragment extends Fragment { * * @param event Document delete event */ - public void onEvent(DocumentDeleteEvent event) { + public void onEventMainThread(DocumentDeleteEvent event) { adapter.deleteDocument(event.getDocumentId()); } @@ -178,7 +178,7 @@ public class DocListFragment extends Fragment { * * @param event Document add event */ - public void onEvent(DocumentAddEvent event) { + public void onEventMainThread(DocumentAddEvent event) { // Refresh the list, maybe the new document fit in it loadDocuments(getView(), true); diff --git a/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java b/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java index d910a1b6..a22ccc0d 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java +++ b/docs-android/app/src/main/java/com/sismics/docs/fragment/DocShareFragment.java @@ -139,7 +139,7 @@ public class DocShareFragment extends DialogFragment { }); } - public void onEvent(ShareDeleteEvent event) { + public void onEventMainThread(ShareDeleteEvent event) { ShareResource.delete(getActivity(), event.getId(), new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { @@ -153,7 +153,7 @@ public class DocShareFragment extends DialogFragment { }); } - public void onEvent(ShareSendEvent event) { + public void onEventMainThread(ShareSendEvent event) { if (document == null) return; // Build the share link diff --git a/docs-android/app/src/main/java/com/sismics/docs/service/FileUploadService.java b/docs-android/app/src/main/java/com/sismics/docs/service/FileUploadService.java index b0a13214..0157c358 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/service/FileUploadService.java +++ b/docs-android/app/src/main/java/com/sismics/docs/service/FileUploadService.java @@ -11,6 +11,7 @@ import android.support.v4.app.NotificationCompat.Builder; import android.util.Log; import com.sismics.docs.R; +import com.sismics.docs.event.FileAddEvent; import com.sismics.docs.listener.JsonHttpResponseHandler; import com.sismics.docs.resource.FileResource; @@ -20,6 +21,8 @@ import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; +import de.greenrobot.event.EventBus; + /** * Service to upload a file to a document in the background. * @@ -81,6 +84,7 @@ public class FileUploadService extends IntentService { FileResource.addSync(this, documentId, is, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + EventBus.getDefault().post(new FileAddEvent(documentId, response.optString("id"))); FileUploadService.this.onComplete(); }