Adding getter/setter for all public attributes in CalendarView.
bug:6094713
Change-Id: Iff4a1d903d597ae8a3d74a4e4734376acca417f3
diff --git a/api/current.txt b/api/current.txt
index cce28a4..a0d2bd0 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -26093,17 +26093,36 @@
ctor public CalendarView(android.content.Context, android.util.AttributeSet);
ctor public CalendarView(android.content.Context, android.util.AttributeSet, int);
method public long getDate();
+ method public int getDateTextAppearance();
method public int getFirstDayOfWeek();
+ method public int getFocusedMonthDateColor();
method public long getMaxDate();
method public long getMinDate();
+ method public android.graphics.drawable.Drawable getSelectedDateVerticalBar();
+ method public int getSelectedWeekBackgroundColor();
method public boolean getShowWeekNumber();
+ method public int getShownWeekCount();
+ method public int getUnfocusedMonthDateColor();
+ method public int getWeekDayTextAppearance();
+ method public int getWeekNumberColor();
+ method public int getWeekSeparatorLineColor();
method public void setDate(long);
method public void setDate(long, boolean, boolean);
+ method public void setDateTextAppearance(int);
method public void setFirstDayOfWeek(int);
+ method public void setFocusedMonthDateColor(int);
method public void setMaxDate(long);
method public void setMinDate(long);
method public void setOnDateChangeListener(android.widget.CalendarView.OnDateChangeListener);
+ method public void setSelectedDateVerticalBar(int);
+ method public void setSelectedDateVerticalBar(android.graphics.drawable.Drawable);
+ method public void setSelectedWeekBackgroundColor(int);
method public void setShowWeekNumber(boolean);
+ method public void setShownWeekCount(int);
+ method public void setUnfocusedMonthDateColor(int);
+ method public void setWeekDayTextAppearance(int);
+ method public void setWeekNumberColor(int);
+ method public void setWeekSeparatorLineColor(int);
}
public static abstract interface CalendarView.OnDateChangeListener {
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index 85252af..2a74f6a 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -154,21 +154,25 @@
private final int mWeekSeperatorLineWidth;
- private final int mDateTextSize;
+ private int mDateTextSize;
- private final Drawable mSelectedDateVerticalBar;
+ private Drawable mSelectedDateVerticalBar;
private final int mSelectedDateVerticalBarWidth;
- private final int mSelectedWeekBackgroundColor;
+ private int mSelectedWeekBackgroundColor;
- private final int mFocusedMonthDateColor;
+ private int mFocusedMonthDateColor;
- private final int mUnfocusedMonthDateColor;
+ private int mUnfocusedMonthDateColor;
- private final int mWeekSeparatorLineColor;
+ private int mWeekSeparatorLineColor;
- private final int mWeekNumberColor;
+ private int mWeekNumberColor;
+
+ private int mWeekDayTextAppearanceResId;
+
+ private int mDateTextAppearanceResId;
/**
* The top offset of the weeks list.
@@ -366,15 +370,11 @@
mSelectedDateVerticalBar = attributesArray.getDrawable(
R.styleable.CalendarView_selectedDateVerticalBar);
- int dateTextAppearanceResId= attributesArray.getResourceId(
+ mDateTextAppearanceResId = attributesArray.getResourceId(
R.styleable.CalendarView_dateTextAppearance, R.style.TextAppearance_Small);
- TypedArray dateTextAppearance = context.obtainStyledAttributes(dateTextAppearanceResId,
- com.android.internal.R.styleable.TextAppearance);
- mDateTextSize = dateTextAppearance.getDimensionPixelSize(
- R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE);
- dateTextAppearance.recycle();
+ updateDateTextSize();
- int weekDayTextAppearanceResId = attributesArray.getResourceId(
+ mWeekDayTextAppearanceResId = attributesArray.getResourceId(
R.styleable.CalendarView_weekDayTextAppearance,
DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
attributesArray.recycle();
@@ -400,7 +400,7 @@
mDayNamesHeader = (ViewGroup) content.findViewById(com.android.internal.R.id.day_names);
mMonthName = (TextView) content.findViewById(com.android.internal.R.id.month_name);
- setUpHeader(weekDayTextAppearanceResId);
+ setUpHeader();
setUpListView();
setUpAdapter();
@@ -417,6 +417,235 @@
invalidate();
}
+ /**
+ * Sets the number of weeks to be shown.
+ *
+ * @param count The shown week count.
+ */
+ public void setShownWeekCount(int count) {
+ if (mShownWeekCount != count) {
+ mShownWeekCount = count;
+ invalidate();
+ }
+ }
+
+ /**
+ * Gets the number of weeks to be shown.
+ *
+ * @return The shown week count.
+ */
+ public int getShownWeekCount() {
+ return mShownWeekCount;
+ }
+
+ /**
+ * Sets the background color for the selected week.
+ *
+ * @param color The week background color.
+ */
+ public void setSelectedWeekBackgroundColor(int color) {
+ if (mSelectedWeekBackgroundColor != color) {
+ mSelectedWeekBackgroundColor = color;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasSelectedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the background color for the selected week.
+ *
+ * @return The week background color.
+ */
+ public int getSelectedWeekBackgroundColor() {
+ return mSelectedWeekBackgroundColor;
+ }
+
+ /**
+ * Sets the color for the dates of the focused month.
+ *
+ * @param color The focused month date color.
+ */
+ public void setFocusedMonthDateColor(int color) {
+ if (mFocusedMonthDateColor != color) {
+ mFocusedMonthDateColor = color;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasFocusedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the color for the dates in the focused month.
+ *
+ * @return The focused month date color.
+ */
+ public int getFocusedMonthDateColor() {
+ return mFocusedMonthDateColor;
+ }
+
+ /**
+ * Sets the color for the dates of a not focused month.
+ *
+ * @param color A not focused month date color.
+ */
+ public void setUnfocusedMonthDateColor(int color) {
+ if (mUnfocusedMonthDateColor != color) {
+ mUnfocusedMonthDateColor = color;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasUnfocusedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the color for the dates in a not focused month.
+ *
+ * @return A not focused month date color.
+ */
+ public int getUnfocusedMonthDateColor() {
+ return mFocusedMonthDateColor;
+ }
+
+ /**
+ * Sets the color for the week numbers.
+ *
+ * @param color The week number color.
+ */
+ public void setWeekNumberColor(int color) {
+ if (mWeekNumberColor != color) {
+ mWeekNumberColor = color;
+ if (mShowWeekNumber) {
+ invalidateAllWeekViews();
+ }
+ }
+ }
+
+ /**
+ * Gets the color for the week numbers.
+ *
+ * @return The week number color.
+ */
+ public int getWeekNumberColor() {
+ return mWeekNumberColor;
+ }
+
+ /**
+ * Sets the color for the separator line between weeks.
+ *
+ * @param color The week separator color.
+ */
+ public void setWeekSeparatorLineColor(int color) {
+ if (mWeekSeparatorLineColor != color) {
+ mWeekSeparatorLineColor = color;
+ invalidateAllWeekViews();
+ }
+ }
+
+ /**
+ * Gets the color for the separator line between weeks.
+ *
+ * @return The week separator color.
+ */
+ public int getWeekSeparatorLineColor() {
+ return mWeekSeparatorLineColor;
+ }
+
+ /**
+ * Sets the drawable for the vertical bar shown at the beginning and at
+ * the end of the selected date.
+ *
+ * @param resourceId The vertical bar drawable resource id.
+ */
+ public void setSelectedDateVerticalBar(int resourceId) {
+ Drawable drawable = getResources().getDrawable(resourceId);
+ setSelectedDateVerticalBar(drawable);
+ }
+
+ /**
+ * Sets the drawable for the vertical bar shown at the beginning and at
+ * the end of the selected date.
+ *
+ * @param drawable The vertical bar drawable.
+ */
+ public void setSelectedDateVerticalBar(Drawable drawable) {
+ if (mSelectedDateVerticalBar != drawable) {
+ mSelectedDateVerticalBar = drawable;
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ WeekView weekView = (WeekView) mListView.getChildAt(i);
+ if (weekView.mHasSelectedDay) {
+ weekView.invalidate();
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the drawable for the vertical bar shown at the beginning and at
+ * the end of the selected date.
+ *
+ * @return The vertical bar drawable.
+ */
+ public Drawable getSelectedDateVerticalBar() {
+ return mSelectedDateVerticalBar;
+ }
+
+ /**
+ * Sets the text appearance for the week day abbreviation of the calendar header.
+ *
+ * @param resourceId The text appearance resource id.
+ */
+ public void setWeekDayTextAppearance(int resourceId) {
+ if (mWeekDayTextAppearanceResId != resourceId) {
+ mWeekDayTextAppearanceResId = resourceId;
+ setUpHeader();
+ }
+ }
+
+ /**
+ * Gets the text appearance for the week day abbreviation of the calendar header.
+ *
+ * @return The text appearance resource id.
+ */
+ public int getWeekDayTextAppearance() {
+ return mWeekDayTextAppearanceResId;
+ }
+
+ /**
+ * Sets the text appearance for the calendar dates.
+ *
+ * @param resourceId The text appearance resource id.
+ */
+ public void setDateTextAppearance(int resourceId) {
+ if (mDateTextAppearanceResId != resourceId) {
+ mDateTextAppearanceResId = resourceId;
+ updateDateTextSize();
+ invalidateAllWeekViews();
+ }
+ }
+
+ /**
+ * Gets the text appearance for the calendar dates.
+ *
+ * @return The text appearance resource id.
+ */
+ public int getDateTextAppearance() {
+ return mDateTextAppearanceResId;
+ }
+
@Override
public void setEnabled(boolean enabled) {
mListView.setEnabled(enabled);
@@ -545,7 +774,7 @@
}
mShowWeekNumber = showWeekNumber;
mAdapter.notifyDataSetChanged();
- setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+ setUpHeader();
}
/**
@@ -594,7 +823,7 @@
mFirstDayOfWeek = firstDayOfWeek;
mAdapter.init();
mAdapter.notifyDataSetChanged();
- setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+ setUpHeader();
}
/**
@@ -655,6 +884,25 @@
goTo(mTempDate, animate, true, center);
}
+ private void updateDateTextSize() {
+ TypedArray dateTextAppearance = getContext().obtainStyledAttributes(
+ mDateTextAppearanceResId, R.styleable.TextAppearance);
+ mDateTextSize = dateTextAppearance.getDimensionPixelSize(
+ R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE);
+ dateTextAppearance.recycle();
+ }
+
+ /**
+ * Invalidates all week views.
+ */
+ private void invalidateAllWeekViews() {
+ final int childCount = mListView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View view = mListView.getChildAt(i);
+ view.invalidate();
+ }
+ }
+
/**
* Sets the current locale.
*
@@ -727,7 +975,7 @@
/**
* Sets up the strings to be used by the header.
*/
- private void setUpHeader(int weekDayTextAppearanceResId) {
+ private void setUpHeader() {
mDayLabels = new String[mDaysPerWeek];
for (int i = mFirstDayOfWeek, count = mFirstDayOfWeek + mDaysPerWeek; i < count; i++) {
int calendarDay = (i > Calendar.SATURDAY) ? i - Calendar.SATURDAY : i;
@@ -743,8 +991,8 @@
}
for (int i = 1, count = mDayNamesHeader.getChildCount(); i < count; i++) {
label = (TextView) mDayNamesHeader.getChildAt(i);
- if (weekDayTextAppearanceResId > -1) {
- label.setTextAppearance(mContext, weekDayTextAppearanceResId);
+ if (mWeekDayTextAppearanceResId > -1) {
+ label.setTextAppearance(mContext, mWeekDayTextAppearanceResId);
}
if (i < mDaysPerWeek + 1) {
label.setText(mDayLabels[i - 1]);
@@ -1198,6 +1446,12 @@
// Quick lookup for checking which days are in the focus month
private boolean[] mFocusDay;
+ // Whether this view has a focused day.
+ private boolean mHasFocusedDay;
+
+ // Whether this view has only focused days.
+ private boolean mHasUnfocusedDay;
+
// The first day displayed by this item
private Calendar mFirstDay;
@@ -1235,11 +1489,8 @@
public WeekView(Context context) {
super(context);
- mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView
- .getPaddingBottom()) / mShownWeekCount;
-
// Sets up any standard paints that will be used
- setPaintProperties();
+ initilaizePaints();
}
/**
@@ -1281,8 +1532,12 @@
mFirstDay = (Calendar) mTempDate.clone();
mMonthOfFirstWeekDay = mTempDate.get(Calendar.MONTH);
+ mHasUnfocusedDay = true;
for (; i < mNumCells; i++) {
- mFocusDay[i] = (mTempDate.get(Calendar.MONTH) == focusedMonth);
+ final boolean isFocusedDay = (mTempDate.get(Calendar.MONTH) == focusedMonth);
+ mFocusDay[i] = isFocusedDay;
+ mHasFocusedDay |= isFocusedDay;
+ mHasUnfocusedDay &= !isFocusedDay;
// do not draw dates outside the valid range to avoid user confusion
if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) {
mDayNumbers[i] = "";
@@ -1302,18 +1557,15 @@
}
/**
- * Sets up the text and style properties for painting.
+ * Initialize the paint isntances.
*/
- private void setPaintProperties() {
+ private void initilaizePaints() {
mDrawPaint.setFakeBoldText(false);
mDrawPaint.setAntiAlias(true);
- mDrawPaint.setTextSize(mDateTextSize);
mDrawPaint.setStyle(Style.FILL);
mMonthNumDrawPaint.setFakeBoldText(true);
mMonthNumDrawPaint.setAntiAlias(true);
- mMonthNumDrawPaint.setTextSize(mDateTextSize);
- mMonthNumDrawPaint.setColor(mFocusedMonthDateColor);
mMonthNumDrawPaint.setStyle(Style.FILL);
mMonthNumDrawPaint.setTextAlign(Align.CENTER);
}
@@ -1369,7 +1621,7 @@
@Override
protected void onDraw(Canvas canvas) {
drawBackground(canvas);
- drawWeekNumbers(canvas);
+ drawWeekNumbersAndDates(canvas);
drawWeekSeparators(canvas);
drawSelectedDateVerticalBars(canvas);
}
@@ -1401,12 +1653,13 @@
*
* @param canvas The canvas to draw on
*/
- private void drawWeekNumbers(Canvas canvas) {
+ private void drawWeekNumbersAndDates(Canvas canvas) {
float textHeight = mDrawPaint.getTextSize();
int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth;
int nDays = mNumCells;
mDrawPaint.setTextAlign(Align.CENTER);
+ mDrawPaint.setTextSize(mDateTextSize);
int i = 0;
int divisor = 2 * nDays;
if (mShowWeekNumber) {
@@ -1487,6 +1740,8 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView
+ .getPaddingBottom()) / mShownWeekCount;
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight);
}
}
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 9375730..7de32f8 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3593,15 +3593,15 @@
<attr name="shownWeekCount" format="integer"/>
<!-- The background color for the selected week. -->
<attr name="selectedWeekBackgroundColor" format="color|reference" />
- <!-- The color for the dates of the selected month. -->
+ <!-- The color for the dates of the focused month. -->
<attr name="focusedMonthDateColor" format="color|reference" />
<!-- The color for the dates of an unfocused month. -->
<attr name="unfocusedMonthDateColor" format="color|reference" />
<!-- The color for the week numbers. -->
<attr name="weekNumberColor" format="color|reference" />
- <!-- The color for the sepatator line between weeks. -->
+ <!-- The color for the separator line between weeks. -->
<attr name="weekSeparatorLineColor" format="color|reference" />
- <!-- Drawable for the vertical bar shown at the beggining and at the end of a selected date. -->
+ <!-- Drawable for the vertical bar shown at the beginning and at the end of the selected date. -->
<attr name="selectedDateVerticalBar" format="reference" />
<!-- The text appearance for the week day abbreviation of the calendar header. -->
<attr name="weekDayTextAppearance" format="reference" />