mirror of
				https://github.com/pierre42100/ComunicAndroid
				synced 2025-11-04 11:34:06 +00:00 
			
		
		
		
	Improved the way posts are retrieved on LatestPostsFragment
This commit is contained in:
		@@ -50,6 +50,15 @@ public abstract class SafeAsyncTask<Params, Progress, Result>
 | 
			
		||||
        this.onPostExecuteListener = onPostExecuteListener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check whether the a OnPostExecuteListener has been set or not
 | 
			
		||||
     *
 | 
			
		||||
     * @return TRUE if it has been set / FALSE else
 | 
			
		||||
     */
 | 
			
		||||
    public boolean hasOnPostExecuteListener(){
 | 
			
		||||
        return this.onPostExecuteListener != null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onPostExecute(Result result) {
 | 
			
		||||
        super.onPostExecute(result);
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,34 @@
 | 
			
		||||
package org.communiquons.android.comunic.client.ui.asynctasks;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.data.arrays.PostsList;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.asynctasks.SafeAsyncTask;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.helpers.GetUsersHelper;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.helpers.PostsHelper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get latest posts task
 | 
			
		||||
 *
 | 
			
		||||
 * @author Pierre HUBERT
 | 
			
		||||
 */
 | 
			
		||||
public class GetLatestPostsTask extends SafeAsyncTask<Integer, Void, PostsList> {
 | 
			
		||||
 | 
			
		||||
    public GetLatestPostsTask(Context context) {
 | 
			
		||||
        super(context);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected PostsList doInBackground(Integer... integers) {
 | 
			
		||||
 | 
			
		||||
        //Get the list of posts
 | 
			
		||||
        int from  = integers[0] == 0 ? -1 : integers[0];
 | 
			
		||||
        PostsList list = new PostsHelper(getContext()).get_latest(from);
 | 
			
		||||
        if(list == null) return null;
 | 
			
		||||
 | 
			
		||||
        list.setUsersInfo(new GetUsersHelper(getContext()).getMultiple(list.getUsersId()));
 | 
			
		||||
        if(!list.hasUsersInfo()) return null;
 | 
			
		||||
 | 
			
		||||
        return list;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -16,10 +16,12 @@ import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.R;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.arrays.PostsList;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.asynctasks.SafeAsyncTask;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.helpers.GetUsersHelper;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.helpers.PostsHelper;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.models.UserInfo;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.activities.MainActivity;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.asynctasks.GetLatestPostsTask;
 | 
			
		||||
import org.communiquons.android.comunic.client.ui.listeners.OnPostListFragmentsUpdateListener;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -37,27 +39,21 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
     */
 | 
			
		||||
    private static final String TAG = "LatestPostsFragment";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Posts helper
 | 
			
		||||
     */
 | 
			
		||||
    PostsHelper mPostsHelper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * User information helper
 | 
			
		||||
     */
 | 
			
		||||
    GetUsersHelper mUserHelper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The list of posts
 | 
			
		||||
     */
 | 
			
		||||
    PostsList mPostsList;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Fragment that displays the list of posts
 | 
			
		||||
     */
 | 
			
		||||
    private PostsListFragment mPostsListFragment;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Load posts task
 | 
			
		||||
     */
 | 
			
		||||
    private GetLatestPostsTask mGetLatestPostsTask;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Loading progress bar
 | 
			
		||||
     */
 | 
			
		||||
@@ -68,21 +64,6 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
     */
 | 
			
		||||
    TextView mNoPostNotice;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Posts load lock
 | 
			
		||||
     */
 | 
			
		||||
    private boolean mLoadPostsLock = false;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onStart() {
 | 
			
		||||
        super.onStart();
 | 
			
		||||
 | 
			
		||||
        //Create posts helper
 | 
			
		||||
        mPostsHelper = new PostsHelper(getActivity());
 | 
			
		||||
 | 
			
		||||
        //Create user helper
 | 
			
		||||
        mUserHelper = new GetUsersHelper(getActivity());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -110,6 +91,45 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
        //Refresh the list of posts of the user
 | 
			
		||||
        if(mPostsList == null)
 | 
			
		||||
            refresh_posts_list();
 | 
			
		||||
        else {
 | 
			
		||||
            mPostsListFragment = null;
 | 
			
		||||
            show_posts_list();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onStop() {
 | 
			
		||||
        super.onStop();
 | 
			
		||||
 | 
			
		||||
        unset_all_load_tasks();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onSaveInstanceState(@NonNull Bundle outState) {
 | 
			
		||||
        super.onSaveInstanceState(outState);
 | 
			
		||||
        unset_all_load_tasks();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Unset all pending load tasks
 | 
			
		||||
     */
 | 
			
		||||
    private void unset_all_load_tasks(){
 | 
			
		||||
        if(mGetLatestPostsTask != null)
 | 
			
		||||
            mGetLatestPostsTask.setOnPostExecuteListener(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check whether are being loaded now or not
 | 
			
		||||
     *
 | 
			
		||||
     * @return TRUE if some posts are loading / FALSE else
 | 
			
		||||
     */
 | 
			
		||||
    private boolean is_loading_posts() {
 | 
			
		||||
 | 
			
		||||
        return mGetLatestPostsTask != null &&
 | 
			
		||||
                mGetLatestPostsTask.hasOnPostExecuteListener() &&
 | 
			
		||||
                !mGetLatestPostsTask.isCancelled() &&
 | 
			
		||||
                mGetLatestPostsTask.getStatus() != AsyncTask.Status.FINISHED;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -122,29 +142,15 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
        toggleNoPostNoticeVisibility(false);
 | 
			
		||||
 | 
			
		||||
        //Get the list of latest posts
 | 
			
		||||
        new AsyncTask<Void, Void, PostsList>(){
 | 
			
		||||
        unset_all_load_tasks();
 | 
			
		||||
        mGetLatestPostsTask = new GetLatestPostsTask(getActivity());
 | 
			
		||||
        mGetLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<PostsList>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            protected PostsList doInBackground(Void... params) {
 | 
			
		||||
                PostsList postsList =  mPostsHelper.get_latest();
 | 
			
		||||
 | 
			
		||||
                //Get user information, if possible
 | 
			
		||||
                if(postsList != null)
 | 
			
		||||
                    postsList.setUsersInfo(mUserHelper.getMultiple(postsList.getUsersId()));
 | 
			
		||||
 | 
			
		||||
                return postsList;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            protected void onPostExecute(PostsList posts) {
 | 
			
		||||
 | 
			
		||||
                //Check if the activity still exists or not
 | 
			
		||||
                if(getActivity() == null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
            public void OnPostExecute(PostsList posts) {
 | 
			
		||||
                on_got_new_posts_list(posts);
 | 
			
		||||
            }
 | 
			
		||||
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 | 
			
		||||
 | 
			
		||||
        });
 | 
			
		||||
        mGetLatestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -168,14 +174,27 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Save the list of posts
 | 
			
		||||
        if (mPostsList == null)
 | 
			
		||||
            mPostsList = list;
 | 
			
		||||
        else {
 | 
			
		||||
            mPostsList.addAll(list);
 | 
			
		||||
            assert mPostsList.getUsersInfo() != null;
 | 
			
		||||
            mPostsList.getUsersInfo().putAll(list.getUsersInfo());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Check if the posts list is empty
 | 
			
		||||
        if(mPostsList.size() == 0)
 | 
			
		||||
            toggleNoPostNoticeVisibility(true);
 | 
			
		||||
        show_posts_list();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Show posts list
 | 
			
		||||
     */
 | 
			
		||||
    private void show_posts_list(){
 | 
			
		||||
 | 
			
		||||
        //Hide loading bar
 | 
			
		||||
        toggleLoadingBarVisibility(false);
 | 
			
		||||
 | 
			
		||||
        if(mPostsListFragment == null){
 | 
			
		||||
 | 
			
		||||
        //Append the new posts list
 | 
			
		||||
            //Apply the post fragment
 | 
			
		||||
            mPostsListFragment = new PostsListFragment();
 | 
			
		||||
            mPostsListFragment.setPostsList(mPostsList);
 | 
			
		||||
@@ -186,6 +205,43 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
            transaction.replace(R.id.posts_list_target, mPostsListFragment);
 | 
			
		||||
            transaction.commit();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
            //Append the new posts list
 | 
			
		||||
            mPostsListFragment.show();
 | 
			
		||||
 | 
			
		||||
        //Check if the posts list is empty
 | 
			
		||||
        toggleNoPostNoticeVisibility(mPostsList.size() == 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLoadMorePosts() {
 | 
			
		||||
 | 
			
		||||
        //Check if post loading is already locked
 | 
			
		||||
        if(is_loading_posts())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if(mPostsList == null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if(mPostsList.size() == 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        //Display loading bar
 | 
			
		||||
        toggleLoadingBarVisibility(true);
 | 
			
		||||
 | 
			
		||||
        //Get the ID of the oldest post to start from
 | 
			
		||||
        int start = mPostsList.get(mPostsList.size()-1).getId() - 1;
 | 
			
		||||
 | 
			
		||||
        //Get older posts
 | 
			
		||||
        mGetLatestPostsTask = new GetLatestPostsTask(getActivity());
 | 
			
		||||
        mGetLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener<PostsList>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void OnPostExecute(PostsList posts) {
 | 
			
		||||
                on_got_new_posts_list(posts);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        mGetLatestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Toggle progress bar visibility
 | 
			
		||||
@@ -204,85 +260,4 @@ public class LatestPostsFragment extends Fragment
 | 
			
		||||
    private void toggleNoPostNoticeVisibility(boolean visible){
 | 
			
		||||
        mNoPostNotice.setVisibility(visible ? View.VISIBLE : View.GONE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLoadMorePosts() {
 | 
			
		||||
 | 
			
		||||
        //Check if post loading is already locked
 | 
			
		||||
        if(mLoadPostsLock)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if(mPostsList == null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if(mPostsList.size() == 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        //Display loading bar
 | 
			
		||||
        mLoadPostsLock = true;
 | 
			
		||||
        toggleLoadingBarVisibility(true);
 | 
			
		||||
 | 
			
		||||
        //Get the ID of the oldest post to start from
 | 
			
		||||
        final int start = mPostsList.get(mPostsList.size()-1).getId() - 1;
 | 
			
		||||
 | 
			
		||||
        //Get older posts
 | 
			
		||||
        new GetOlderPosts().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This class get and apply older posts
 | 
			
		||||
     */
 | 
			
		||||
    private class GetOlderPosts extends AsyncTask<Integer, Void, PostsList> {
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected PostsList doInBackground(Integer... id) {
 | 
			
		||||
 | 
			
		||||
            //Get the list of older posts
 | 
			
		||||
            PostsList postsList = mPostsHelper.get_latest(id[0]);
 | 
			
		||||
 | 
			
		||||
            //Check for errors
 | 
			
		||||
            if(postsList == null)
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
            //Get information about the users
 | 
			
		||||
            ArrayMap<Integer, UserInfo> usersInfo
 | 
			
		||||
                    = mUserHelper.getMultiple(postsList.getUsersId());
 | 
			
		||||
 | 
			
		||||
            //Check for errors
 | 
			
		||||
            if(usersInfo == null)
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
            assert postsList.getUsersInfo() != null;
 | 
			
		||||
            postsList.getUsersInfo().putAll(usersInfo);
 | 
			
		||||
 | 
			
		||||
            return postsList;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected void onPostExecute(PostsList posts) {
 | 
			
		||||
 | 
			
		||||
            //Check if the activity has been detached
 | 
			
		||||
            if(getActivity() == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //Unlock post loading
 | 
			
		||||
            mLoadPostsLock = false;
 | 
			
		||||
            toggleLoadingBarVisibility(false);
 | 
			
		||||
 | 
			
		||||
            if(posts == null){
 | 
			
		||||
                Toast.makeText(getActivity(), R.string.err_get_older_posts,
 | 
			
		||||
                        Toast.LENGTH_SHORT).show();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            mPostsList.addAll(posts);
 | 
			
		||||
            assert mPostsList.getUsersInfo() != null;
 | 
			
		||||
            mPostsList.getUsersInfo().putAll(posts.getUsersInfo());
 | 
			
		||||
 | 
			
		||||
            //Apply new posts list
 | 
			
		||||
            mPostsListFragment.show();
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user