Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78bf1d32 authored by Alan Viverette's avatar Alan Viverette
Browse files

Move date picker arrows out of SimpleMonthView

Also fixes incorrect docs in Drawable.

Bug: 20188255
Change-Id: I01c8563f734d9c1dad1e149bee80c651981e469f
parent 4b46ed3b
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package android.widget;
import android.annotation.StyleRes;
import android.annotation.StyleRes;
import android.content.Context;
import android.content.Context;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.widget.DayPickerView.OnDaySelectedListener;


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


@@ -109,8 +110,7 @@ class CalendarViewMaterialDelegate extends CalendarView.AbstractCalendarViewDele
        mOnDateChangeListener = listener;
        mOnDateChangeListener = listener;
    }
    }


    private final DayPickerView.OnDaySelectedListener mOnDaySelectedListener =
    private final OnDaySelectedListener mOnDaySelectedListener = new OnDaySelectedListener() {
            new DayPickerView.OnDaySelectedListener() {
        @Override
        @Override
        public void onDaySelected(DayPickerView view, Calendar day) {
        public void onDaySelected(DayPickerView view, Calendar day) {
            if (mOnDateChangeListener != null) {
            if (mOnDateChangeListener != null) {
+1 −3
Original line number Original line Diff line number Diff line
@@ -34,8 +34,6 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.DayPickerView.OnDaySelectedListener;
import android.widget.DayPickerView.OnDaySelectedListener;
import android.widget.YearPickerView.OnYearSelectedListener;
import android.widget.YearPickerView.OnYearSelectedListener;


@@ -549,7 +547,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate {
        final int listPosition = ss.getListPosition();
        final int listPosition = ss.getListPosition();
        if (listPosition != -1) {
        if (listPosition != -1) {
            if (currentView == VIEW_MONTH_DAY) {
            if (currentView == VIEW_MONTH_DAY) {
                mDayPickerView.setCurrentItem(listPosition);
                mDayPickerView.setPosition(listPosition);
            } else if (currentView == VIEW_YEAR) {
            } else if (currentView == VIEW_YEAR) {
                final int listPositionOffset = ss.getListPositionOffset();
                final int listPositionOffset = ss.getListPositionOffset();
                mYearPickerView.setSelectionFromTop(listPosition, listPositionOffset);
                mYearPickerView.setSelectionFromTop(listPosition, listPositionOffset);
+6 −15
Original line number Original line Diff line number Diff line
@@ -36,7 +36,7 @@ import java.util.Calendar;
/**
/**
 * An adapter for a list of {@link android.widget.SimpleMonthView} items.
 * An adapter for a list of {@link android.widget.SimpleMonthView} items.
 */
 */
class DayPickerAdapter extends PagerAdapter {
class DayPickerPagerAdapter extends PagerAdapter {
    private static final int MONTHS_IN_YEAR = 12;
    private static final int MONTHS_IN_YEAR = 12;


    private final Calendar mMinDate = Calendar.getInstance();
    private final Calendar mMinDate = Calendar.getInstance();
@@ -63,7 +63,7 @@ class DayPickerAdapter extends PagerAdapter {
    private int mCount;
    private int mCount;
    private int mFirstDayOfWeek;
    private int mFirstDayOfWeek;


    public DayPickerAdapter(@NonNull Context context, @LayoutRes int layoutResId,
    public DayPickerPagerAdapter(@NonNull Context context, @LayoutRes int layoutResId,
            @IdRes int calendarViewId) {
            @IdRes int calendarViewId) {
        mInflater = LayoutInflater.from(context);
        mInflater = LayoutInflater.from(context);
        mLayoutResId = layoutResId;
        mLayoutResId = layoutResId;
@@ -200,7 +200,8 @@ class DayPickerAdapter extends PagerAdapter {


        final int yearOffset = (day.get(Calendar.YEAR) - mMinDate.get(Calendar.YEAR));
        final int yearOffset = (day.get(Calendar.YEAR) - mMinDate.get(Calendar.YEAR));
        final int monthOffset = (day.get(Calendar.MONTH) - mMinDate.get(Calendar.MONTH));
        final int monthOffset = (day.get(Calendar.MONTH) - mMinDate.get(Calendar.MONTH));
        return yearOffset * MONTHS_IN_YEAR + monthOffset;
        final int position = yearOffset * MONTHS_IN_YEAR + monthOffset;
        return position;
    }
    }


    @Override
    @Override
@@ -253,8 +254,6 @@ class DayPickerAdapter extends PagerAdapter {


        v.setMonthParams(selectedDay, month, year, mFirstDayOfWeek,
        v.setMonthParams(selectedDay, month, year, mFirstDayOfWeek,
                enabledDayRangeStart, enabledDayRangeEnd);
                enabledDayRangeStart, enabledDayRangeEnd);
        v.setPrevEnabled(position > 0);
        v.setNextEnabled(position < mCount - 1);


        final ViewHolder holder = new ViewHolder(position, itemView, v);
        final ViewHolder holder = new ViewHolder(position, itemView, v);
        mItems.put(position, holder);
        mItems.put(position, holder);
@@ -298,17 +297,10 @@ class DayPickerAdapter extends PagerAdapter {
                setSelectedDay(day);
                setSelectedDay(day);


                if (mOnDaySelectedListener != null) {
                if (mOnDaySelectedListener != null) {
                    mOnDaySelectedListener.onDaySelected(DayPickerAdapter.this, day);
                    mOnDaySelectedListener.onDaySelected(DayPickerPagerAdapter.this, day);
                }
                }
            }
            }
        }
        }

        @Override
        public void onNavigationClick(SimpleMonthView view, int direction, boolean animate) {
            if (mOnDaySelectedListener != null) {
                mOnDaySelectedListener.onNavigationClick(DayPickerAdapter.this, direction, animate);
            }
        }
    };
    };


    private static class ViewHolder {
    private static class ViewHolder {
@@ -324,7 +316,6 @@ class DayPickerAdapter extends PagerAdapter {
    }
    }


    public interface OnDaySelectedListener {
    public interface OnDaySelectedListener {
        public void onDaySelected(DayPickerAdapter view, Calendar day);
        public void onDaySelected(DayPickerPagerAdapter view, Calendar day);
        public void onNavigationClick(DayPickerAdapter view, int direction, boolean animate);
    }
    }
}
}
+156 −109
Original line number Original line Diff line number Diff line
/*
/*
 * Copyright (C) 2014 The Android Open Source Project
 * Copyright (C) 2015 The Android Open Source Project
 *
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * you may not use this file except in compliance with the License.
@@ -16,37 +16,44 @@


package android.widget;
package android.widget;


import com.android.internal.widget.ViewPager;
import com.android.internal.R;
import com.android.internal.R;
import com.android.internal.widget.ViewPager;
import com.android.internal.widget.ViewPager.OnPageChangeListener;


import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.util.MathUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;


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


import libcore.icu.LocaleData;
import libcore.icu.LocaleData;


/**
class DayPickerView extends ViewGroup {
 * This displays a list of months in a calendar format with selectable days.
    private static final int DEFAULT_LAYOUT = R.layout.day_picker_content_material;
 */
class DayPickerView extends ViewPager {
    private static final int DEFAULT_START_YEAR = 1900;
    private static final int DEFAULT_START_YEAR = 1900;
    private static final int DEFAULT_END_YEAR = 2100;
    private static final int DEFAULT_END_YEAR = 2100;


    private static final int[] ATTRS_TEXT_COLOR = new int[] { R.attr.textColor };

    private final Calendar mSelectedDay = Calendar.getInstance();
    private final Calendar mSelectedDay = Calendar.getInstance();
    private final Calendar mMinDate = Calendar.getInstance();
    private final Calendar mMinDate = Calendar.getInstance();
    private final Calendar mMaxDate = Calendar.getInstance();
    private final Calendar mMaxDate = Calendar.getInstance();


    private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);
    private final AccessibilityManager mAccessibilityManager;

    private final ViewPager mViewPager;
    private final ImageButton mPrevButton;
    private final ImageButton mNextButton;


    private final DayPickerAdapter mAdapter;
    private final DayPickerPagerAdapter mAdapter;


    /** Temporary calendar used for date calculations. */
    /** Temporary calendar used for date calculations. */
    private Calendar mTempCalendar;
    private Calendar mTempCalendar;
@@ -57,17 +64,21 @@ class DayPickerView extends ViewPager {
        this(context, null);
        this(context, null);
    }
    }


    public DayPickerView(Context context, AttributeSet attrs) {
    public DayPickerView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, R.attr.calendarViewStyle);
        this(context, attrs, R.attr.calendarViewStyle);
    }
    }


    public DayPickerView(Context context, AttributeSet attrs, int defStyleAttr) {
    public DayPickerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
        this(context, attrs, defStyleAttr, 0);
    }
    }


    public DayPickerView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    public DayPickerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        super(context, attrs, defStyleAttr, defStyleRes);


        mAccessibilityManager = (AccessibilityManager) context.getSystemService(
                Context.ACCESSIBILITY_SERVICE);

        final TypedArray a = context.obtainStyledAttributes(attrs,
        final TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.CalendarView, defStyleAttr, defStyleRes);
                R.styleable.CalendarView, defStyleAttr, defStyleRes);


@@ -93,14 +104,44 @@ class DayPickerView extends ViewPager {
        a.recycle();
        a.recycle();


        // Set up adapter.
        // Set up adapter.
        mAdapter = new DayPickerAdapter(context,
        mAdapter = new DayPickerPagerAdapter(context,
                R.layout.date_picker_month_item_material, R.id.month_view);
                R.layout.date_picker_month_item_material, R.id.month_view);
        mAdapter.setMonthTextAppearance(monthTextAppearanceResId);
        mAdapter.setMonthTextAppearance(monthTextAppearanceResId);
        mAdapter.setDayOfWeekTextAppearance(dayOfWeekTextAppearanceResId);
        mAdapter.setDayOfWeekTextAppearance(dayOfWeekTextAppearanceResId);
        mAdapter.setDayTextAppearance(dayTextAppearanceResId);
        mAdapter.setDayTextAppearance(dayTextAppearanceResId);
        mAdapter.setDaySelectorColor(daySelectorColor);
        mAdapter.setDaySelectorColor(daySelectorColor);


        setAdapter(mAdapter);
        final LayoutInflater inflater = LayoutInflater.from(context);
        final ViewGroup content = (ViewGroup) inflater.inflate(DEFAULT_LAYOUT, this, false);

        // Transfer all children from content to here.
        while (content.getChildCount() > 0) {
            final View child = content.getChildAt(0);
            content.removeViewAt(0);
            addView(child);
        }

        mPrevButton = (ImageButton) findViewById(R.id.prev);
        mPrevButton.setOnClickListener(mOnClickListener);

        mNextButton = (ImageButton) findViewById(R.id.next);
        mNextButton.setOnClickListener(mOnClickListener);

        mViewPager = (ViewPager) findViewById(R.id.day_picker_view_pager);
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOnPageChangeListener(mOnPageChangedListener);

        // Proxy the month text color into the previous and next buttons.
        if (monthTextAppearanceResId != 0) {
            final TypedArray ta = mContext.obtainStyledAttributes(null,
                    ATTRS_TEXT_COLOR, 0, monthTextAppearanceResId);
            final ColorStateList monthColor = ta.getColorStateList(0);
            if (monthColor != null) {
                mPrevButton.setImageTintList(monthColor);
                mNextButton.setImageTintList(monthColor);
            }
            ta.recycle();
        }


        // Set up min and max dates.
        // Set up min and max dates.
        final Calendar tempDate = Calendar.getInstance();
        final Calendar tempDate = Calendar.getInstance();
@@ -127,109 +168,68 @@ class DayPickerView extends ViewPager {
        setDate(setDateMillis, false);
        setDate(setDateMillis, false);


        // Proxy selection callbacks to our own listener.
        // Proxy selection callbacks to our own listener.
        mAdapter.setOnDaySelectedListener(new DayPickerAdapter.OnDaySelectedListener() {
        mAdapter.setOnDaySelectedListener(new DayPickerPagerAdapter.OnDaySelectedListener() {
            @Override
            @Override
            public void onDaySelected(DayPickerAdapter adapter, Calendar day) {
            public void onDaySelected(DayPickerPagerAdapter adapter, Calendar day) {
                if (mOnDaySelectedListener != null) {
                if (mOnDaySelectedListener != null) {
                    mOnDaySelectedListener.onDaySelected(DayPickerView.this, day);
                    mOnDaySelectedListener.onDaySelected(DayPickerView.this, day);
                }
                }
            }
            }

            @Override
            public void onNavigationClick(DayPickerAdapter view, int direction, boolean animate) {
                // ViewPager clamps input values, so we don't need to worry
                // about passing invalid indices.
                final int nextItem = getCurrentItem() + direction;
                setCurrentItem(nextItem, animate);
            }
        });
        });
    }
    }


    @Override
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        populate();
        final ViewPager viewPager = mViewPager;
        measureChild(viewPager, widthMeasureSpec, heightMeasureSpec);


        // Everything below is mostly copied from FrameLayout.
        final int measuredWidthAndState = viewPager.getMeasuredWidthAndState();
        int count = getChildCount();
        final int measuredHeightAndState = viewPager.getMeasuredHeightAndState();
        setMeasuredDimension(measuredWidthAndState, measuredHeightAndState);


        final boolean measureMatchParentChildren =
        final int pagerWidth = viewPager.getMeasuredWidth();
                MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY ||
        final int pagerHeight = viewPager.getMeasuredHeight();
                        MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY;
        final int buttonWidthSpec = MeasureSpec.makeMeasureSpec(pagerWidth, MeasureSpec.AT_MOST);

        final int buttonHeightSpec = MeasureSpec.makeMeasureSpec(pagerHeight, MeasureSpec.AT_MOST);
        int maxHeight = 0;
        mPrevButton.measure(buttonWidthSpec, buttonHeightSpec);
        int maxWidth = 0;
        mNextButton.measure(buttonWidthSpec, buttonHeightSpec);
        int childState = 0;

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
                maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
                childState = combineMeasuredStates(childState, child.getMeasuredState());
                if (measureMatchParentChildren) {
                    if (lp.width == LayoutParams.MATCH_PARENT ||
                            lp.height == LayoutParams.MATCH_PARENT) {
                        mMatchParentChildren.add(child);
                    }
                }
    }
    }
        }

        // Account for padding too
        maxWidth += getPaddingLeft() + getPaddingRight();
        maxHeight += getPaddingTop() + getPaddingBottom();

        // Check against our minimum height and width
        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());

        // Check against our foreground's minimum height and width
        final Drawable drawable = getForeground();
        if (drawable != null) {
            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
        }

        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
                resolveSizeAndState(maxHeight, heightMeasureSpec,
                        childState << MEASURED_HEIGHT_STATE_SHIFT));

        count = mMatchParentChildren.size();
        if (count > 1) {
            for (int i = 0; i < count; i++) {
                final View child = mMatchParentChildren.get(i);


                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
    @Override
                final int childWidthMeasureSpec;
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
                final int childHeightMeasureSpec;
        final ImageButton leftButton = mPrevButton;

        final ImageButton rightButton = mNextButton;
                if (lp.width == LayoutParams.MATCH_PARENT) {

                    childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
        final int width = right - left;
                            getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
        final int height = bottom - top;
                            MeasureSpec.EXACTLY);
        mViewPager.layout(0, 0, width, height);
                } else {

                    childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
        if (mViewPager.getChildCount() < 1) {
                            getPaddingLeft() + getPaddingRight(),
            leftButton.setVisibility(View.INVISIBLE);
                            lp.width);
            rightButton.setVisibility(View.INVISIBLE);
                }
            return;

        }
                if (lp.height == LayoutParams.MATCH_PARENT) {

                    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
        final SimpleMonthView monthView = (SimpleMonthView) mViewPager.getChildAt(0);
                            getMeasuredHeight() - getPaddingTop() - getPaddingBottom(),
        final int monthHeight = monthView.getMonthHeight();
                            MeasureSpec.EXACTLY);
        final int cellWidth = monthView.getCellWidth();
                } else {

                    childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
        // Vertically center the previous/next buttons within the month
                            getPaddingTop() + getPaddingBottom(),
        // header, horizontally center within the day cell.
                            lp.height);
        final int leftDW = leftButton.getMeasuredWidth();
                }
        final int leftDH = leftButton.getMeasuredHeight();

        final int leftIconTop = monthView.getPaddingTop() + (monthHeight - leftDH) / 2;
                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
        final int leftIconLeft = monthView.getPaddingLeft() + (cellWidth - leftDW) / 2;
            }
        leftButton.layout(leftIconLeft, leftIconTop, leftIconLeft + leftDW, leftIconTop + leftDH);
        }
        leftButton.setVisibility(View.VISIBLE);


        mMatchParentChildren.clear();
        final int rightDW = rightButton.getMeasuredWidth();
        final int rightDH = rightButton.getMeasuredHeight();
        final int rightIconTop = monthView.getPaddingTop() + (monthHeight - rightDH) / 2;
        final int rightIconRight = width - monthView.getPaddingRight() - (cellWidth - rightDW) / 2;
        rightButton.layout(rightIconRight - rightDW, rightIconTop,
                rightIconRight, rightIconTop + rightDH);
        rightButton.setVisibility(View.VISIBLE);
    }
    }


    public void setDayOfWeekTextAppearance(int resId) {
    public void setDayOfWeekTextAppearance(int resId) {
@@ -284,8 +284,8 @@ class DayPickerView extends ViewPager {
        }
        }


        final int position = getPositionFromDay(timeInMillis);
        final int position = getPositionFromDay(timeInMillis);
        if (position != getCurrentItem()) {
        if (position != mViewPager.getCurrentItem()) {
            setCurrentItem(position, animate);
            mViewPager.setCurrentItem(position, animate);
        }
        }


        mTempCalendar.setTimeInMillis(timeInMillis);
        mTempCalendar.setTimeInMillis(timeInMillis);
@@ -365,10 +365,57 @@ class DayPickerView extends ViewPager {
     * Gets the position of the view that is most prominently displayed within the list view.
     * Gets the position of the view that is most prominently displayed within the list view.
     */
     */
    public int getMostVisiblePosition() {
    public int getMostVisiblePosition() {
        return getCurrentItem();
        return mViewPager.getCurrentItem();
    }

    public void setPosition(int position) {
        mViewPager.setCurrentItem(position, false);
    }

    private final OnPageChangeListener mOnPageChangedListener = new OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            final float alpha = Math.abs(0.5f - positionOffset) * 2.0f;
            mPrevButton.setAlpha(alpha);
            mNextButton.setAlpha(alpha);
        }

        @Override
        public void onPageScrollStateChanged(int state) {}

        @Override
        public void onPageSelected(int position) {
            mPrevButton.setVisibility(
                    position > 0 ? View.VISIBLE : View.INVISIBLE);
            mNextButton.setVisibility(
                    position < (mAdapter.getCount() - 1) ? View.VISIBLE : View.INVISIBLE);
        }
    };

    private final OnClickListener mOnClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            final int direction;
            if (v == mPrevButton) {
                direction = -1;
            } else if (v == mNextButton) {
                direction = 1;
            } else {
                return;
            }

            // Animation is expensive for accessibility services since it sends
            // lots of scroll and content change events.
            final boolean animate = !mAccessibilityManager.isEnabled();

            // ViewPager clamps input values, so we don't need to worry
            // about passing invalid indices.
            final int nextItem = mViewPager.getCurrentItem() + direction;
            mViewPager.setCurrentItem(nextItem, animate);
        }
        }
    };


    public interface OnDaySelectedListener {
    public interface OnDaySelectedListener {
        public void onDaySelected(DayPickerView view, Calendar day);
        void onDaySelected(DayPickerView view, Calendar day);
    }
    }
}
}
+137 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2015 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.widget.ViewPager;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

import java.util.ArrayList;

/**
 * This displays a list of months in a calendar format with selectable days.
 */
class DayPickerViewPager extends ViewPager {
    private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);

    public DayPickerViewPager(Context context) {
        this(context, null);
    }

    public DayPickerViewPager(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DayPickerViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public DayPickerViewPager(Context context, AttributeSet attrs, int defStyleAttr,
            int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        populate();

        // Everything below is mostly copied from FrameLayout.
        int count = getChildCount();

        final boolean measureMatchParentChildren =
                MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY ||
                        MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY;

        int maxHeight = 0;
        int maxWidth = 0;
        int childState = 0;

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
                maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
                childState = combineMeasuredStates(childState, child.getMeasuredState());
                if (measureMatchParentChildren) {
                    if (lp.width == LayoutParams.MATCH_PARENT ||
                            lp.height == LayoutParams.MATCH_PARENT) {
                        mMatchParentChildren.add(child);
                    }
                }
            }
        }

        // Account for padding too
        maxWidth += getPaddingLeft() + getPaddingRight();
        maxHeight += getPaddingTop() + getPaddingBottom();

        // Check against our minimum height and width
        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());

        // Check against our foreground's minimum height and width
        final Drawable drawable = getForeground();
        if (drawable != null) {
            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
        }

        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
                resolveSizeAndState(maxHeight, heightMeasureSpec,
                        childState << MEASURED_HEIGHT_STATE_SHIFT));

        count = mMatchParentChildren.size();
        if (count > 1) {
            for (int i = 0; i < count; i++) {
                final View child = mMatchParentChildren.get(i);

                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                final int childWidthMeasureSpec;
                final int childHeightMeasureSpec;

                if (lp.width == LayoutParams.MATCH_PARENT) {
                    childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
                            getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
                            MeasureSpec.EXACTLY);
                } else {
                    childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
                            getPaddingLeft() + getPaddingRight(),
                            lp.width);
                }

                if (lp.height == LayoutParams.MATCH_PARENT) {
                    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
                            getMeasuredHeight() - getPaddingTop() - getPaddingBottom(),
                            MeasureSpec.EXACTLY);
                } else {
                    childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec,
                            getPaddingTop() + getPaddingBottom(),
                            lp.height);
                }

                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
            }
        }

        mMatchParentChildren.clear();
    }
}
Loading