Android: event listeners on main thread, files UI polish

This commit is contained in:
jendib 2015-01-15 01:49:11 +01:00
parent 6fa0b8494e
commit a0356845b1
7 changed files with 128 additions and 45 deletions

View File

@ -21,8 +21,6 @@ public class MainApplication extends Application {
ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json); ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json);
// TODO Fullscreen preview // TODO Fullscreen preview
// TODO Event on file uploaded to refresh file list
// TODO Files deleting
super.onCreate(); super.onCreate();
} }

View File

@ -30,6 +30,7 @@ import com.sismics.docs.adapter.FilePagerAdapter;
import com.sismics.docs.event.DocumentDeleteEvent; import com.sismics.docs.event.DocumentDeleteEvent;
import com.sismics.docs.event.DocumentEditEvent; import com.sismics.docs.event.DocumentEditEvent;
import com.sismics.docs.event.DocumentFullscreenEvent; import com.sismics.docs.event.DocumentFullscreenEvent;
import com.sismics.docs.event.FileAddEvent;
import com.sismics.docs.event.FileDeleteEvent; import com.sismics.docs.event.FileDeleteEvent;
import com.sismics.docs.fragment.DocShareFragment; import com.sismics.docs.fragment.DocShareFragment;
import com.sismics.docs.listener.JsonHttpResponseHandler; import com.sismics.docs.listener.JsonHttpResponseHandler;
@ -132,7 +133,6 @@ public class DocumentViewActivity extends ActionBarActivity {
private void refreshDocument(JSONObject document) { private void refreshDocument(JSONObject document) {
this.document = document; this.document = document;
String id = document.optString("id");
String title = document.optString("title"); String title = document.optString("title");
String date = DateFormat.getDateFormat(this).format(new Date(document.optLong("create_date"))); String date = DateFormat.getDateFormat(this).format(new Date(document.optLong("create_date")));
String description = document.optString("description"); String description = document.optString("description");
@ -178,29 +178,7 @@ public class DocumentViewActivity extends ActionBarActivity {
sharedImageView.setVisibility(shared ? View.VISIBLE : View.GONE); sharedImageView.setVisibility(shared ? View.VISIBLE : View.GONE);
// Grab the attached files // Grab the attached files
final View progressBar = findViewById(R.id.progressBar); updateFiles();
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);
}
});
} }
@Override @Override
@ -425,7 +403,7 @@ public class DocumentViewActivity extends ActionBarActivity {
* *
* @param event Document fullscreen event * @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); 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 * @param event Document edit event
*/ */
public void onEvent(DocumentEditEvent event) { public void onEventMainThread(DocumentEditEvent event) {
if (document == null) return; if (document == null) return;
if (event.getDocument().optString("id").equals(document.optString("id"))) { if (event.getDocument().optString("id").equals(document.optString("id"))) {
// The current document has been modified, refresh it // The current document has been modified, refresh it
@ -447,7 +425,7 @@ public class DocumentViewActivity extends ActionBarActivity {
* *
* @param event Document delete event * @param event Document delete event
*/ */
public void onEvent(DocumentDeleteEvent event) { public void onEventMainThread(DocumentDeleteEvent event) {
if (document == null) return; if (document == null) return;
if (event.getDocumentId().equals(document.optString("id"))) { if (event.getDocumentId().equals(document.optString("id"))) {
// The current document has been deleted, close this activity // The current document has been deleted, close this activity
@ -460,9 +438,23 @@ public class DocumentViewActivity extends ActionBarActivity {
* *
* @param event File delete event * @param event File delete event
*/ */
public void onEvent(FileDeleteEvent event) { public void onEventMainThread(FileDeleteEvent event) {
if (filePagerAdapter == null) return; if (filePagerAdapter == null) return;
filePagerAdapter.remove(event.getFileId()); 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 @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 @Override
protected void onDestroy() { protected void onDestroy() {
EventBus.getDefault().unregister(this); EventBus.getDefault().unregister(this);

View File

@ -15,6 +15,9 @@ import com.sismics.docs.util.PreferenceUtil;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; 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.ImageViewTouch;
import it.sephiroth.android.library.imagezoom.ImageViewTouchBase; import it.sephiroth.android.library.imagezoom.ImageViewTouchBase;
@ -25,7 +28,7 @@ public class FilePagerAdapter extends PagerAdapter {
/** /**
* Files list. * Files list.
*/ */
private JSONArray files; private List<JSONObject> files;
/** /**
* AQuery. * AQuery.
@ -42,8 +45,11 @@ public class FilePagerAdapter extends PagerAdapter {
*/ */
private String authToken; private String authToken;
public FilePagerAdapter(Context context, JSONArray files) { public FilePagerAdapter(Context context, JSONArray filesArray) {
this.files = files; this.files = new ArrayList<>();
for (int i = 0; i < filesArray.length(); i++) {
files.add(filesArray.optJSONObject(i));
}
this.context = context; this.context = context;
this.authToken = PreferenceUtil.getAuthToken(context); this.authToken = PreferenceUtil.getAuthToken(context);
aq = new AQuery(context); aq = new AQuery(context);
@ -55,7 +61,7 @@ public class FilePagerAdapter extends PagerAdapter {
ImageViewTouch fileImageView = (ImageViewTouch) view.findViewById(R.id.fileImageView); ImageViewTouch fileImageView = (ImageViewTouch) view.findViewById(R.id.fileImageView);
ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.fileProgressBar); 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"; String fileUrl = PreferenceUtil.getServerUrl(context) + "/api/file/" + file.optString("id") + "/data?size=web";
aq.id(fileImageView) aq.id(fileImageView)
.image(new BitmapAjaxCallback() .image(new BitmapAjaxCallback()
@ -82,7 +88,7 @@ public class FilePagerAdapter extends PagerAdapter {
return 0; return 0;
} }
return files.length(); return files.size();
} }
@Override @Override
@ -101,7 +107,7 @@ public class FilePagerAdapter extends PagerAdapter {
return null; return null;
} }
return files.optJSONObject(position); return files.get(position);
} }
/** /**
@ -112,13 +118,17 @@ public class FilePagerAdapter extends PagerAdapter {
public void remove(String fileId) { public void remove(String fileId) {
if (files == null || fileId == null) return; if (files == null || fileId == null) return;
for (int i = 0; i < files.length(); i++) { for (JSONObject file : files) {
JSONObject file = files.optJSONObject(i);
if (fileId.equals(file.optString("id"))) { if (fileId.equals(file.optString("id"))) {
files.remove(i); files.remove(file);
notifyDataSetChanged(); notifyDataSetChanged();
break; break;
} }
} }
} }
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
} }

View File

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

View File

@ -150,7 +150,7 @@ public class DocListFragment extends Fragment {
* *
* @param event Search event * @param event Search event
*/ */
public void onEvent(SearchEvent event) { public void onEventMainThread(SearchEvent event) {
query = event.getQuery(); query = event.getQuery();
loadDocuments(getView(), true); loadDocuments(getView(), true);
} }
@ -160,7 +160,7 @@ public class DocListFragment extends Fragment {
* *
* @param event Document edit event * @param event Document edit event
*/ */
public void onEvent(DocumentEditEvent event) { public void onEventMainThread(DocumentEditEvent event) {
adapter.updateDocument(event.getDocument()); adapter.updateDocument(event.getDocument());
} }
@ -169,7 +169,7 @@ public class DocListFragment extends Fragment {
* *
* @param event Document delete event * @param event Document delete event
*/ */
public void onEvent(DocumentDeleteEvent event) { public void onEventMainThread(DocumentDeleteEvent event) {
adapter.deleteDocument(event.getDocumentId()); adapter.deleteDocument(event.getDocumentId());
} }
@ -178,7 +178,7 @@ public class DocListFragment extends Fragment {
* *
* @param event Document add event * @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 // Refresh the list, maybe the new document fit in it
loadDocuments(getView(), true); loadDocuments(getView(), true);

View File

@ -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() { ShareResource.delete(getActivity(), event.getId(), new JsonHttpResponseHandler() {
@Override @Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 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; if (document == null) return;
// Build the share link // Build the share link

View File

@ -11,6 +11,7 @@ import android.support.v4.app.NotificationCompat.Builder;
import android.util.Log; import android.util.Log;
import com.sismics.docs.R; import com.sismics.docs.R;
import com.sismics.docs.event.FileAddEvent;
import com.sismics.docs.listener.JsonHttpResponseHandler; import com.sismics.docs.listener.JsonHttpResponseHandler;
import com.sismics.docs.resource.FileResource; import com.sismics.docs.resource.FileResource;
@ -20,6 +21,8 @@ import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import de.greenrobot.event.EventBus;
/** /**
* Service to upload a file to a document in the background. * 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() { FileResource.addSync(this, documentId, is, new JsonHttpResponseHandler() {
@Override @Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) { public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
EventBus.getDefault().post(new FileAddEvent(documentId, response.optString("id")));
FileUploadService.this.onComplete(); FileUploadService.this.onComplete();
} }