/* Copyright (C) 2014 Prasanna Thirumalai This file is part of StackX. StackX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. StackX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with StackX. If not, see <http://www.gnu.org/licenses/>. */ package com.prasanna.android.stacknetwork.fragment; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.prasanna.android.stacknetwork.R; import com.prasanna.android.stacknetwork.model.VotablePost; import com.prasanna.android.stacknetwork.receiver.RestQueryResultReceiver; import com.prasanna.android.stacknetwork.receiver.RestQueryResultReceiver.StackXRestQueryResultReceiver; import com.prasanna.android.stacknetwork.service.AbstractIntentService; import com.prasanna.android.stacknetwork.service.AbstractIntentService.VotingActions; import com.prasanna.android.stacknetwork.utils.AppUtils; import com.prasanna.android.stacknetwork.utils.StringConstants; public abstract class AbstractVotableFragment extends Fragment implements StackXRestQueryResultReceiver { private boolean serviceRunningForUpDownVote = false; private ImageView upvoteIv; private ImageView downVoteIv; private VotablePost votablePost; protected RestQueryResultReceiver resultReceiver; protected abstract void onScoreChange(int newScore); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (resultReceiver == null) resultReceiver = new RestQueryResultReceiver(new Handler()); resultReceiver.setReceiver(this); } protected void prepareUpDownVote(final VotablePost votablePost, final ViewGroup parentView, final Class<? extends AbstractIntentService> intentServiceClass) { this.votablePost = votablePost; upvoteIv = (ImageView) parentView.findViewById(R.id.upVote); AppUtils.prepareUpvote(votablePost.upvoted, upvoteIv); upvoteIv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startUpvoteOrDownvoteService(votablePost, true, intentServiceClass); } }); downVoteIv = (ImageView) parentView.findViewById(R.id.downVote); AppUtils.prepareDownvote(votablePost.downvoted, downVoteIv); downVoteIv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startUpvoteOrDownvoteService(votablePost, false, intentServiceClass); } }); } private void startUpvoteOrDownvoteService(final VotablePost votablePost, final boolean upvote, Class<? extends AbstractIntentService> intentServiceClass) { if (!serviceRunningForUpDownVote) { Intent intent = new Intent(getActivity().getApplicationContext(), intentServiceClass); if (upvote && votablePost.upvoted && !votablePost.downvoted) { intent.putExtra(StringConstants.ACTION, VotingActions.UPVOTE_UNDO); } else if (!upvote && votablePost.downvoted && !votablePost.upvoted) { intent.putExtra(StringConstants.ACTION, VotingActions.DOWNVOTE_UNDO); } else if (upvote && votablePost.downvoted && upvote) { intent.putExtra(StringConstants.ACTION, VotingActions.DOWNVOTE_UNDO_UPVOTE); } else if (!upvote && votablePost.upvoted) { intent.putExtra(StringConstants.ACTION, VotingActions.UPVOTE_UNDO_DOWNVOTE); } else if (upvote) { intent.putExtra(StringConstants.ACTION, VotingActions.UPVOTE); } else if (!upvote) { intent.putExtra(StringConstants.ACTION, VotingActions.DOWNVOTE); } intent.putExtra(StringConstants.RESULT_RECEIVER, resultReceiver); intent.putExtra(StringConstants.SITE, getActivity().getIntent().getStringExtra(StringConstants.SITE)); intent.putExtra(StringConstants.ID, votablePost.id); getActivity().setProgressBarIndeterminateVisibility(true); getActivity().startService(intent); serviceRunningForUpDownVote = true; } } @Override public void onReceiveResult(int resultCode, Bundle resultData) { serviceRunningForUpDownVote = false; getActivity().setProgressBarIndeterminateVisibility(false); switch (resultCode) { case VotingActions.RESULT_CODE_UPVOTE_SUCCESS: votablePost.upvoted = true; upvoteIv.setImageResource(R.drawable.arrow_up_orange); onScoreChange(resultData.getInt(StringConstants.SCORE)); break; case VotingActions.RESULT_CODE_UPVOTE_UNDO_SUCCESS: votablePost.upvoted = false; upvoteIv.setImageResource(R.drawable.arrow_up); onScoreChange(resultData.getInt(StringConstants.SCORE)); break; case VotingActions.RESULT_CODE_DOWNVOTE_SUCCESS: votablePost.downvoted = true; downVoteIv.setImageResource(R.drawable.arrow_down_orange); onScoreChange(resultData.getInt(StringConstants.SCORE)); break; case VotingActions.RESULT_CODE_DOWNVOTE_UNDO_SUCCESS: votablePost.downvoted = false; downVoteIv.setImageResource(R.drawable.arrow_down); onScoreChange(resultData.getInt(StringConstants.SCORE)); break; case VotingActions.RESULT_CODE_UPVOTE_UNDO_DOWNVOTE_SUCCESS: votablePost.downvoted = true; votablePost.upvoted = false; upvoteIv.setImageResource(R.drawable.arrow_up); downVoteIv.setImageResource(R.drawable.arrow_down_orange); onScoreChange(resultData.getInt(StringConstants.SCORE)); break; case VotingActions.RESULT_CODE_DOWNVOTE_UNDO_UPVOTE_SUCCESS: votablePost.upvoted = true; votablePost.downvoted = false; upvoteIv.setImageResource(R.drawable.arrow_up_orange); downVoteIv.setImageResource(R.drawable.arrow_down); onScoreChange(resultData.getInt(StringConstants.SCORE)); break; default: break; } } }