summaryrefslogtreecommitdiff
path: root/core/java/android/widget/SimpleMonthAdapter.java
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2013-10-01 11:21:31 -0700
committerFabrice Di Meglio <fdimeglio@google.com>2014-07-15 20:26:21 +0000
commitbd9152f6ee156ee473f05f6f05f238605996fca4 (patch)
tree57ccd34b9e185f0a2ecf2ad8e56933b3db65a808 /core/java/android/widget/SimpleMonthAdapter.java
parentd8176941eb6466ebe26816d79b37a808103fd81d (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.java178
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);
+ }
+}