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.LinearLayout; import android.widget.TextView; import com.bumptech.glide.Glide; import com.squareup.otto.Subscribe; import java.util.ArrayList; import jp.gr.procon.proconapp.R; import jp.gr.procon.proconapp.api.GamePhotoListApi; import jp.gr.procon.proconapp.api.asynctask.GamePhotoApiAsyncTask; import jp.gr.procon.proconapp.event.BusHolder; import jp.gr.procon.proconapp.event.RequestUpdateEvent; import jp.gr.procon.proconapp.model.GamePhoto; import jp.gr.procon.proconapp.model.GamePhotoList; import jp.gr.procon.proconapp.ui.callback.OnClickPhotoListener; public class PhotoOutlineFragment extends BaseFragment implements View.OnClickListener , GamePhotoApiAsyncTask.GamePhotoApiListener { private static final int MAX_NUM_PHOTO = 4; private static final int[] THUMBNAIL_IMAGE_RES_IS = new int[]{R.id.image1, R.id.image2}; // 失敗/キャンセルを知りたい場合は追加 public interface OnUpdatePhotoOutlineListener { void OnCompletePhotoOutlineUpdate(); } public interface OnShowAllGamePhotoClickListener { void onShowAllGamePhotoClick(); } public static PhotoOutlineFragment newInstance() { PhotoOutlineFragment fragment = new PhotoOutlineFragment(); return fragment; } private LinearLayout mLinearLayout; private ArrayList<ViewHolder> holders; private GamePhotoList mPhotoList; private OnShowAllGamePhotoClickListener mOnShowAllGamePhotoClickListener; private OnUpdatePhotoOutlineListener mOnUpdatePhotoOutlineListener; private OnClickPhotoListener mOnClickPhotoListener; private GamePhotoApiAsyncTask mGamePhotoApiAsyncTask; public PhotoOutlineFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_outline_game_photo, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // TODO savedInstanceState // TODO headerをviewかfragmentへまとめる View header = view.findViewById(R.id.header); header.setOnClickListener(this); ImageView iconImageView = (ImageView) view.findViewById(R.id.icon); iconImageView.setImageResource(R.drawable.photo); TextView titleTextView = (TextView) view.findViewById(R.id.outline_title); titleTextView.setText(R.string.title_outline_game_photo); mLinearLayout = (LinearLayout) view.findViewById(R.id.thumbnails_layout); setupView(); if (mPhotoList != 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 (mPhotoList == null) { startApiAsyncTask(); } } @Override public void onPause() { stopApiAsyncTask(); super.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Fragment parent = getParentFragment(); if (parent != null && parent instanceof OnShowAllGamePhotoClickListener) { mOnShowAllGamePhotoClickListener = (OnShowAllGamePhotoClickListener) parent; } else if (activity instanceof OnShowAllGamePhotoClickListener) { mOnShowAllGamePhotoClickListener = (OnShowAllGamePhotoClickListener) activity; } else { throw new RuntimeException("parent or activity must implement listener"); } if (parent != null && parent instanceof OnUpdatePhotoOutlineListener) { mOnUpdatePhotoOutlineListener = (OnUpdatePhotoOutlineListener) parent; } else if (activity instanceof OnUpdatePhotoOutlineListener) { mOnUpdatePhotoOutlineListener = (OnUpdatePhotoOutlineListener) activity; } else { throw new RuntimeException("parent or activity must implement listener"); } if (parent != null && parent instanceof OnClickPhotoListener) { mOnClickPhotoListener = (OnClickPhotoListener) parent; } else if (activity instanceof OnClickPhotoListener) { mOnClickPhotoListener = (OnClickPhotoListener) activity; } else { throw new RuntimeException("parent or activity must implement listener"); } } @Override public void onDetach() { mOnShowAllGamePhotoClickListener = null; super.onDetach(); } private void setDataToView() { int i = 0; for (GamePhoto photo : mPhotoList) { ViewHolder holder = holders.get(i); final GamePhoto gamePhoto = photo; holder.imageView.setVisibility(View.VISIBLE); Glide.with(this) .load(photo.getmThumbnailUrl()) .centerCrop() .into(holder.imageView); holder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnClickPhotoListener != null) { mOnClickPhotoListener.onClickPhoto(gamePhoto); } } }); i++; } for (int j = i; j < holders.size(); j++) { holders.get(j).imageView.setVisibility(View.GONE); } } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.header: case R.id.outline_show_all: if (mOnShowAllGamePhotoClickListener != null) { mOnShowAllGamePhotoClickListener.onShowAllGamePhotoClick(); } break; } } @Override public void onPreExecuteGamePhotoApi() { } @Override public void onPostExecuteGamePhotoApi(GamePhotoListApi.GetRequest api) { if (isDetached() || getActivity() == null) { return; } if (api.isSuccessful()) { mPhotoList = api.getResponseObj(); setDataToView(); } else { // TODO error } mOnUpdatePhotoOutlineListener.OnCompletePhotoOutlineUpdate(); } @Override public void onCanceledGamePhotoApi() { mOnUpdatePhotoOutlineListener.OnCompletePhotoOutlineUpdate(); } private void setupView() { holders = new ArrayList<>(); LayoutInflater inflater = LayoutInflater.from(getActivity()); View mLayout = null; for (int i = 0; i < MAX_NUM_PHOTO; i++) { if (i % 2 == 0) { mLayout = inflater.inflate(R.layout.view_two_column_image, mLinearLayout, false); mLinearLayout.addView(mLayout); } ImageView imageView = (ImageView) mLayout.findViewById(THUMBNAIL_IMAGE_RES_IS[i % 2]).findViewById(R.id.thumbnail_view); imageView.setVisibility(View.GONE); ViewHolder holder = new ViewHolder(imageView); holders.add(holder); } } private void startApiAsyncTask() { if (mGamePhotoApiAsyncTask != null) { return; } mGamePhotoApiAsyncTask = new GamePhotoApiAsyncTask(getUserToken(), this); mGamePhotoApiAsyncTask.execute(MAX_NUM_PHOTO); } private void stopApiAsyncTask() { if (mGamePhotoApiAsyncTask != null) { mGamePhotoApiAsyncTask.cancel(true); mGamePhotoApiAsyncTask = null; } } @Subscribe public void requestUpdate(RequestUpdateEvent event) { stopApiAsyncTask(); startApiAsyncTask(); } private static class ViewHolder { private ImageView imageView; public ViewHolder(ImageView imageView) { this.imageView = imageView; } } }