package com.mairos.twisterblog.gui.fragments; import android.app.Fragment; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.widget.Toast; import com.mairos.twisterblog.R; import com.mairos.twisterblog.gui.adapters.PostsAdapter; import com.mairos.twisterblog.model.Post; import com.mairos.twisterblog.model.RequestResult; import com.mairos.twisterblog.network.DeletePostRequest; import com.mairos.twisterblog.network.PostsRequest; import com.mairos.twisterblog.network.RequestStatusObject; import com.mairos.twisterblog.network.TwisterBlogService; import com.mairos.twisterblog.storage.Storage; import com.octo.android.robospice.SpiceManager; import com.octo.android.robospice.persistence.DurationInMillis; import com.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.ItemClick; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.ViewById; import java.util.List; import de.timroes.android.listview.EnhancedListView; @EFragment(R.layout.fragment_posts_list) @OptionsMenu({R.menu.menu_posts_list}) public class PostsListFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { public interface Callback { void onPostSelect(Post post); } private SpiceManager mSpiceManager = new SpiceManager(TwisterBlogService.class); private PostsRequest mPostsRequest; private DeletePostRequest mDeletePostRequest; @ViewById(R.id.swipe_container) SwipeRefreshLayout updater; @ViewById(R.id.list_posts) protected EnhancedListView mListPosts; public PostsListFragment() { // Required empty public constructor } public static PostsListFragment newInstance() { return PostsListFragment_.builder().build(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPostsRequest = new PostsRequest(); } @Override public void onStart() { super.onStart(); mSpiceManager.start(getActivity()); RequestStatusObject.getInstance().setStarted(); getSpiceManager().execute(mPostsRequest, "twister_posts", DurationInMillis.ONE_SECOND, new ListPostsRequestListener()); } @Override public void onStop() { super.onStop(); mSpiceManager.shouldStop(); } @AfterViews protected void initGUI(){ List<Post> posts = Storage.get().getPosts(); if (posts.size() > 0) updateList(posts); updater.setOnRefreshListener(this); updater.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); mListPosts.setUndoStyle(EnhancedListView.UndoStyle.MULTILEVEL_POPUP); mListPosts.setRequireTouchBeforeDismiss(false); mListPosts.setUndoHideDelay(3000); mListPosts.setSwipeDirection(EnhancedListView.SwipeDirection.BOTH); mListPosts.setDismissCallback(dismissCalback); mListPosts.enableSwipeToDismiss(); } private EnhancedListView.OnDismissCallback dismissCalback = new EnhancedListView.OnDismissCallback() { @Override public EnhancedListView.Undoable onDismiss(EnhancedListView listView, final int position) { final PostsAdapter adapter = (PostsAdapter) mListPosts.getAdapter(); final Post post = (Post) adapter.getItem(position); if (post == null) return null; adapter.remove(position); return new EnhancedListView.Undoable() { @Override public void undo() { adapter.insert(position, post); } @Override public String getTitle() { return "post removed"; } @Override public void discard() { mDeletePostRequest = new DeletePostRequest(post.id); RequestStatusObject.getInstance().setStarted(); getSpiceManager().execute(mDeletePostRequest, post.id, DurationInMillis.ALWAYS_EXPIRED, new DeleteRequestListener()); } }; } }; protected SpiceManager getSpiceManager() { return mSpiceManager; } @ItemClick(R.id.list_posts) void postListItemClicked(Post selectedPost) { if (getActivity() instanceof Callback){ ((Callback) getActivity()).onPostSelect(selectedPost); } } @OptionsItem(R.id.action_add) void addPost() { AddPostDialogFragment dialog = AddPostDialogFragment.newInstance(); dialog.setTargetFragment(PostsListFragment.this, 0); dialog.show(getFragmentManager(), "dialog"); } @UiThread void updateList(List<Post> posts) { mListPosts.setAdapter(new PostsAdapter(posts, getActivity())); } @Override public void onRefresh() { RequestStatusObject.getInstance().setStarted(); getSpiceManager().execute(mPostsRequest, "twister_posts", DurationInMillis.ONE_SECOND, new ListPostsRequestListener()); } public final class ListPostsRequestListener implements RequestListener<Post.List> { @Override public void onRequestFailure(SpiceException spiceException) { Toast.makeText(getActivity(), "failure update posts", Toast.LENGTH_SHORT).show(); updater.setRefreshing(false); RequestStatusObject.getInstance().setFinished(); } @Override public void onRequestSuccess(final Post.List result) { Toast.makeText(getActivity(), "success update posts", Toast.LENGTH_SHORT).show(); updater.setRefreshing(false); updateList(result); RequestStatusObject.getInstance().setFinished(); } } public final class DeleteRequestListener implements RequestListener<RequestResult> { @Override public void onRequestFailure(SpiceException spiceException) { RequestStatusObject.getInstance().setFinished(); } @Override public void onRequestSuccess(final RequestResult result) { Toast.makeText(getActivity(), "posts success deleted", Toast.LENGTH_SHORT).show(); RequestStatusObject.getInstance().setFinished(); } } }