Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Changed disabled days to SparseArray from HashMap
  • Loading branch information
TylerMcCraw committed Dec 29, 2015
commit cbbfa6ed6e2b9e376247e8d884db0caaaf751db7
11 changes: 11 additions & 0 deletions library/src/main/java/com/codetroopers/betterpickers/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,15 @@ public static ObjectAnimator getPulseAnimator(View labelToAnimate, float decreas

return pulseAnimator;
}

/**
* Return key formatted for sparse array of disabled days
* @param year year
* @param month month
* @param day day
* @return key as int formatted as yyyyMMdd
*/
public static int formatDisabledDayForKey(int year, int month, int day) {
return year*10000 + month*100 + day;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@

package com.codetroopers.betterpickers.calendardatepicker;

import android.util.SparseArray;

import com.codetroopers.betterpickers.calendardatepicker.CalendarDatePickerDialogFragment.OnDateChangedListener;
import com.codetroopers.betterpickers.calendardatepicker.MonthAdapter.CalendarDay;

import java.util.HashMap;

/**
* Controller class to communicate among the various components of the date picker dialog.
*/
Expand All @@ -42,7 +42,7 @@ interface CalendarDatePickerController {

CalendarDay getMaxDate();

HashMap<String, CalendarDay> getDisabledDays();
SparseArray<CalendarDay> getDisabledDays();

void tryVibrate();
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import android.support.v4.app.DialogFragment;
import android.text.format.DateUtils;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
Expand All @@ -46,7 +47,6 @@

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
Expand Down Expand Up @@ -104,7 +104,7 @@ public class CalendarDatePickerDialogFragment extends DialogFragment implements
private CalendarDay mMinDate = DEFAULT_START_DATE;
private CalendarDay mMaxDate = DEFAULT_END_DATE;

private HashMap<String, CalendarDay> mDisabledDays;
private SparseArray<CalendarDay> mDisabledDays;

private HapticFeedbackController mHapticFeedbackController;

Expand Down Expand Up @@ -217,7 +217,7 @@ public void onSaveInstanceState(Bundle outState) {
outState.putInt(KEY_LIST_POSITION_OFFSET, mYearPickerView.getFirstPositionOffset());
}
outState.putInt(KEY_LIST_POSITION, listPosition);
outState.putSerializable(KEY_DISABLED_DAYS, mDisabledDays);
outState.putSparseParcelableArray(KEY_DISABLED_DAYS, mDisabledDays);
}

@Override
Expand Down Expand Up @@ -249,7 +249,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
listPosition = savedInstanceState.getInt(KEY_LIST_POSITION);
listPositionOffset = savedInstanceState.getInt(KEY_LIST_POSITION_OFFSET);
mStyleResId = savedInstanceState.getInt(KEY_THEME);
mDisabledDays = (HashMap<String, CalendarDay>) savedInstanceState.getSerializable(KEY_DISABLED_DAYS);
mDisabledDays = savedInstanceState.getSparseParcelableArray(KEY_DISABLED_DAYS);
}

final Activity activity = getActivity();
Expand Down Expand Up @@ -468,10 +468,10 @@ public void setDateRange(@Nullable CalendarDay startDate, @Nullable CalendarDay
* Sets a map of disabled days to declare as unselectable by the user. These days can be styled
* in a different way than the currently selected day
*
* @param disabledDays hash map of key date string (yyyyMMdd) to a calendar day object
* @param disabledDays sparse array of key date int (yyyyMMdd) to a calendar day object
* @throws IllegalArgumentException in case the end date is smaller than the start date
*/
public void setDisabledDays(@NonNull HashMap<String, CalendarDay> disabledDays) {
public void setDisabledDays(@NonNull SparseArray<CalendarDay> disabledDays) {
mDisabledDays = disabledDays;

if (mDayPickerView != null) {
Expand Down Expand Up @@ -559,7 +559,7 @@ public CalendarDay getMaxDate() {
}

@Override
public HashMap<String, CalendarDay> getDisabledDays() {
public SparseArray<CalendarDay> getDisabledDays() {
return mDisabledDays;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.text.format.Time;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.LayoutParams;
import android.widget.BaseAdapter;

import com.codetroopers.betterpickers.Utils;
import com.codetroopers.betterpickers.calendardatepicker.MonthView.OnDayClickListener;

import java.util.Calendar;
Expand Down Expand Up @@ -55,10 +58,12 @@ public void setThemeDark(TypedArray mThemeColors) {
/**
* A convenience class to represent a specific date.
*/
public static class CalendarDay implements Comparable<CalendarDay> {
public static class CalendarDay implements Comparable<CalendarDay>, Parcelable {

private Calendar calendar;
private long calendarTimeInMillis;
private Time time;
private long timeInMillis;
int year;
int month;
int day;
Expand All @@ -81,6 +86,18 @@ public CalendarDay(int year, int month, int day) {
setDay(year, month, day);
}

public CalendarDay(Parcel in) {
this.calendarTimeInMillis = in.readLong();
this.calendar = Calendar.getInstance();
this.calendar.setTimeInMillis(this.calendarTimeInMillis);
this.timeInMillis = in.readLong();
this.time = new Time();
this.time.set(this.timeInMillis);
this.year = in.readInt();
this.month = in.readInt();
this.day = in.readInt();
}

public void set(CalendarDay date) {
year = date.year;
month = date.month;
Expand Down Expand Up @@ -132,6 +149,34 @@ public int compareTo(@NonNull CalendarDay another) {
}
return 1;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
calendarTimeInMillis = calendar.getTimeInMillis();
dest.writeLong(calendarTimeInMillis);
timeInMillis = time.toMillis(false);

dest.writeInt(year);
dest.writeInt(month);
dest.writeInt(day);
}

public static final Parcelable.Creator<CalendarDay> CREATOR
= new Parcelable.Creator<CalendarDay>() {

public CalendarDay createFromParcel(Parcel in) {
return new CalendarDay(in);
}

public CalendarDay[] newArray(int size) {
return new CalendarDay[size];
}
};
}

public MonthAdapter(Context context, CalendarDatePickerController controller) {
Expand Down Expand Up @@ -280,8 +325,8 @@ private boolean isDayDisabled(CalendarDay day) {
if (mController.getDisabledDays() == null) {
return false;
}
String dayKey = String.format("%d%d%d", day.year, day.month, day.day);
return mController.getDisabledDays().containsKey(dayKey);
return mController.getDisabledDays()
.indexOfKey(Utils.formatDisabledDayForKey(day.year, day.month, day.day)) > 0;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
Expand Down Expand Up @@ -166,7 +167,7 @@ public abstract class MonthView extends View {
// Which day is selected [0-6] or -1 if no day is selected
protected int mSelectedDay = -1;
// Which days are disabled in the view so that they are unselectable
protected HashMap<String, MonthAdapter.CalendarDay> mDisabledDays;
protected SparseArray<CalendarDay> mDisabledDays;
// Which day is today [0-6] or -1 if no day is today
protected int mToday = DEFAULT_SELECTED_DAY;
// Which day of the week to start on [0-6]
Expand Down Expand Up @@ -413,7 +414,7 @@ public void setMonthParams(HashMap<String, Integer> params) {
mTouchHelper.invalidateRoot();
}

public void setDisabledDays(@NonNull HashMap<String, CalendarDay> disabledDays) {
public void setDisabledDays(@NonNull SparseArray<CalendarDay> disabledDays) {
mDisabledDays = disabledDays;
}

Expand Down Expand Up @@ -498,9 +499,10 @@ protected void drawMonthNums(Canvas canvas) {
int startY = y - yRelativeToDay;
int stopY = startY + mRowHeight;

String disabledDayKey = String.format("%d%d%d", mYear, mMonth, dayNumber);
int disabledDayKey = Utils.formatDisabledDayForKey(mYear, mMonth, dayNumber);
// A day is enabled if it is in range and is not explicitly set as disabled
boolean dayIsEnabled = isDayInRange(dayNumber)
&& (mDisabledDays != null && !mDisabledDays.containsKey(disabledDayKey));
&& (mDisabledDays != null && mDisabledDays.indexOfKey(disabledDayKey) < 0);
drawMonthDay(canvas, mYear, mMonth, dayNumber, x, y, startX, stopX, startY, stopY, dayIsEnabled);

j++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import android.content.Context;
import android.graphics.Canvas;

import com.codetroopers.betterpickers.Utils;

/**
* A calendar-like view displaying a specified month and the appropriate selectable day numbers within the specified
* month.
Expand All @@ -36,9 +38,10 @@ public void drawMonthDay(Canvas canvas, int year, int month, int day,
canvas.drawCircle(x, y - (MINI_DAY_NUMBER_TEXT_SIZE / 3), DAY_SELECTED_CIRCLE_SIZE,
mSelectedCirclePaint);
}
String disabledDayKey = String.format("%d%d%d", year, month, day);
int disabledDayKey = Utils.formatDisabledDayForKey(year, month, day);
// If this day is disabled, color the background
if (mDisabledDays != null
&& mDisabledDays.containsKey(disabledDayKey)) {
&& mDisabledDays.indexOfKey(disabledDayKey) > 0) {
canvas.drawRect(startX, startY, stopX, stopY, mDisabledDaySquarePaint);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.codetroopers.betterpickers.Utils;
import com.codetroopers.betterpickers.calendardatepicker.CalendarDatePickerDialogFragment;
import com.codetroopers.betterpickers.calendardatepicker.MonthAdapter;
import com.codetroopers.betterpickers.sample.R;
Expand Down Expand Up @@ -54,8 +56,8 @@ public void onClick(View v) {
now.getMonthOfYear() + 2, now.getDayOfMonth());

// Initialize disabled days list
// Which days are disabled (key is formatted as a date in the format "yyyyMMdd")
HashMap<String, MonthAdapter.CalendarDay> disabledDays = new HashMap<>();
// Disabled days are located at a formatted location in the format "yyyyMMdd"
SparseArray<MonthAdapter.CalendarDay> disabledDays = new SparseArray<>();
Calendar startCal = Calendar.getInstance();
startCal.setTimeInMillis(minDay.getDateInMillis());
Calendar endCal = Calendar.getInstance();
Expand All @@ -64,9 +66,9 @@ public void onClick(View v) {
while (startCal.before(endCal)) {
if (startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
|| startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
disabledDays.put(String.format("%d%d%d", startCal.get(Calendar.YEAR),
startCal.get(Calendar.MONTH), startCal.get(Calendar.DAY_OF_MONTH)),
new MonthAdapter.CalendarDay(startCal));
int key = Utils.formatDisabledDayForKey(startCal.get(Calendar.YEAR),
startCal.get(Calendar.MONTH), startCal.get(Calendar.DAY_OF_MONTH));
disabledDays.put(key, new MonthAdapter.CalendarDay(startCal));
}
startCal.add(Calendar.DATE, 1);
}
Expand Down