diff --git a/app/src/main/java/org/communiquons/android/comunic/client/data/asynctasks/SafeAsyncTask.java b/app/src/main/java/org/communiquons/android/comunic/client/data/asynctasks/SafeAsyncTask.java index a7c93da..6fc5976 100644 --- a/app/src/main/java/org/communiquons/android/comunic/client/data/asynctasks/SafeAsyncTask.java +++ b/app/src/main/java/org/communiquons/android/comunic/client/data/asynctasks/SafeAsyncTask.java @@ -50,6 +50,15 @@ public abstract class SafeAsyncTask 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); diff --git a/app/src/main/java/org/communiquons/android/comunic/client/ui/asynctasks/GetLatestPostsTask.java b/app/src/main/java/org/communiquons/android/comunic/client/ui/asynctasks/GetLatestPostsTask.java new file mode 100644 index 0000000..f802a4a --- /dev/null +++ b/app/src/main/java/org/communiquons/android/comunic/client/ui/asynctasks/GetLatestPostsTask.java @@ -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 { + + 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; + } +} diff --git a/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/LatestPostsFragment.java b/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/LatestPostsFragment.java index d3f6246..fe59430 100644 --- a/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/LatestPostsFragment.java +++ b/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/LatestPostsFragment.java @@ -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(){ + unset_all_load_tasks(); + mGetLatestPostsTask = new GetLatestPostsTask(getActivity()); + mGetLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener() { @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); } /** @@ -152,39 +158,89 @@ public class LatestPostsFragment extends Fragment * * @param list The new list of posts */ - private void on_got_new_posts_list(@Nullable PostsList list){ + private void on_got_new_posts_list(@Nullable PostsList list) { //Hide loading bar toggleLoadingBarVisibility(false); //Check for errors - if(list == null){ + if (list == null) { Toast.makeText(getActivity(), R.string.err_get_latest_posts, Toast.LENGTH_SHORT).show(); return; } - if(!list.hasUsersInfo()){ + if (!list.hasUsersInfo()) { Toast.makeText(getActivity(), R.string.err_get_users_info, Toast.LENGTH_SHORT).show(); return; } //Save the list of posts - mPostsList = list; + if (mPostsList == null) + mPostsList = list; + else { + mPostsList.addAll(list); + assert mPostsList.getUsersInfo() != null; + mPostsList.getUsersInfo().putAll(list.getUsersInfo()); + } + + show_posts_list(); + } + + /** + * Show posts list + */ + private void show_posts_list(){ + + //Hide loading bar + toggleLoadingBarVisibility(false); + + if(mPostsListFragment == null){ + + //Apply the post fragment + mPostsListFragment = new PostsListFragment(); + mPostsListFragment.setPostsList(mPostsList); + mPostsListFragment.setOnPostListFragmentsUpdateListener(this); + + //Create and commit a transaction + FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); + 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) - toggleNoPostNoticeVisibility(true); + return; + //Display loading bar + toggleLoadingBarVisibility(true); - //Append the new posts list - //Apply the post fragment - mPostsListFragment = new PostsListFragment(); - mPostsListFragment.setPostsList(mPostsList); - mPostsListFragment.setOnPostListFragmentsUpdateListener(this); + //Get the ID of the oldest post to start from + int start = mPostsList.get(mPostsList.size()-1).getId() - 1; - //Create and commit a transaction - FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - transaction.replace(R.id.posts_list_target, mPostsListFragment); - transaction.commit(); + //Get older posts + mGetLatestPostsTask = new GetLatestPostsTask(getActivity()); + mGetLatestPostsTask.setOnPostExecuteListener(new SafeAsyncTask.OnPostExecuteListener() { + @Override + public void OnPostExecute(PostsList posts) { + on_got_new_posts_list(posts); + } + }); + mGetLatestPostsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start); } /** @@ -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 { - - @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 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(); - - } - } }