package com.github.tibolte.agendacalendarview.agenda; import android.animation.Animator; import android.animation.ObjectAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.FrameLayout; import com.github.tibolte.agendacalendarview.CalendarManager; import com.github.tibolte.agendacalendarview.R; import com.github.tibolte.agendacalendarview.utils.BusProvider; import com.github.tibolte.agendacalendarview.utils.Events; public class AgendaView extends FrameLayout { private AgendaListView mAgendaListView; private View mShadowView; private boolean enablePlaceholder; // region Constructors public AgendaView(Context context) { super(context); } public AgendaView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.view_agenda, this, true); } // endregion // region Class - View @Override protected void onFinishInflate() { super.onFinishInflate(); mAgendaListView = (AgendaListView) findViewById(R.id.agenda_listview); mShadowView = findViewById(R.id.view_shadow); BusProvider.getInstance().toObserverable() .subscribe(event -> { if (event instanceof Events.DayClickedEvent) { Events.DayClickedEvent clickedEvent = (Events.DayClickedEvent) event; getAgendaListView().scrollToCurrentDate(clickedEvent.getCalendar()); } else if (event instanceof Events.CalendarScrolledEvent) { int offset = (int) (3 * getResources().getDimension(R.dimen.day_cell_height)); translateList(offset); } else if (event instanceof Events.EventsFetched) { ((AgendaAdapter) getAgendaListView().getAdapter()).updateEvents(CalendarManager.getInstance().getEvents()); getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (getWidth() != 0 && getHeight() != 0) { // display only two visible rows on the calendar view if (enablePlaceholder) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams(); int height = getHeight(); int margin = (int) (getContext().getResources().getDimension(R.dimen.calendar_header_height) + 2 * getContext().getResources().getDimension(R.dimen.day_cell_height)); layoutParams.height = height; layoutParams.setMargins(0, margin, 0, 0); setLayoutParams(layoutParams); } getAgendaListView().scrollToCurrentDate(CalendarManager.getInstance().getToday()); getViewTreeObserver().removeGlobalOnLayoutListener(this); } } } ); } else if (event instanceof Events.ForecastFetched) { ((AgendaAdapter) getAgendaListView().getAdapter()).updateEvents(CalendarManager.getInstance().getEvents()); } }); } @Override public boolean dispatchTouchEvent(MotionEvent event) { int eventaction = event.getAction(); switch (eventaction) { case MotionEvent.ACTION_DOWN: // if the user touches the listView, we put it back to the top translateList(0); break; default: break; } return super.dispatchTouchEvent(event); } // endregion // region Public methods public AgendaListView getAgendaListView() { return mAgendaListView; } public void translateList(int targetY) { if (targetY != getTranslationY()) { ObjectAnimator mover = ObjectAnimator.ofFloat(this, "translationY", targetY); mover.setDuration(150); mover.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { mShadowView.setVisibility(GONE); } @Override public void onAnimationEnd(Animator animation) { if (targetY == 0) { BusProvider.getInstance().send(new Events.AgendaListViewTouchedEvent()); } mShadowView.setVisibility(VISIBLE); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); mover.start(); } } public void enablePlaceholderForCalendar(boolean enable) { this.enablePlaceholder = enable; } // endregion }