FileDocCategorySizeDatePackage
CalendarViewMaterialDelegate.javaAPI DocAndroid 5.1 API7211Thu Mar 12 22:22:10 GMT 2015android.widget

CalendarViewMaterialDelegate.java

/*
 * 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 com.android.internal.R;

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.MathUtils;

import java.util.Calendar;
import java.util.Locale;

import libcore.icu.LocaleData;

class CalendarViewMaterialDelegate extends CalendarView.AbstractCalendarViewDelegate {
    private final DayPickerView mDayPickerView;

    private CalendarView.OnDateChangeListener mOnDateChangeListener;

    public CalendarViewMaterialDelegate(CalendarView delegator, Context context, AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        super(delegator, context);

        final TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.CalendarView, defStyleAttr, defStyleRes);
        final int firstDayOfWeek = a.getInt(R.styleable.CalendarView_firstDayOfWeek,
                LocaleData.get(Locale.getDefault()).firstDayOfWeek);

        final long minDate = parseDateToMillis(a.getString(
                R.styleable.CalendarView_minDate), DEFAULT_MIN_DATE);
        final long maxDate = parseDateToMillis(a.getString(
                R.styleable.CalendarView_maxDate), DEFAULT_MAX_DATE);
        if (maxDate < minDate) {
            throw new IllegalArgumentException("max date cannot be before min date");
        }

        final long setDate = MathUtils.constrain(System.currentTimeMillis(), minDate, maxDate);
        final int dateTextAppearanceResId = a.getResourceId(
                R.styleable.CalendarView_dateTextAppearance,
                R.style.TextAppearance_DeviceDefault_Small);

        a.recycle();

        mDayPickerView = new DayPickerView(context);
        mDayPickerView.setFirstDayOfWeek(firstDayOfWeek);
        mDayPickerView.setCalendarTextAppearance(dateTextAppearanceResId);
        mDayPickerView.setMinDate(minDate);
        mDayPickerView.setMaxDate(maxDate);
        mDayPickerView.setDate(setDate, false, true);
        mDayPickerView.setOnDaySelectedListener(mOnDaySelectedListener);

        delegator.addView(mDayPickerView);
    }

    private long parseDateToMillis(String dateStr, String defaultDateStr) {
        final Calendar tempCalendar = Calendar.getInstance();
        if (TextUtils.isEmpty(dateStr) || !parseDate(dateStr, tempCalendar)) {
            parseDate(defaultDateStr, tempCalendar);
        }
        return tempCalendar.getTimeInMillis();
    }

    @Override
    public void setShownWeekCount(int count) {
        // Deprecated.
    }

    @Override
    public int getShownWeekCount() {
        // Deprecated.
        return 0;
    }

    @Override
    public void setSelectedWeekBackgroundColor(int color) {
        // TODO: Should use a ColorStateList. Deprecate?
    }

    @Override
    public int getSelectedWeekBackgroundColor() {
        return 0;
    }

    @Override
    public void setFocusedMonthDateColor(int color) {
        // TODO: Should use a ColorStateList. Deprecate?
    }

    @Override
    public int getFocusedMonthDateColor() {
        return 0;
    }

    @Override
    public void setUnfocusedMonthDateColor(int color) {
        // TODO: Should use a ColorStateList. Deprecate?
    }

    @Override
    public int getUnfocusedMonthDateColor() {
        return 0;
    }

    @Override
    public void setWeekDayTextAppearance(int resourceId) {

    }

    @Override
    public int getWeekDayTextAppearance() {
        return 0;
    }

    @Override
    public void setDateTextAppearance(int resourceId) {

    }

    @Override
    public int getDateTextAppearance() {
        return 0;
    }

    @Override
    public void setWeekNumberColor(int color) {
        // Deprecated.
    }

    @Override
    public int getWeekNumberColor() {
        // Deprecated.
        return 0;
    }

    @Override
    public void setWeekSeparatorLineColor(int color) {
        // Deprecated.
    }

    @Override
    public int getWeekSeparatorLineColor() {
        // Deprecated.
        return 0;
    }

    @Override
    public void setSelectedDateVerticalBar(int resourceId) {
        // Deprecated.
    }

    @Override
    public void setSelectedDateVerticalBar(Drawable drawable) {
        // Deprecated.
    }

    @Override
    public Drawable getSelectedDateVerticalBar() {
        // Deprecated.
        return null;
    }

    @Override
    public void setMinDate(long minDate) {
        mDayPickerView.setMinDate(minDate);
    }

    @Override
    public long getMinDate() {
        return mDayPickerView.getMinDate();
    }

    @Override
    public void setMaxDate(long maxDate) {
        mDayPickerView.setMaxDate(maxDate);
    }

    @Override
    public long getMaxDate() {
        return mDayPickerView.getMaxDate();
    }

    @Override
    public void setShowWeekNumber(boolean showWeekNumber) {
        // Deprecated.
    }

    @Override
    public boolean getShowWeekNumber() {
        // Deprecated.
        return false;
    }

    @Override
    public void setFirstDayOfWeek(int firstDayOfWeek) {
        mDayPickerView.setFirstDayOfWeek(firstDayOfWeek);
    }

    @Override
    public int getFirstDayOfWeek() {
        return mDayPickerView.getFirstDayOfWeek();
    }

    @Override
    public void setDate(long date) {
        mDayPickerView.setDate(date, true, false);
    }

    @Override
    public void setDate(long date, boolean animate, boolean center) {
        mDayPickerView.setDate(date, animate, center);
    }

    @Override
    public long getDate() {
        return mDayPickerView.getDate();
    }

    @Override
    public void setOnDateChangeListener(CalendarView.OnDateChangeListener listener) {
        mOnDateChangeListener = listener;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // Nothing to do here, configuration changes are already propagated
        // by ViewGroup.
    }

    private final DayPickerView.OnDaySelectedListener mOnDaySelectedListener =
            new DayPickerView.OnDaySelectedListener() {
        @Override
        public void onDaySelected(DayPickerView view, Calendar day) {
            if (mOnDateChangeListener != null) {
                final int year = day.get(Calendar.YEAR);
                final int month = day.get(Calendar.MONTH);
                final int dayOfMonth = day.get(Calendar.DAY_OF_MONTH);
                mOnDateChangeListener.onSelectedDayChange(mDelegator, year, month, dayOfMonth);
            }
        }
    };
}