package com.dinhcv.lifelogpedometer.activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.dinhcv.lifelogpedometer.R; import com.dinhcv.lifelogpedometer.adapter.RankingAdapter; import com.dinhcv.lifelogpedometer.model.structure.pojo.RankingInfo; import com.dinhcv.lifelogpedometer.model.structure.pojo.ResultResponse; import com.dinhcv.lifelogpedometer.model.structure.pojo.SnsTopicResponse; import com.dinhcv.lifelogpedometer.network.ApiService; import com.dinhcv.lifelogpedometer.network.ApiUtils; import com.dinhcv.lifelogpedometer.portal.APIResponse; import com.dinhcv.lifelogpedometer.utils.Utils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class RankFragment extends FragmentBase implements SettingFragmentPresenter { private enum Mode { WALK(1), RUN(2), BIKE(3), ALL(0); private int mode; Mode(int mode) { this.mode = mode; } public int getValue() { return mode; } public Mode valueOf(int value) { switch (mode) { case 0: return ALL; case 1: return WALK; case 2: return RUN; case 3: return BIKE; default: return ALL; } } } private enum TypeJump { DAILY(1), WEEKLY(7), MONTHLY(30), YEARLY(365); private int jump; TypeJump(int jump) { this.jump = jump; } public int getValue() { return jump; } } @BindView(R.id.tv_start_date) TextView mTvStartDate; @BindView(R.id.tv_end_date) TextView mTvEndDate; @BindView(R.id.btn_back) ImageView mBtnBack; @BindView(R.id.btn_next) ImageView mBtnNext; @BindView(R.id.btn_daily) Button mBtnDaily; @BindView(R.id.btn_weekly) Button mBtnWeekly; @BindView(R.id.btn_monthly) Button mBtnMonthly; @BindView(R.id.btn_yearly) Button mBtnYearly; @BindView(R.id.btn_walk) Button mBtnWalk; @BindView(R.id.btn_run) Button mBtnRun; @BindView(R.id.btn_bike) Button mBtnBike; @BindView(R.id.btn_all) Button mBtnAll; private ApiService mService; private Mode mCurrentMode = Mode.WALK; private TypeJump mCurrentJump = TypeJump.DAILY; private int mCurrentPage = 1; private View mRootView; private List mRankList = new ArrayList<>(); private SwipeRefreshLayout mSwipeRefreshTopic; private RecyclerView mRcvRank; private RankingAdapter mAdapter; private Date mStartDate = new Date(); private Date mEndDate = new Date(); private static final DateFormat FORMAT_DATE = new SimpleDateFormat("yyyyMMdd"); private static final String TAG = "RankFragment"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment mRootView = inflater.inflate(R.layout.fragment_rank, container, false); ButterKnife.bind(this, mRootView); mRcvRank = (RecyclerView) mRootView.findViewById(R.id.rcv_rank); initView(); initData(); return mRootView; } private void initView() { mSwipeRefreshTopic = (SwipeRefreshLayout) mRootView.findViewById(R.id.swipe_ranking); mSwipeRefreshTopic.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handleLoadRankList(); } }); mAdapter = new RankingAdapter(getActivity(), mRankList); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this.getContext()); mRcvRank.setLayoutManager(mLayoutManager); mRcvRank.setAdapter(mAdapter); initButtonStatus(); } private void initData() { initStartDate(); showDateData(); handleLoadRankList(); } private void showDateData() { mTvStartDate.setText(Utils.dateToStringFormatDayMonthYearJp(mStartDate)); mTvEndDate.setText(Utils.dateToStringFormatDayMonthYearJp(mEndDate)); } @OnClick(R.id.btn_daily) public void clickDaily() { mCurrentJump = TypeJump.DAILY; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_weekly) public void clickWeekly() { mCurrentJump = TypeJump.WEEKLY; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_monthly) public void clickMonthly() { mCurrentJump = TypeJump.MONTHLY; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_yearly) public void clickYearly() { mCurrentJump = TypeJump.YEARLY; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_walk) public void clickWalk() { mCurrentMode = Mode.WALK; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_run) public void clickRun() { mCurrentMode = Mode.RUN; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_bike) public void clickBike() { mCurrentMode = Mode.BIKE; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_all) public void clickAll() { mCurrentMode = Mode.ALL; initButtonStatus(); handleLoadRankList(); } @OnClick(R.id.btn_back) public void clickBack() { mEndDate = mStartDate; mStartDate = calDateByStep(mEndDate, -mCurrentJump.getValue()); showDateData(); handleLoadRankList(); } @OnClick(R.id.btn_next) public void clickNext() { mStartDate = mEndDate; mEndDate = calDateByStep(mStartDate, mCurrentJump.getValue()); showDateData(); handleLoadRankList(); } private void initStartDate() { mStartDate = calDateByStep(mEndDate, -mCurrentJump.getValue()); } private void initButtonStatus() { switch (mCurrentMode) { case WALK: showButtonStatusByMode(1); break; case RUN: showButtonStatusByMode(2); break; case BIKE: showButtonStatusByMode(3); break; case ALL: showButtonStatusByMode(4); break; } switch (mCurrentJump) { case DAILY: showButtonStatusByTypeJump(1); break; case WEEKLY: showButtonStatusByTypeJump(2); break; case MONTHLY: showButtonStatusByTypeJump(3); break; case YEARLY: showButtonStatusByTypeJump(4); break; } } private void showButtonStatusByMode(int position) { mBtnWalk.setEnabled(true); mBtnRun.setEnabled(true); mBtnBike.setEnabled(true); mBtnAll.setEnabled(true); switch (position) { case 1: mBtnWalk.setEnabled(false); break; case 2: mBtnRun.setEnabled(false); break; case 3: mBtnBike.setEnabled(false); break; case 4: mBtnAll.setEnabled(false); ; break; } } private void showButtonStatusByTypeJump(int position) { mBtnDaily.setEnabled(true); mBtnWeekly.setEnabled(true); mBtnMonthly.setEnabled(true); mBtnYearly.setEnabled(true); switch (position) { case 1: mBtnDaily.setEnabled(false); break; case 2: mBtnWeekly.setEnabled(false); break; case 3: mBtnMonthly.setEnabled(false); break; case 4: mBtnYearly.setEnabled(false); break; } } private Date calDateByStep(Date date, int numDay) { Calendar myCal = new GregorianCalendar(); myCal.setTime(date); myCal.add(Calendar.DATE, numDay); return myCal.getTime(); } @Override public void onSaveData() { } @Override public void onInvalidate(boolean isInit) { } @Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); initData(); } public void handleLoadRankList() { mRankList.clear(); mAdapter.clearData(); mAdapter.notifyDataSetChanged(); String startDate = FORMAT_DATE.format(mStartDate); String endDate = FORMAT_DATE.format(mEndDate); getRankList(mCurrentMode.getValue(), startDate, endDate, mCurrentPage); } public void getRankList(int mode, String startDate, String endDate, int page) { if (!mSwipeRefreshTopic.isRefreshing()) { mSwipeRefreshTopic.setRefreshing(true); } Map header = new HashMap<>(); header.put("token", APIResponse.getInstance().getToken()); mService = ApiUtils.getApiService(); mService.getRankingList(header, mode, startDate, endDate, page).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { mRankList = response.body().getResult(); mAdapter.updateData(mRankList); mAdapter.notifyDataSetChanged(); Log.i("SonLT", "Success" + mRankList.size()); } else { int statusCode = response.code(); // handle request errors depending on status code Log.i("SonLT", "Fail " + statusCode); } if (mSwipeRefreshTopic.isRefreshing()) { mSwipeRefreshTopic.setRefreshing(false); } } @Override public void onFailure(Call> call, Throwable t) { Log.i("SonLT", "Success"); if (mSwipeRefreshTopic.isRefreshing()) { mSwipeRefreshTopic.setRefreshing(false); } } }); } }