package io.github.droidkaigi.confsched.fragment; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.like.LikeButton; import com.like.OnLikeListener; import org.parceler.Parcels; import java.util.Collections; import java.util.List; import javax.inject.Inject; import io.github.droidkaigi.confsched.R; import io.github.droidkaigi.confsched.activity.ActivityNavigator; import io.github.droidkaigi.confsched.dao.SessionDao; import io.github.droidkaigi.confsched.databinding.FragmentSessionsTabBinding; import io.github.droidkaigi.confsched.databinding.ItemSessionBinding; import io.github.droidkaigi.confsched.model.Session; import io.github.droidkaigi.confsched.util.AlarmUtil; import io.github.droidkaigi.confsched.widget.ArrayRecyclerAdapter; import io.github.droidkaigi.confsched.widget.BindingHolder; import io.github.droidkaigi.confsched.widget.itemdecoration.SpaceItemDecoration; public class SessionsTabFragment extends BaseFragment { protected static final String ARG_SESSIONS = "sessions"; private static final int REQ_DETAIL = 1; @Inject SessionDao dao; @Inject ActivityNavigator activityNavigator; private SessionsAdapter adapter; private FragmentSessionsTabBinding binding; private List<Session> sessions; private SessionsFragment.OnChangeSessionListener onChangeSessionListener = sessions -> {/* no op */}; @NonNull public static SessionsTabFragment newInstance(List<Session> sessions) { SessionsTabFragment fragment = new SessionsTabFragment(); Bundle args = new Bundle(); args.putParcelable(ARG_SESSIONS, Parcels.wrap(sessions)); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); sessions = Parcels.unwrap(getArguments().getParcelable(ARG_SESSIONS)); } @Override public void onAttach(Context context) { super.onAttach(context); getComponent().inject(this); if (context instanceof SessionsFragment.OnChangeSessionListener) { onChangeSessionListener = (SessionsFragment.OnChangeSessionListener) context; } } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentSessionsTabBinding.inflate(inflater, container, false); bindData(); return binding.getRoot(); } private void bindData() { adapter = createAdapter(); binding.recyclerView.setAdapter(adapter); binding.recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); int spacing = getResources().getDimensionPixelSize(R.dimen.spacing_xsmall); binding.recyclerView.addItemDecoration(new SpaceItemDecoration(spacing)); adapter.addAll(sessions); } protected SessionsAdapter createAdapter() { return new SessionsAdapter(getContext()); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_DETAIL: if (resultCode == Activity.RESULT_OK) { Session session = Parcels.unwrap(data.getParcelableExtra(Session.class.getSimpleName())); if (session != null) { adapter.refresh(session); onChangeSessionListener.onChangeSession(Collections.singletonList(session)); } } break; } } public void scrollUpToTop() { binding.recyclerView.smoothScrollToPosition(0); } protected class SessionsAdapter extends ArrayRecyclerAdapter<Session, BindingHolder<ItemSessionBinding>> { public SessionsAdapter(@NonNull Context context) { super(context); } protected void refresh(@NonNull Session session) { // TODO It may be heavy logic... for (int i = 0, count = adapter.getItemCount(); i < count; i++) { Session s = adapter.getItem(i); if (session.equals(s)) { s.checked = session.checked; adapter.notifyItemChanged(i); } } } @Override public BindingHolder<ItemSessionBinding> onCreateViewHolder(ViewGroup parent, int viewType) { return new BindingHolder<>(getContext(), parent, R.layout.item_session); } @Override public void onBindViewHolder(BindingHolder<ItemSessionBinding> holder, int position) { Session session = getItem(position); ItemSessionBinding binding = holder.binding; binding.setSession(session); if (position > 0 && position < getItemCount()) { Session prevSession = getItem(position - 1); if (prevSession.stime.getTime() == session.stime.getTime()) { binding.txtStime.setVisibility(View.INVISIBLE); } else { binding.txtStime.setVisibility(View.VISIBLE); } } else { binding.txtStime.setVisibility(View.VISIBLE); } binding.txtConflict.setVisibility(View.GONE); binding.btnStar.setOnLikeListener(new OnLikeListener() { @Override public void liked(LikeButton likeButton) { session.checked = true; final int pos = holder.getAdapterPosition(); if (pos != RecyclerView.NO_POSITION) { onLikeChanged(session, pos); } } @Override public void unLiked(LikeButton likeButton) { session.checked = false; final int pos = holder.getAdapterPosition(); if (pos != RecyclerView.NO_POSITION) { onLikeChanged(session, pos); } } }); binding.cardView.setOnClickListener(v -> activityNavigator.showSessionDetail(SessionsTabFragment.this, session, REQ_DETAIL)); } protected void onLikeChanged(@NonNull Session session, int position) { dao.updateChecked(session); AlarmUtil.handleSessionAlarm(getContext(), session); onChangeSessionListener.onChangeSession(Collections.singletonList(session)); } } }