diff options
| author | Fabrice Di Meglio <fdimeglio@google.com> | 2013-10-01 11:21:31 -0700 |
|---|---|---|
| committer | Fabrice Di Meglio <fdimeglio@google.com> | 2014-07-15 20:26:21 +0000 |
| commit | bd9152f6ee156ee473f05f6f05f238605996fca4 (patch) | |
| tree | 57ccd34b9e185f0a2ecf2ad8e56933b3db65a808 /core/java/android/widget/SimpleMonthAdapter.java | |
| parent | d8176941eb6466ebe26816d79b37a808103fd81d (diff) | |
Update DatePicker widget and its related dialog
- the old DatePicker widget is still there for obvious layout compatibility reasons
- add a new delegate implementation for having a new UI
- use the new delegate only for the DatePickerDialog (which does not need to be
the same)
- added support for Theming and light/dark Themes
- added support for RTL
- added support for Accessibility
- verified support for Keyboard
- verified that CTS tests for DatePicker are passing (for both the legacy and the
new widgets)
Also added a new HapticFeedbackConstants.CALENDAR_DATE and its related code for
enabling day selection vibration
Change-Id: I256bd7c21edd8f3b910413ca15ce26d3a5ef7d9c
Diffstat (limited to 'core/java/android/widget/SimpleMonthAdapter.java')
| -rw-r--r-- | core/java/android/widget/SimpleMonthAdapter.java | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/core/java/android/widget/SimpleMonthAdapter.java b/core/java/android/widget/SimpleMonthAdapter.java new file mode 100644 index 000000000000..53d0839eb5fa --- /dev/null +++ b/core/java/android/widget/SimpleMonthAdapter.java @@ -0,0 +1,178 @@ +/* + * 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; + } + + drawingParams.put(SimpleMonthView.VIEW_PARAMS_SELECTED_DAY, selectedDay); + drawingParams.put(SimpleMonthView.VIEW_PARAMS_YEAR, year); + drawingParams.put(SimpleMonthView.VIEW_PARAMS_MONTH, month); + drawingParams.put(SimpleMonthView.VIEW_PARAMS_WEEK_START, mController.getFirstDayOfWeek()); + drawingParams.put(SimpleMonthView.VIEW_PARAMS_ENABLEDDAYRANGE_START, enabledDayRangeStart); + drawingParams.put(SimpleMonthView.VIEW_PARAMS_ENABLEDDAYRANGE_END, enabledDayRangeEnd); + v.setMonthParams(drawingParams); + 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); + } +} |
