package jp.gr.procon.proconapp.ui.fragment; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.squareup.otto.Subscribe; import java.util.ArrayList; import jp.gr.procon.proconapp.R; import jp.gr.procon.proconapp.api.NoticeListApi; import jp.gr.procon.proconapp.api.asynctask.NoticeApiAsyncTask; import jp.gr.procon.proconapp.event.BusHolder; import jp.gr.procon.proconapp.event.RequestUpdateEvent; import jp.gr.procon.proconapp.model.Notice; import jp.gr.procon.proconapp.model.NoticeList; import jp.gr.procon.proconapp.ui.callback.OnNoticeClickListener; import jp.gr.procon.proconapp.ui.view.NoticeListItemView; public class NoticeOutlineFragment extends BaseFragment implements View.OnClickListener, NoticeApiAsyncTask.NoticeApiListener { private static final int MAX_NUM_ROW = 3; // 失敗/キャンセルを知りたい場合は追加 public interface OnUpdateNoticeOutlineListener { void OnCompleteNoticeOutlineUpdate(); } public interface OnShowAllNoticeClickListener { void onShowAllNoticeClick(); } public static NoticeOutlineFragment newInstance() { NoticeOutlineFragment fragment = new NoticeOutlineFragment(); return fragment; } private ViewGroup mBodyLayout; private NoticeList mNoticeList; private ArrayList<ViewHolder> mHolders; private OnShowAllNoticeClickListener mOnShowAllNoticeClickListener; private OnNoticeClickListener mOnNoticeClickListener; private OnUpdateNoticeOutlineListener mOnUpdateNoticeOutlineListener; private NoticeApiAsyncTask mNoticeApiAsyncTask; public NoticeOutlineFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_outline, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // TODO save View header = view.findViewById(R.id.header); header.setOnClickListener(this); ImageView iconImageView = (ImageView) view.findViewById(R.id.icon); iconImageView.setImageResource(R.drawable.notice); TextView titleTextView = (TextView) view.findViewById(R.id.outline_title); titleTextView.setText(R.string.title_outline_notice); TextView showAllTextView = (TextView) view.findViewById(R.id.outline_show_all); // showAllTextView.setOnClickListener(this); mBodyLayout = (ViewGroup) view.findViewById(R.id.outline_body); setupView(); if (mNoticeList != null) { setDataToView(); } } @Override public void onStart() { super.onStart(); BusHolder.getInstance().register(this); } @Override public void onStop() { BusHolder.getInstance().unregister(this); super.onStop(); } @Override public void onResume() { super.onResume(); if (mNoticeList == null) { startApiAsyncTask(); } } @Override public void onPause() { stopApiAsyncTask(); super.onPause(); } @Override public void onDestroyView() { mBodyLayout = null; super.onDestroyView(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Fragment parent = getParentFragment(); if (parent != null && parent instanceof OnShowAllNoticeClickListener) { mOnShowAllNoticeClickListener = (OnShowAllNoticeClickListener) parent; } else if (activity instanceof OnShowAllNoticeClickListener) { mOnShowAllNoticeClickListener = (OnShowAllNoticeClickListener) activity; } else { throw new RuntimeException("parent or activity must implement listener"); } if (parent != null && parent instanceof OnNoticeClickListener) { mOnNoticeClickListener = (OnNoticeClickListener) parent; } else if (activity instanceof OnShowAllNoticeClickListener) { mOnNoticeClickListener = (OnNoticeClickListener) activity; } else { throw new RuntimeException("parent or activity must implement listener"); } if (parent != null && parent instanceof OnUpdateNoticeOutlineListener) { mOnUpdateNoticeOutlineListener = (OnUpdateNoticeOutlineListener) parent; } else if (activity instanceof OnUpdateNoticeOutlineListener) { mOnUpdateNoticeOutlineListener = (OnUpdateNoticeOutlineListener) activity; } else { throw new RuntimeException("parent or activity must implement listener"); } } @Override public void onDetach() { super.onDetach(); mOnNoticeClickListener = null; mOnShowAllNoticeClickListener = null; } private void setupView() { mHolders = new ArrayList<>(); LayoutInflater inflater = LayoutInflater.from(mBodyLayout.getContext()); View divider = inflater.inflate(R.layout.item_divider, mBodyLayout, false); mBodyLayout.addView(divider); for (int i = 0; i < MAX_NUM_ROW; i++) { View v = inflater.inflate(NoticeListItemView.RESOURECE_ID, mBodyLayout, false); divider = inflater.inflate(R.layout.item_divider, mBodyLayout, false); v.setVisibility(View.GONE); divider.setVisibility(View.GONE); mBodyLayout.addView(v); mBodyLayout.addView(divider); NoticeListItemView itemView = new NoticeListItemView(v); ViewHolder holder = new ViewHolder(itemView, divider); mHolders.add(holder); } } private void setDataToView() { int i = 0; for (final Notice notice : mNoticeList.subList(0, Math.min(mNoticeList.size(), MAX_NUM_ROW))) { ViewHolder holder = mHolders.get(i); NoticeListItemView itemView = holder.itemView; itemView.bindTo(notice, new View.OnClickListener() { @Override public void onClick(View v) { if (mOnNoticeClickListener != null) { mOnNoticeClickListener.onNoticeClick(notice); } } }); itemView.setVisibility(View.VISIBLE); holder.divider.setVisibility(View.VISIBLE); i++; } } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.header: case R.id.outline_show_all: if (mOnShowAllNoticeClickListener != null) { mOnShowAllNoticeClickListener.onShowAllNoticeClick(); } break; } } @Override public void onPreExecuteNoticeApi() { // TODO progress } @Override public void onPostExecuteNoticeApi(NoticeListApi.GetRequest api) { mNoticeApiAsyncTask = null; if (isDetached() || getActivity() == null) { return; } if (api.isSuccessful()) { mNoticeList = api.getResponseObj(); setDataToView(); } mOnUpdateNoticeOutlineListener.OnCompleteNoticeOutlineUpdate(); } @Override public void onCanceledNoticeApi() { mOnUpdateNoticeOutlineListener.OnCompleteNoticeOutlineUpdate(); } private void startApiAsyncTask() { if (mNoticeApiAsyncTask != null) { return; } mNoticeApiAsyncTask = new NoticeApiAsyncTask(getUserToken(), this); mNoticeApiAsyncTask.execute(0); } private void stopApiAsyncTask() { if (mNoticeApiAsyncTask != null) { mNoticeApiAsyncTask.cancel(true); mNoticeApiAsyncTask = null; } } @Subscribe public void requestUpdate(RequestUpdateEvent event) { stopApiAsyncTask(); startApiAsyncTask(); } private static class ViewHolder { private NoticeListItemView itemView; private View divider; public ViewHolder(NoticeListItemView itemView, View divider) { this.itemView = itemView; this.divider = divider; } } }