/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.appsimobile.appsii.module.appsiagenda; import android.content.Context; import android.support.v4.util.SimpleArrayMap; import android.support.v7.widget.RecyclerView; import android.text.format.Time; import android.util.SparseBooleanArray; import android.view.ViewGroup; import android.widget.AbsListView.LayoutParams; /** * An adapter for a list of {@link com.appsimobile.appsii.module.appsiagenda.MonthView} items. */ public abstract class MonthAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MonthView.OnDayClickListener { private static final String TAG = "SimpleMonthAdapter"; private final Context mContext; protected final DatePickerController mController; private MonthAdapter.CalendarDay mSelectedDay; protected static int WEEK_7_OVERHANG_HEIGHT = 7; protected static final int MONTHS_IN_YEAR = 12; final Time mTime = new Time(Time.TIMEZONE_UTC); public MonthAdapter2(Context context, DatePickerController controller) { mContext = context; mController = controller; init(); setSelectedDay(mController.getSelectedDay()); setHasStableIds(true); } /** * Updates the selected day and related parameters. * * @param day The day to highlight */ public void setSelectedDay(MonthAdapter.CalendarDay day) { mSelectedDay = day; notifyDataSetChanged(); } public MonthAdapter.CalendarDay getSelectedDay() { return mSelectedDay; } /** * Set up the gesture detector and selected time */ protected void init() { mSelectedDay = new MonthAdapter.CalendarDay(System.currentTimeMillis()); } @Override public int getItemCount() { return ((mController.getMaxYear() - mController.getMinYear()) + 1) * MONTHS_IN_YEAR; } @Override public long getItemId(int position) { return position; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MonthView v = createMonthView(mContext, parent); v.setDatePickerController(mController); LayoutParams params = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); v.setLayoutParams(params); v.setClickable(true); v.setOnDayClickListener(this); return new RecyclerView.ViewHolder(v) { }; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MonthView v = (MonthView) holder.itemView; SimpleArrayMap<String, Integer> drawingParams; // We store the drawing parameters in the view so it can be recycled drawingParams = (SimpleArrayMap<String, Integer>) v.getTag(); if (drawingParams == null) { drawingParams = new SimpleArrayMap<>(); } drawingParams.clear(); final int month = position % MONTHS_IN_YEAR; final int year = position / MONTHS_IN_YEAR + mController.getMinYear(); int selectedDay = -1; if (isSelectedDayInMonth(year, month)) { selectedDay = mSelectedDay.day; } // Invokes requestLayout() to ensure that the recycled view is set with the appropriate // height/number of weeks before being displayed. v.reuse(); mTime.set(1, month, year); long millis = mTime.normalize(true); int startJulianDay = Time.getJulianDay(millis, 0); drawingParams.put(MonthView.VIEW_PARAMS_SELECTED_DAY, selectedDay); drawingParams.put(MonthView.VIEW_PARAMS_YEAR, year); drawingParams.put(MonthView.VIEW_PARAMS_MONTH, month); drawingParams.put(MonthView.VIEW_PARAMS_START_JULIAN_DAY, startJulianDay); drawingParams.put(MonthView.VIEW_PARAMS_WEEK_START, mController.getFirstDayOfWeek()); v.setMonthParams(drawingParams); v.invalidate(); } public abstract MonthView createMonthView(Context context, ViewGroup parent); private boolean isSelectedDayInMonth(int year, int month) { return mSelectedDay.year == year && mSelectedDay.month == month; } @Override public void onDayClick(MonthView view, MonthAdapter.CalendarDay day) { if (day != null) { onDayTapped(day); } } /** * Maintains the same hour/min/sec but moves the day to the tapped day. * * @param day The day that was tapped */ protected void onDayTapped(MonthAdapter.CalendarDay day) { mController.tryVibrate(); mController.onDayOfMonthSelected(day.year, day.month, day.day, true); setSelectedDay(day); } public void setEventDays(SparseBooleanArray data) { } }