mirror of
				https://github.com/pierre42100/ComunicAndroid
				synced 2025-11-04 11:34:06 +00:00 
			
		
		
		
	Display posts list using RecyclerView
This commit is contained in:
		@@ -0,0 +1,35 @@
 | 
			
		||||
package org.communiquons.android.comunic.client.ui.adapters;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.support.v7.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Base RecyclerView adapter
 | 
			
		||||
 *
 | 
			
		||||
 * @author Pierre HUBERT
 | 
			
		||||
 */
 | 
			
		||||
public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter {
 | 
			
		||||
 | 
			
		||||
    private Context mContext;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialize adapter
 | 
			
		||||
     *
 | 
			
		||||
     * @param context Activity context
 | 
			
		||||
     */
 | 
			
		||||
    BaseRecyclerViewAdapter(Context context){
 | 
			
		||||
        super();
 | 
			
		||||
 | 
			
		||||
        mContext = context;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the activity context
 | 
			
		||||
     *
 | 
			
		||||
     * @return The activity contexts
 | 
			
		||||
     */
 | 
			
		||||
    public Context getContext() {
 | 
			
		||||
        return mContext;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,35 +1,32 @@
 | 
			
		||||
package org.communiquons.android.comunic.client.ui.adapters;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.support.annotation.CallSuper;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v7.widget.RecyclerView;
 | 
			
		||||
import android.util.ArrayMap;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.KeyEvent;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.ArrayAdapter;
 | 
			
		||||
import android.widget.FrameLayout;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.R;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.helpers.ImageLoadHelper;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.models.UserInfo;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.arrays.PostsList;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.models.Comment;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.models.Post;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.enums.PostTypes;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.arrays.PostsList;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.models.UserInfo;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.utils.Utilities;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.listeners.onPostUpdateListener;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.utils.UiUtils;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.utils.Utilities;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.EditCommentContentView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.EnlargeableWebImageView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.LikeButtonView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.MovieView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.PDFLinkButtonView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.WebImageView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.WebLinkView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.WebUserAccountImage;
 | 
			
		||||
 | 
			
		||||
@@ -42,22 +39,36 @@ import java.util.ArrayList;
 | 
			
		||||
 * Created by pierre on 1/21/18.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class PostsAdapter extends ArrayAdapter<Post>{
 | 
			
		||||
public class PostsAdapter extends BaseRecyclerViewAdapter {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Debug tag
 | 
			
		||||
     */
 | 
			
		||||
    private static final String TAG = "PostsAdapter";
 | 
			
		||||
    private static final String TAG = PostsAdapter.class.getCanonicalName();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * View types
 | 
			
		||||
     */
 | 
			
		||||
    private static final int VIEW_TYPE_POST_TEXT = 0;
 | 
			
		||||
    private static final int VIEW_TYPE_POST_IMAGE = 1;
 | 
			
		||||
    private static final int VIEW_TYPE_POST_MOVIE = 2;
 | 
			
		||||
    private static final int VIEW_TYPE_POST_PDF = 3;
 | 
			
		||||
    private static final int VIEW_TYPE_POST_WEBLINK = 4;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Posts list
 | 
			
		||||
     */
 | 
			
		||||
    private PostsList mList;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Information about the users
 | 
			
		||||
     */
 | 
			
		||||
    private ArrayMap<Integer, UserInfo> mUsersInfos;
 | 
			
		||||
    private ArrayMap<Integer, UserInfo> mUsersInfo;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Utilities object
 | 
			
		||||
     */
 | 
			
		||||
    private Utilities utils;
 | 
			
		||||
    private Utilities mUtils;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Actions update listener
 | 
			
		||||
@@ -69,268 +80,354 @@ public class PostsAdapter extends ArrayAdapter<Post>{
 | 
			
		||||
     *
 | 
			
		||||
     * @param context The context of execution of the application
 | 
			
		||||
     * @param list The list of posts
 | 
			
		||||
     * @param usersInfos Informations about the user
 | 
			
		||||
     * @param usersInfo Information about the user
 | 
			
		||||
     * @param listener Specify the listener to perform callback actions such as create a comment
 | 
			
		||||
     *                 for example
 | 
			
		||||
     */
 | 
			
		||||
    public PostsAdapter(Context context, PostsList list, ArrayMap<Integer, UserInfo> usersInfos,
 | 
			
		||||
    public PostsAdapter(Context context, PostsList list, ArrayMap<Integer, UserInfo> usersInfo,
 | 
			
		||||
                        onPostUpdateListener listener){
 | 
			
		||||
        super(context, 0, list);
 | 
			
		||||
        super(context);
 | 
			
		||||
 | 
			
		||||
        //Save the users info object
 | 
			
		||||
        mUsersInfos = usersInfos;
 | 
			
		||||
        mList = list;
 | 
			
		||||
        mUsersInfo = usersInfo;
 | 
			
		||||
 | 
			
		||||
        //Create utilities object
 | 
			
		||||
        utils = new Utilities(getContext());
 | 
			
		||||
        //Utilities
 | 
			
		||||
        mUtils = new Utilities(getContext());
 | 
			
		||||
 | 
			
		||||
        mListener = listener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        return mList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemViewType(int position) {
 | 
			
		||||
        switch (mList.get(position).getType()){
 | 
			
		||||
 | 
			
		||||
            case IMAGE:
 | 
			
		||||
                return VIEW_TYPE_POST_IMAGE;
 | 
			
		||||
 | 
			
		||||
            case PDF:
 | 
			
		||||
                return VIEW_TYPE_POST_PDF;
 | 
			
		||||
 | 
			
		||||
            case WEBLINK:
 | 
			
		||||
                return VIEW_TYPE_POST_WEBLINK;
 | 
			
		||||
 | 
			
		||||
            case MOVIE:
 | 
			
		||||
                return VIEW_TYPE_POST_MOVIE;
 | 
			
		||||
 | 
			
		||||
            case TEXT:
 | 
			
		||||
            default:
 | 
			
		||||
                return VIEW_TYPE_POST_TEXT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public View getView(final int position, @Nullable View convertView,
 | 
			
		||||
                        @NonNull ViewGroup parent) {
 | 
			
		||||
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int type) {
 | 
			
		||||
 | 
			
		||||
        //Check if the view has to be inflated
 | 
			
		||||
        if(convertView == null)
 | 
			
		||||
            convertView = LayoutInflater.from(getContext())
 | 
			
		||||
                    .inflate(R.layout.post_item, parent, false);
 | 
			
		||||
        View view = LayoutInflater.from(getContext()).inflate(R.layout.post_item, viewGroup,
 | 
			
		||||
                false);
 | 
			
		||||
 | 
			
		||||
        //Get information about the post and the user
 | 
			
		||||
        final Post post = getItem(position);
 | 
			
		||||
        assert post != null;
 | 
			
		||||
        UserInfo userInfo = null;
 | 
			
		||||
        if(mUsersInfos.containsKey(post.getUserID()))
 | 
			
		||||
            userInfo = mUsersInfos.get(post.getUserID());
 | 
			
		||||
        switch (type){
 | 
			
		||||
            case VIEW_TYPE_POST_IMAGE:
 | 
			
		||||
                return new ImagePostHolder(view);
 | 
			
		||||
 | 
			
		||||
        //Get the views related to user Information
 | 
			
		||||
        WebUserAccountImage userAccountImage = convertView.findViewById(R.id.user_account_image);
 | 
			
		||||
        TextView userAccountName = convertView.findViewById(R.id.user_account_name);
 | 
			
		||||
            case VIEW_TYPE_POST_PDF:
 | 
			
		||||
                return new PDFPostHolder(view);
 | 
			
		||||
 | 
			
		||||
        //Set user information if available
 | 
			
		||||
        if(userInfo != null){
 | 
			
		||||
            userAccountName.setText(userInfo.getDisplayFullName());
 | 
			
		||||
            userAccountImage.setUser(userInfo);
 | 
			
		||||
            case VIEW_TYPE_POST_WEBLINK:
 | 
			
		||||
                return new WebLinkPostHolder(view);
 | 
			
		||||
 | 
			
		||||
            case VIEW_TYPE_POST_MOVIE:
 | 
			
		||||
                return new MoviePostHolder(view);
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    return new TextPostHolder(view);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            //Reset user information
 | 
			
		||||
            userAccountName.setText("");
 | 
			
		||||
            userAccountImage.removeUser();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
 | 
			
		||||
        ((TextPostHolder)viewHolder).bind(position);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Text posts holder
 | 
			
		||||
     */
 | 
			
		||||
    private class TextPostHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
 | 
			
		||||
        private WebUserAccountImage mUserAccountImage;
 | 
			
		||||
        private TextView mUserAccountName;
 | 
			
		||||
        private TextView mPostDate;
 | 
			
		||||
        private TextView mPostVisibility;
 | 
			
		||||
        private ImageView mPostActions;
 | 
			
		||||
        private FrameLayout mAdditionnalViews;
 | 
			
		||||
        private TextView mPostContent;
 | 
			
		||||
        private LikeButtonView mLikeButton;
 | 
			
		||||
        private LinearLayout mCommentsList;
 | 
			
		||||
        private LinearLayout mCreateCommentForm;
 | 
			
		||||
        private EditCommentContentView mEditCommentContentView;
 | 
			
		||||
        private ImageView mSendCommentButton;
 | 
			
		||||
 | 
			
		||||
        TextPostHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 | 
			
		||||
            mUserAccountImage = itemView.findViewById(R.id.user_account_image);
 | 
			
		||||
            mUserAccountName = itemView.findViewById(R.id.user_account_name);
 | 
			
		||||
            mPostDate = itemView.findViewById(R.id.post_creation_time);
 | 
			
		||||
            mPostVisibility = itemView.findViewById(R.id.post_visibility);
 | 
			
		||||
            mPostActions = itemView.findViewById(R.id.post_actions_btn);
 | 
			
		||||
            mAdditionnalViews = itemView.findViewById(R.id.additional_views);
 | 
			
		||||
            mPostContent = itemView.findViewById(R.id.post_content);
 | 
			
		||||
            mLikeButton = itemView.findViewById(R.id.like_button);
 | 
			
		||||
            mCommentsList = itemView.findViewById(R.id.comments_list);
 | 
			
		||||
            mCreateCommentForm = itemView.findViewById(R.id.create_comment_form);
 | 
			
		||||
            mEditCommentContentView = itemView.findViewById(R.id.input_comment_content);
 | 
			
		||||
            mSendCommentButton = itemView.findViewById(R.id.comment_send_button);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set post creation time
 | 
			
		||||
        ((TextView) convertView.findViewById(R.id.post_creation_time)).setText(utils.
 | 
			
		||||
                timeToString(Utilities.time() - post.getPost_time()));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set post visibility level
 | 
			
		||||
        TextView visibilityLevel = convertView.findViewById(R.id.post_visibility);
 | 
			
		||||
        switch (post.getVisibilityLevel()){
 | 
			
		||||
 | 
			
		||||
            case PUBLIC:
 | 
			
		||||
                visibilityLevel.setText(R.string.post_visibility_public);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case FRIENDS:
 | 
			
		||||
                visibilityLevel.setText(R.string.post_visibility_friends);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case MEMBERS:
 | 
			
		||||
                visibilityLevel.setText(R.string.post_visibility_members);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case PRIVATE:
 | 
			
		||||
            default:
 | 
			
		||||
                visibilityLevel.setText(R.string.post_visibility_private);
 | 
			
		||||
                break;
 | 
			
		||||
        Post getPost(int position){
 | 
			
		||||
            return mList.get(position);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Set post actions
 | 
			
		||||
        convertView.findViewById(R.id.post_actions_btn).setOnClickListener(
 | 
			
		||||
                new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                mListener.showPostActions(v, position, post);
 | 
			
		||||
        /**
 | 
			
		||||
         * @return Additional views container
 | 
			
		||||
         */
 | 
			
		||||
        FrameLayout getAdditionnalViewsLayout(){
 | 
			
		||||
            return mAdditionnalViews;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @CallSuper
 | 
			
		||||
        void bind(final int position){
 | 
			
		||||
 | 
			
		||||
            Post post = getPost(position);
 | 
			
		||||
            UserInfo user = null;
 | 
			
		||||
            if(mUsersInfo.containsKey(post.getUserID()))
 | 
			
		||||
                user = mUsersInfo.get(post.getUserID());
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //Apply user information
 | 
			
		||||
            if(user != null){
 | 
			
		||||
                mUserAccountImage.setUser(user);
 | 
			
		||||
                mUserAccountName.setText(user.getDisplayFullName());
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set post content
 | 
			
		||||
        ((TextView) convertView.findViewById(R.id.post_content)).setText(Utilities.prepareStringTextView(post.getContent()));
 | 
			
		||||
 | 
			
		||||
        //Set post image (if any)
 | 
			
		||||
        WebImageView postImage = convertView.findViewById(R.id.post_image);
 | 
			
		||||
        if(post.getType() == PostTypes.IMAGE){
 | 
			
		||||
 | 
			
		||||
            //Make image visible
 | 
			
		||||
            postImage.setVisibility(View.VISIBLE);
 | 
			
		||||
 | 
			
		||||
            //Load image
 | 
			
		||||
            postImage.loadURL(post.getFile_path_url());
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
 | 
			
		||||
            //Hide the image
 | 
			
		||||
            postImage.setVisibility(View.GONE);
 | 
			
		||||
 | 
			
		||||
            //Remove the image
 | 
			
		||||
            postImage.removeImage();
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set post movie (if any)
 | 
			
		||||
        MovieView movieView = convertView.findViewById(R.id.post_movie);
 | 
			
		||||
 | 
			
		||||
        if(post.getType() == PostTypes.MOVIE){
 | 
			
		||||
            movieView.setVisibility(View.VISIBLE);
 | 
			
		||||
            movieView.setMovie(post.getMovie());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        else {
 | 
			
		||||
            movieView.setVisibility(View.GONE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set post weblink (if any)
 | 
			
		||||
        WebLinkView webLinkView = convertView.findViewById(R.id.post_web_link);
 | 
			
		||||
 | 
			
		||||
        if(post.hasWebLink()){
 | 
			
		||||
            webLinkView.setVisibility(View.VISIBLE);
 | 
			
		||||
            webLinkView.setLink(post.getWebLink());
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            webLinkView.setVisibility(View.GONE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set post file PDF (if any)
 | 
			
		||||
        PDFLinkButtonView pdfLinkButtonView = convertView.findViewById(R.id.btn_pdf_link);
 | 
			
		||||
 | 
			
		||||
        if(post.getType() != PostTypes.PDF)
 | 
			
		||||
            pdfLinkButtonView.setVisibility(View.GONE);
 | 
			
		||||
        else {
 | 
			
		||||
            pdfLinkButtonView.setVisibility(View.VISIBLE);
 | 
			
		||||
            pdfLinkButtonView.setPDFUrl(post.getFile_path_url());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Set posts likes
 | 
			
		||||
        LikeButtonView likeButtonView = convertView.findViewById(R.id.like_button);
 | 
			
		||||
        likeButtonView.setNumberLikes(post.getNumberLike());
 | 
			
		||||
        likeButtonView.setIsLiking(post.isLiking());
 | 
			
		||||
        likeButtonView.setUpdateListener(new LikeButtonView.OnLikeUpdateListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void OnLikeUpdate(boolean isLiking) {
 | 
			
		||||
                //Call listener
 | 
			
		||||
                mListener.onPostLikeUpdate(post, isLiking);
 | 
			
		||||
            else {
 | 
			
		||||
                mUserAccountImage.removeUser();
 | 
			
		||||
                mUserAccountName.setText("");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        //Process post comments
 | 
			
		||||
        ArrayList<Comment> comments = post.getComments_list();
 | 
			
		||||
        LinearLayout commentsView = convertView.findViewById(R.id.comments_list);
 | 
			
		||||
        commentsView.removeAllViews();
 | 
			
		||||
        if(comments != null) {
 | 
			
		||||
 | 
			
		||||
            //Show comments list
 | 
			
		||||
            convertView.findViewById(R.id.comments_list).setVisibility(View.VISIBLE);
 | 
			
		||||
            //Post date
 | 
			
		||||
            mPostDate.setText(mUtils.timeToString(Utilities.time() - post.getPost_time()));
 | 
			
		||||
 | 
			
		||||
            for (Comment comment : comments) {
 | 
			
		||||
 | 
			
		||||
                //Check if the comment has been deleted
 | 
			
		||||
                if(comment.isDeleted())
 | 
			
		||||
                    continue; //Skip comment
 | 
			
		||||
            //Display post visibility
 | 
			
		||||
            switch (post.getVisibilityLevel()){
 | 
			
		||||
 | 
			
		||||
                //Try to find information about the user
 | 
			
		||||
                UserInfo commentUser = mUsersInfos.containsKey(comment.getUserID()) ?
 | 
			
		||||
                        mUsersInfos.get(comment.getUserID()) : null;
 | 
			
		||||
                case PUBLIC:
 | 
			
		||||
                    mPostVisibility.setText(R.string.post_visibility_public);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                //Inflate the view
 | 
			
		||||
                View commentView = CommentsAdapter.getInflatedView(getContext(), comment,
 | 
			
		||||
                        mListener, commentUser, commentsView);
 | 
			
		||||
                commentsView.addView(commentView);
 | 
			
		||||
                case FRIENDS:
 | 
			
		||||
                    mPostVisibility.setText(R.string.post_visibility_friends);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case MEMBERS:
 | 
			
		||||
                    mPostVisibility.setText(R.string.post_visibility_members);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case PRIVATE:
 | 
			
		||||
                default:
 | 
			
		||||
                    mPostVisibility.setText(R.string.post_visibility_private);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            //Hide comments list
 | 
			
		||||
            convertView.findViewById(R.id.comments_list).setVisibility(View.GONE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //Update comment creation form
 | 
			
		||||
        View commentCreationForm = convertView.findViewById(R.id.create_comment_form);
 | 
			
		||||
        EditCommentContentView input_comment = convertView.findViewById(R.id.input_comment_content);
 | 
			
		||||
        if(comments == null){
 | 
			
		||||
            //Set post actions
 | 
			
		||||
            mPostActions.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onClick(View v) {
 | 
			
		||||
                    mListener.showPostActions(v, position, getPost(position));
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            //Hide comment creation form
 | 
			
		||||
            commentCreationForm.setVisibility(View.GONE);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            //Set post content
 | 
			
		||||
            mPostContent.setText(Utilities.prepareStringTextView(post.getContent()));
 | 
			
		||||
 | 
			
		||||
            //Display comment creation form
 | 
			
		||||
            commentCreationForm.setVisibility(View.VISIBLE);
 | 
			
		||||
 | 
			
		||||
            //Make sure the form is correctly set up
 | 
			
		||||
            if(input_comment.getPostID() != post.getId()){
 | 
			
		||||
            //Post likes
 | 
			
		||||
            mLikeButton.setNumberLikes(post.getNumberLike());
 | 
			
		||||
            mLikeButton.setIsLiking(post.isLiking());
 | 
			
		||||
            mLikeButton.setUpdateListener(new LikeButtonView.OnLikeUpdateListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void OnLikeUpdate(boolean isLiking) {
 | 
			
		||||
                    mListener.onPostLikeUpdate(getPost(position), isLiking);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
                //Reset input comment
 | 
			
		||||
                input_comment.setPostID(post.getId());
 | 
			
		||||
                input_comment.setText("");
 | 
			
		||||
 | 
			
		||||
                //Make the send button lives
 | 
			
		||||
                final View finalConvertView = convertView;
 | 
			
		||||
                convertView.findViewById(R.id.comment_send_button)
 | 
			
		||||
                        .setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onClick(View v) {
 | 
			
		||||
                        sendComment(position, finalConvertView);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            //Post comments
 | 
			
		||||
            ArrayList<Comment> comments = post.getComments_list();
 | 
			
		||||
            mCommentsList.removeAllViews();
 | 
			
		||||
            if(comments != null){
 | 
			
		||||
                //Show list
 | 
			
		||||
                mCommentsList.setVisibility(View.VISIBLE);
 | 
			
		||||
 | 
			
		||||
                //Make the comment input behaves like the send button when the user hit the
 | 
			
		||||
                //enter key
 | 
			
		||||
                input_comment.setOnKeyListener(new View.OnKeyListener() {
 | 
			
		||||
                for(Comment comment : comments){
 | 
			
		||||
 | 
			
		||||
                    if(comment.isDeleted())
 | 
			
		||||
                        continue;
 | 
			
		||||
 | 
			
		||||
                    UserInfo commentUser = mUsersInfo.containsKey(comment.getUserID()) ?
 | 
			
		||||
                            mUsersInfo.get(comment.getUserID()) : null;
 | 
			
		||||
 | 
			
		||||
                    View commentView = CommentsAdapter.getInflatedView(getContext(), comment,
 | 
			
		||||
                            mListener, commentUser, mCommentsList);
 | 
			
		||||
                    mCommentsList.addView(commentView);
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
                //Hide comments list
 | 
			
		||||
                mCommentsList.setVisibility(View.GONE);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //Comments creation form
 | 
			
		||||
            if(comments == null)
 | 
			
		||||
                mCreateCommentForm.setVisibility(View.GONE);
 | 
			
		||||
            else {
 | 
			
		||||
                mCreateCommentForm.setVisibility(View.VISIBLE);
 | 
			
		||||
 | 
			
		||||
                if(mEditCommentContentView.getPostID() != post.getId()){
 | 
			
		||||
 | 
			
		||||
                    mEditCommentContentView.setPostID(post.getId());
 | 
			
		||||
                    mEditCommentContentView.setText("");
 | 
			
		||||
 | 
			
		||||
                    mSendCommentButton.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onClick(View v) {
 | 
			
		||||
                            sendComment();
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                mEditCommentContentView.setOnKeyListener(new View.OnKeyListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
 | 
			
		||||
 | 
			
		||||
                        if(event.getAction() == KeyEvent.ACTION_DOWN
 | 
			
		||||
                                && keyCode == KeyEvent.KEYCODE_ENTER){
 | 
			
		||||
                            sendComment(position, finalConvertView);
 | 
			
		||||
                        }
 | 
			
		||||
                                && keyCode == KeyEvent.KEYCODE_ENTER)
 | 
			
		||||
                            sendComment();
 | 
			
		||||
 | 
			
		||||
                        return false;
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return convertView;
 | 
			
		||||
        private void sendComment(){
 | 
			
		||||
            mListener.onCreateComment(getLayoutPosition(), mSendCommentButton,
 | 
			
		||||
                    getPost(getLayoutPosition()), mEditCommentContentView);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Intend to send a new comment to the server
 | 
			
		||||
     *
 | 
			
		||||
     * @param pos The position of the post to update
 | 
			
		||||
     * @param container The container of the post item
 | 
			
		||||
     * Image posts holder
 | 
			
		||||
     */
 | 
			
		||||
    private void sendComment(int pos, View container){
 | 
			
		||||
    private class ImagePostHolder extends TextPostHolder {
 | 
			
		||||
 | 
			
		||||
        //Get post information
 | 
			
		||||
        final Post post = getItem(pos);
 | 
			
		||||
        if(post==null)
 | 
			
		||||
            return;
 | 
			
		||||
        private EnlargeableWebImageView mPostImage;
 | 
			
		||||
 | 
			
		||||
        //Get view about the comment
 | 
			
		||||
        final EditCommentContentView commentInput = container.findViewById(R.id.input_comment_content);
 | 
			
		||||
        final ImageView sendButton = container.findViewById(R.id.comment_send_button);
 | 
			
		||||
        ImagePostHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 | 
			
		||||
        //Call interface
 | 
			
		||||
        mListener.onCreateComment(pos, sendButton, post, commentInput);
 | 
			
		||||
            mPostImage = new EnlargeableWebImageView(getContext());
 | 
			
		||||
            getAdditionnalViewsLayout().addView(mPostImage,
 | 
			
		||||
                    new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                            UiUtils.GetPixel(getContext(), 200)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        void bind(int position) {
 | 
			
		||||
            super.bind(position);
 | 
			
		||||
 | 
			
		||||
            mPostImage.loadURL(getPost(position).getFile_path_url());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * PDF posts holder
 | 
			
		||||
     */
 | 
			
		||||
    private class PDFPostHolder extends TextPostHolder {
 | 
			
		||||
 | 
			
		||||
        private PDFLinkButtonView mPDFLinkButton;
 | 
			
		||||
 | 
			
		||||
        PDFPostHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 | 
			
		||||
            mPDFLinkButton = new PDFLinkButtonView(getContext(), null, R.style.PostPDFButton);
 | 
			
		||||
            getAdditionnalViewsLayout().addView(mPDFLinkButton);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        void bind(int position) {
 | 
			
		||||
            super.bind(position);
 | 
			
		||||
 | 
			
		||||
            mPDFLinkButton.setPDFUrl(getPost(position).getFile_path_url());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Web link post holder
 | 
			
		||||
     */
 | 
			
		||||
    private class WebLinkPostHolder extends TextPostHolder {
 | 
			
		||||
 | 
			
		||||
        private WebLinkView mWebLinkView;
 | 
			
		||||
 | 
			
		||||
        WebLinkPostHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 | 
			
		||||
            mWebLinkView = new WebLinkView(getContext());
 | 
			
		||||
            getAdditionnalViewsLayout().addView(mWebLinkView,
 | 
			
		||||
                    new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                            ViewGroup.LayoutParams.WRAP_CONTENT
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        void bind(int position) {
 | 
			
		||||
            super.bind(position);
 | 
			
		||||
 | 
			
		||||
            mWebLinkView.setLink(getPost(position).getWebLink());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Movie post holder
 | 
			
		||||
     */
 | 
			
		||||
    private class MoviePostHolder extends TextPostHolder {
 | 
			
		||||
 | 
			
		||||
        MovieView mMovieView;
 | 
			
		||||
 | 
			
		||||
        MoviePostHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 | 
			
		||||
            mMovieView = new MovieView(getContext(), null, R.style.PostMovie);
 | 
			
		||||
            getAdditionnalViewsLayout().addView(mMovieView, new FrameLayout.LayoutParams(
 | 
			
		||||
                    ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                    UiUtils.GetPixel(getContext(), 200)
 | 
			
		||||
            ));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        void bind(int position) {
 | 
			
		||||
            super.bind(position);
 | 
			
		||||
 | 
			
		||||
            mMovieView.setMovie(getPost(position).getMovie());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import android.content.DialogInterface;
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager;
 | 
			
		||||
import android.util.ArrayMap;
 | 
			
		||||
import android.util.Pair;
 | 
			
		||||
import android.view.ContextMenu;
 | 
			
		||||
@@ -36,7 +37,7 @@ import org.communiquons.android.comunic.client.ui.listeners.OnPostListFragmentsU
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.listeners.OnScrollChangeDetectListener;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.listeners.onPostUpdateListener;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.EditCommentContentView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.ScrollListView;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.views.ScrollRecyclerView;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
@@ -105,7 +106,7 @@ public class PostsListFragment extends Fragment
 | 
			
		||||
    /**
 | 
			
		||||
     * The list of posts
 | 
			
		||||
     */
 | 
			
		||||
    ScrollListView mListView;
 | 
			
		||||
    ScrollRecyclerView mRecyclerView;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Posts helper
 | 
			
		||||
@@ -137,7 +138,7 @@ public class PostsListFragment extends Fragment
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the list of users informations
 | 
			
		||||
     * Set the list of users information
 | 
			
		||||
     *
 | 
			
		||||
     * @param list The list
 | 
			
		||||
     */
 | 
			
		||||
@@ -173,8 +174,8 @@ public class PostsListFragment extends Fragment
 | 
			
		||||
        super.onViewCreated(view, savedInstanceState);
 | 
			
		||||
 | 
			
		||||
        //Get the list view
 | 
			
		||||
        mListView = view.findViewById(R.id.posts_list);
 | 
			
		||||
        mListView.setOnScrollChangeDetectListener(this);
 | 
			
		||||
        mRecyclerView = view.findViewById(R.id.posts_list);
 | 
			
		||||
        mRecyclerView.setOnScrollChangeDetectListener(this);
 | 
			
		||||
 | 
			
		||||
        //Show the posts
 | 
			
		||||
        show();
 | 
			
		||||
@@ -194,7 +195,8 @@ public class PostsListFragment extends Fragment
 | 
			
		||||
            mPostsAdapter = new PostsAdapter(getActivity(), mPostsList, mUsersInfo, this);
 | 
			
		||||
 | 
			
		||||
            //Connect the adapter to the view
 | 
			
		||||
            mListView.setAdapter(mPostsAdapter);
 | 
			
		||||
            mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
 | 
			
		||||
            mRecyclerView.setAdapter(mPostsAdapter);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Notify data set update
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import android.app.AlertDialog;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.util.TypedValue;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.R;
 | 
			
		||||
 | 
			
		||||
@@ -84,4 +85,15 @@ public class UiUtils {
 | 
			
		||||
        return builder.show();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the amount of pixel matching to a dp
 | 
			
		||||
     *
 | 
			
		||||
     * @param context The context of the activity
 | 
			
		||||
     * @param dp The number of dp to convert
 | 
			
		||||
     * @return Matching number of pixel
 | 
			
		||||
     */
 | 
			
		||||
    public static int GetPixel(Context context, int dp){
 | 
			
		||||
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
 | 
			
		||||
                context.getResources().getDisplayMetrics());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v7.widget.RecyclerView;
 | 
			
		||||
import android.util.AttributeSet;
 | 
			
		||||
import android.widget.AbsListView;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.listeners.OnScrollChangeDetectListener;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<org.communiquons.android.comunic.client.ui.views.ScrollListView android:id="@+id/posts_list"
 | 
			
		||||
    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<org.communiquons.android.comunic.client.ui.views.ScrollRecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:id="@+id/posts_list"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    tools:listitem="@layout/post_item"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools" />
 | 
			
		||||
    android:layout_height="match_parent" />
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    style="@style/PostContainer"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:orientation="vertical">
 | 
			
		||||
 | 
			
		||||
    <!-- Information about user who created the post -->
 | 
			
		||||
@@ -59,45 +59,22 @@
 | 
			
		||||
            tools:text="Public" />
 | 
			
		||||
 | 
			
		||||
        <ImageView
 | 
			
		||||
            style="@style/PostActionsButton"
 | 
			
		||||
            android:id="@+id/post_actions_btn"
 | 
			
		||||
            style="@style/PostActionsButton"
 | 
			
		||||
            android:layout_width="@dimen/post_options_btn_width"
 | 
			
		||||
            android:layout_height="@dimen/post_options_btn_height"
 | 
			
		||||
            android:src="@android:drawable/ic_menu_manage"
 | 
			
		||||
            android:contentDescription="@string/post_action_btn_description"/>
 | 
			
		||||
            android:contentDescription="@string/post_action_btn_description"
 | 
			
		||||
            android:src="@android:drawable/ic_menu_manage" />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
    <!-- Post image (if any) -->
 | 
			
		||||
    <org.communiquons.android.comunic.client.ui.views.EnlargeableWebImageView
 | 
			
		||||
        android:id="@+id/post_image"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="200dp"
 | 
			
		||||
        android:src="@drawable/img_placeholder"
 | 
			
		||||
        android:contentDescription="@string/post_image_description"
 | 
			
		||||
        android:scaleType="centerInside" />
 | 
			
		||||
 | 
			
		||||
    <!-- Post related movie (if any) -->
 | 
			
		||||
    <org.communiquons.android.comunic.client.ui.views.MovieView
 | 
			
		||||
        android:id="@+id/post_movie"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="200dp"
 | 
			
		||||
        style="@style/PostMovie"/>
 | 
			
		||||
 | 
			
		||||
    <!-- Post Web link (if any) -->
 | 
			
		||||
    <org.communiquons.android.comunic.client.ui.views.WebLinkView
 | 
			
		||||
        android:id="@+id/post_web_link"
 | 
			
		||||
    <!-- Additional views -->
 | 
			
		||||
    <FrameLayout
 | 
			
		||||
        android:id="@+id/additional_views"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content" />
 | 
			
		||||
 | 
			
		||||
    <!-- Related PDF (if any) -->
 | 
			
		||||
    <org.communiquons.android.comunic.client.ui.views.PDFLinkButtonView
 | 
			
		||||
        android:id="@+id/btn_pdf_link"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        style="@style/PostPDFButton"/>
 | 
			
		||||
 | 
			
		||||
    <!-- Post content -->
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/post_content"
 | 
			
		||||
@@ -109,9 +86,9 @@
 | 
			
		||||
    <!-- Like button -->
 | 
			
		||||
    <org.communiquons.android.comunic.client.ui.views.LikeButtonView
 | 
			
		||||
        android:id="@+id/like_button"
 | 
			
		||||
        style="@style/PostLikeButton"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        style="@style/PostLikeButton"/>
 | 
			
		||||
        android:layout_height="wrap_content" />
 | 
			
		||||
 | 
			
		||||
    <!-- Post comments -->
 | 
			
		||||
    <LinearLayout
 | 
			
		||||
@@ -130,10 +107,10 @@
 | 
			
		||||
        <!-- Comment hint -->
 | 
			
		||||
        <org.communiquons.android.comunic.client.ui.views.EditCommentContentView
 | 
			
		||||
            android:id="@+id/input_comment_content"
 | 
			
		||||
            style="@style/TextAppearance.AppCompat"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_weight="1"
 | 
			
		||||
            style="@style/TextAppearance.AppCompat"
 | 
			
		||||
            android:hint="@string/new_comment_hint"
 | 
			
		||||
            android:inputType="text" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user