From 634ab7ec38eafde2aff4477419ff06a8fa1856a0 Mon Sep 17 00:00:00 2001 From: jendib Date: Sun, 22 Nov 2015 13:31:23 +0100 Subject: [PATCH] #45: Android: Show comments --- docs-android/app/app.iml | 14 ++- docs-android/app/build.gradle | 2 +- .../docs/activity/DocumentViewActivity.java | 50 +++++++++ .../docs/adapter/CommentListAdapter.java | 102 ++++++++++++++++++ .../docs/resource/CommentResource.java | 35 ++++++ .../src/main/res/layout/comment_list_item.xml | 57 ++++++++++ .../res/layout/document_view_activity.xml | 60 +++++++++++ .../main/res/menu/document_view_activity.xml | 6 ++ .../app/src/main/res/values/strings.xml | 4 + 9 files changed, 321 insertions(+), 9 deletions(-) create mode 100644 docs-android/app/src/main/java/com/sismics/docs/adapter/CommentListAdapter.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/resource/CommentResource.java create mode 100644 docs-android/app/src/main/res/layout/comment_list_item.xml diff --git a/docs-android/app/app.iml b/docs-android/app/app.iml index afd2300c..0bab8df3 100644 --- a/docs-android/app/app.iml +++ b/docs-android/app/app.iml @@ -71,12 +71,11 @@ - + - + - @@ -84,17 +83,16 @@ - - - - + - + + + diff --git a/docs-android/app/build.gradle b/docs-android/app/build.gradle index e162b17a..ae3b0aeb 100644 --- a/docs-android/app/build.gradle +++ b/docs-android/app/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.0' + classpath 'com.android.tools.build:gradle:1.5.0' } } apply plugin: 'com.android.application' 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 ea2e8cbe..1e056730 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 @@ -31,6 +31,7 @@ import android.widget.Toast; import com.sismics.docs.R; import com.sismics.docs.adapter.AclListAdapter; +import com.sismics.docs.adapter.CommentListAdapter; import com.sismics.docs.adapter.FilePagerAdapter; import com.sismics.docs.event.DocumentDeleteEvent; import com.sismics.docs.event.DocumentEditEvent; @@ -40,6 +41,7 @@ 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; +import com.sismics.docs.resource.CommentResource; import com.sismics.docs.resource.DocumentResource; import com.sismics.docs.resource.FileResource; import com.sismics.docs.service.FileUploadService; @@ -241,6 +243,9 @@ public class DocumentViewActivity extends AppCompatActivity { } }); + // Grab the comments + updateComments(); + // Grab the attached files updateFiles(); @@ -268,6 +273,15 @@ public class DocumentViewActivity extends AppCompatActivity { } return true; + case R.id.comments: + drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + if (drawerLayout.isDrawerVisible(GravityCompat.START)) { + drawerLayout.closeDrawer(GravityCompat.START); + } else { + drawerLayout.openDrawer(GravityCompat.START); + } + return true; + case R.id.download_file: downloadCurrentFile(); return true; @@ -572,6 +586,42 @@ public class DocumentViewActivity extends AppCompatActivity { }); } + /** + * Refresh comments list. + */ + private void updateComments() { + if (document == null) return; + + final View progressBar = findViewById(R.id.commentProgressView); + final TextView emptyView = (TextView) findViewById(R.id.commentEmptyView); + final ListView listView = (ListView) findViewById(R.id.commentListView); + progressBar.setVisibility(View.VISIBLE); + emptyView.setVisibility(View.GONE); + listView.setVisibility(View.GONE); + + CommentResource.list(this, document.optString("id"), new JsonHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, JSONObject response) { + JSONArray comments = response.optJSONArray("comments"); + listView.setAdapter(new CommentListAdapter(comments)); + listView.setVisibility(View.VISIBLE); + progressBar.setVisibility(View.GONE); + if (comments.length() == 0) { + listView.setVisibility(View.GONE); + emptyView.setVisibility(View.VISIBLE); + } + } + + @Override + public void onAllFailure(int statusCode, Header[] headers, byte[] responseBytes, Throwable throwable) { + emptyView.setText(R.string.error_loading_comments); + progressBar.setVisibility(View.GONE); + listView.setVisibility(View.GONE); + emptyView.setVisibility(View.VISIBLE); + } + }); + } + /** * Refresh files list. */ diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/CommentListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/CommentListAdapter.java new file mode 100644 index 00000000..7ef0384d --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/CommentListAdapter.java @@ -0,0 +1,102 @@ +package com.sismics.docs.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.text.format.DateFormat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.androidquery.AQuery; +import com.androidquery.callback.BitmapAjaxCallback; +import com.sismics.docs.R; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Comment list adapter. + * + * @author bgamard. + */ +public class CommentListAdapter extends BaseAdapter { + /** + * AQuery. + */ + private AQuery aq; + + /** + * Tags. + */ + private List commentList = new ArrayList<>(); + + /** + * Comment list adapter. + * + * @param commentsArray Comments + */ + public CommentListAdapter(JSONArray commentsArray) { + for (int i = 0; i < commentsArray.length(); i++) { + commentList.add(commentsArray.optJSONObject(i)); + } + } + + @Override + public int getCount() { + return commentList.size(); + } + + @Override + public JSONObject getItem(int position) { + return commentList.get(position); + } + + @Override + public long getItemId(int position) { + return getItem(position).optString("id").hashCode(); + } + + @Override + public View getView(int position, View view, ViewGroup parent) { + if (view == null) { + LayoutInflater vi = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = vi.inflate(R.layout.comment_list_item, parent, false); + } + + if (aq == null) { + aq = new AQuery(view); + } else { + aq.recycle(view); + } + + // Fill the view + JSONObject comment = getItem(position); + TextView creatorTextView = (TextView) view.findViewById(R.id.creatorTextView); + TextView dateTextView = (TextView) view.findViewById(R.id.dateTextView); + TextView contentTextView = (TextView) view.findViewById(R.id.contentTextView); + ImageView gravatarImageView = (ImageView) view.findViewById(R.id.gravatarImageView); + creatorTextView.setText(comment.optString("creator")); + dateTextView.setText(DateFormat.getDateFormat(dateTextView.getContext()).format(new Date(comment.optLong("create_date")))); + contentTextView.setText(comment.optString("content")); + + // Gravatar image + String gravatarUrl = "http://www.gravatar.com/avatar/" + comment.optString("creator_gravatar") + "?s=128d=identicon"; + if (aq.shouldDelay(position, view, parent, gravatarUrl)) { + aq.id(gravatarImageView).image((Bitmap) null); + } else { + aq.id(gravatarImageView).image(new BitmapAjaxCallback() + .url(gravatarUrl) + .animation(AQuery.FADE_IN_NETWORK) + ); + } + + return view; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/CommentResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/CommentResource.java new file mode 100644 index 00000000..cf7bec0b --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/CommentResource.java @@ -0,0 +1,35 @@ +package com.sismics.docs.resource; + +import android.content.Context; + +import com.sismics.docs.listener.JsonHttpResponseHandler; + + +/** + * Access to /comment API. + * + * @author bgamard + */ +public class CommentResource extends BaseResource { + /** + * GET /comment/id. + * + * @param context Context + * @param documentId Document ID + * @param responseHandler Callback + */ + public static void list(Context context, String documentId, JsonHttpResponseHandler responseHandler) { + init(context); + + client.get(getApiUrl(context) + "/comment/" + documentId, 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/layout/comment_list_item.xml b/docs-android/app/src/main/res/layout/comment_list_item.xml new file mode 100644 index 00000000..7396aac6 --- /dev/null +++ b/docs-android/app/src/main/res/layout/comment_list_item.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-android/app/src/main/res/layout/document_view_activity.xml b/docs-android/app/src/main/res/layout/document_view_activity.xml index 19744f59..7a0d3cf9 100644 --- a/docs-android/app/src/main/res/layout/document_view_activity.xml +++ b/docs-android/app/src/main/res/layout/document_view_activity.xml @@ -37,6 +37,66 @@ + + + + + + + + + + + + + + + + + + + + + + + All languages Toggle informations Who can access + Show comments + Comments + No comments + Error loading comments