blob: 3bad235ebff5ef8f31c55c63b0b5653be0c8c813 [file] [log] [blame]
/*
* Copyright (C) 2014 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 android.widget;
import android.content.Context;
import android.content.res.ColorStateList;
import android.view.View;
import android.view.ViewGroup;
import java.util.Calendar;
import java.util.HashMap;
/**
* An adapter for a list of {@link android.widget.SimpleMonthView} items.
*/
class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayClickListener {
private static final String TAG = "SimpleMonthAdapter";
private final Context mContext;
private final DatePickerController mController;
private Calendar mSelectedDay;
private ColorStateList mCalendarTextColors;
public SimpleMonthAdapter(Context context, DatePickerController controller) {
mContext = context;
mController = controller;
init();
setSelectedDay(mController.getSelectedDay());
}
/**
* Updates the selected day and related parameters.
*
* @param day The day to highlight
*/
public void setSelectedDay(Calendar day) {
if (mSelectedDay != day) {
mSelectedDay = day;
notifyDataSetChanged();
}
}
void setCalendarTextColor(ColorStateList colors) {
mCalendarTextColors = colors;
}
/**
* Set up the gesture detector and selected time
*/
protected void init() {
mSelectedDay = Calendar.getInstance();
}
@Override
public int getCount() {
final int diffYear = mController.getMaxYear() - mController.getMinYear();
final int diffMonth = 1 + mController.getMaxMonth() - mController.getMinMonth()
+ 12 * diffYear;
return diffMonth;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
@SuppressWarnings("unchecked")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SimpleMonthView v;
HashMap<String, Integer> drawingParams = null;
if (convertView != null) {
v = (SimpleMonthView) convertView;
// We store the drawing parameters in the view so it can be recycled
drawingParams = (HashMap<String, Integer>) v.getTag();
} else {
v = new SimpleMonthView(mContext);
// Set up the new view
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT);
v.setLayoutParams(params);
v.setClickable(true);
v.setOnDayClickListener(this);
if (mCalendarTextColors != null) {
v.setTextColor(mCalendarTextColors);
}
}
if (drawingParams == null) {
drawingParams = new HashMap<String, Integer>();
} else {
drawingParams.clear();
}
final int currentMonth = position + mController.getMinMonth();
final int month = currentMonth % 12;
final int year = currentMonth / 12 + mController.getMinYear();
int selectedDay = -1;
if (isSelectedDayInMonth(year, month)) {
selectedDay = mSelectedDay.get(Calendar.DAY_OF_MONTH);
}
// Invokes requestLayout() to ensure that the recycled view is set with the appropriate
// height/number of weeks before being displayed.
v.reuse();
final int enabledDayRangeStart;
if (mController.getMinMonth() == month && mController.getMinYear() == year) {
enabledDayRangeStart = mController.getMinDay();
} else {
enabledDayRangeStart = 1;
}
final int enabledDayRangeEnd;
if (mController.getMaxMonth() == month && mController.getMaxYear() == year) {
enabledDayRangeEnd = mController.getMaxDay();
} else {
enabledDayRangeEnd = 31;
}
v.setMonthParams(selectedDay, month, year, mController.getFirstDayOfWeek(),
enabledDayRangeStart, enabledDayRangeEnd);
v.invalidate();
return v;
}
private boolean isSelectedDayInMonth(int year, int month) {
return mSelectedDay.get(Calendar.YEAR) == year && mSelectedDay.get(Calendar.MONTH) == month;
}
@Override
public void onDayClick(SimpleMonthView view, Calendar 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(Calendar day) {
mController.tryVibrate();
mController.onDayOfMonthSelected(day.get(Calendar.YEAR), day.get(Calendar.MONTH),
day.get(Calendar.DAY_OF_MONTH));
setSelectedDay(day);
}
}