Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added an alternate range selection mode #91

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
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
24 changes: 23 additions & 1 deletion app/src/main/java/com/appeaser/sublimepicker/Sampler.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import android.util.Pair;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
Expand All @@ -52,7 +53,7 @@ public class Sampler extends AppCompatActivity {
ImageView ivLaunchPicker;

// SublimePicker options
CheckBox cbDatePicker, cbTimePicker, cbRecurrencePicker, cbAllowDateRangeSelection;
CheckBox cbDatePicker, cbTimePicker, cbRecurrencePicker, cbAllowDateRangeSelection, cbAlternateSelection;
RadioButton rbDatePicker, rbTimePicker, rbRecurrencePicker;

// Labels
Expand Down Expand Up @@ -137,6 +138,7 @@ public void onClick(View v) {
svMainContainer = (ScrollView) findViewById(R.id.svMainContainer);

cbAllowDateRangeSelection = (CheckBox) findViewById(R.id.cbAllowDateRangeSelection);
cbAlternateSelection = (CheckBox) findViewById(R.id.cbAlternateSelection);

llDateHolder = (LinearLayout) findViewById(R.id.llDateHolder);
llDateRangeHolder = (LinearLayout) findViewById(R.id.llDateRangeHolder);
Expand Down Expand Up @@ -222,6 +224,18 @@ public void onClick(View v) {
}
});

cbAllowDateRangeSelection.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isSelected) {
if (isSelected) {
cbAlternateSelection.setVisibility(View.VISIBLE);
} else {
cbAlternateSelection.setChecked(false);
cbAlternateSelection.setVisibility(View.GONE);
}
}
});

// restore state
dealWithSavedInstanceState(savedInstanceState);
}
Expand All @@ -232,6 +246,7 @@ void dealWithSavedInstanceState(Bundle savedInstanceState) {
cbTimePicker.setChecked(true);
cbRecurrencePicker.setChecked(true);
cbAllowDateRangeSelection.setChecked(false);
cbAlternateSelection.setChecked(false);

rbDatePicker.setChecked(true);
} else { // Restore
Expand All @@ -241,6 +256,8 @@ void dealWithSavedInstanceState(Bundle savedInstanceState) {
.setChecked(savedInstanceState.getBoolean(SS_RECURRENCE_PICKER_CHECKED));
cbAllowDateRangeSelection
.setChecked(savedInstanceState.getBoolean(SS_ALLOW_DATE_RANGE_SELECTION));
cbAlternateSelection
.setChecked(savedInstanceState.getBoolean(SS_ALLOW_ALTERNATE_DATE_SELECTION));

rbDatePicker.setVisibility(cbDatePicker.isChecked() ?
View.VISIBLE : View.GONE);
Expand Down Expand Up @@ -325,6 +342,9 @@ Pair<Boolean, SublimeOptions> getOptions() {
// Enable/disable the date range selection feature
options.setCanPickDateRange(cbAllowDateRangeSelection.isChecked());

//enable alternate date selection
options.setAlternateSelectionMode(cbAlternateSelection.isChecked());

// Example for setting date range:
// Note that you can pass a date range as the initial date params
// even if you have date-range selection disabled. In this case,
Expand Down Expand Up @@ -428,6 +448,7 @@ private SpannableStringBuilder applyBoldStyle(String text) {
final String SS_TIME_PICKER_CHECKED = "saved.state.time.picker.checked";
final String SS_RECURRENCE_PICKER_CHECKED = "saved.state.recurrence.picker.checked";
final String SS_ALLOW_DATE_RANGE_SELECTION = "saved.state.allow.date.range.selection";
final String SS_ALLOW_ALTERNATE_DATE_SELECTION = "saved.state.allow.alternate.date.selection";
final String SS_START_YEAR = "saved.state.start.year";
final String SS_START_MONTH = "saved.state.start.month";
final String SS_START_DAY = "saved.state.start.day";
Expand All @@ -449,6 +470,7 @@ protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(SS_TIME_PICKER_CHECKED, cbTimePicker.isChecked());
outState.putBoolean(SS_RECURRENCE_PICKER_CHECKED, cbRecurrencePicker.isChecked());
outState.putBoolean(SS_ALLOW_DATE_RANGE_SELECTION, cbAllowDateRangeSelection.isChecked());
outState.putBoolean(SS_ALLOW_ALTERNATE_DATE_SELECTION, cbAlternateSelection.isChecked());

int startYear = mSelectedDate != null ? mSelectedDate.getStartDate().get(Calendar.YEAR) : INVALID_VAL;
int startMonth = mSelectedDate != null ? mSelectedDate.getStartDate().get(Calendar.MONTH) : INVALID_VAL;
Expand Down
21 changes: 17 additions & 4 deletions app/src/main/res/layout/sampler.xml
Original file line number Diff line number Diff line change
Expand Up @@ -121,18 +121,31 @@
android:paddingLeft="20dp"
android:textStyle="bold"
android:textSize="@dimen/sampler_text_size" />
<LinearLayout
android:paddingLeft="20dp"
android:paddingTop="10dp"
android:paddingRight="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<CheckBox
android:id="@+id/cbAllowDateRangeSelection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="20dp"
android:text="Allow date range selection?"
android:textSize="@dimen/sampler_text_size" />

<CheckBox
android:id="@+id/cbAlternateSelection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:text="Alternate range selection"
android:textSize="@dimen/sampler_text_size" />
</LinearLayout>


<RelativeLayout
android:id="@+id/rlDateTimeRecurrenceInfo"
android:layout_width="match_parent"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ private void processOptions() {
// dateParams[2] /* day of month */,
// mOptions.canPickDateRange(),
// this);
mDatePicker.init(mOptions.getDateParams(), mOptions.canPickDateRange(), this);
mDatePicker.init(mOptions.getDateParams(), mOptions.canPickDateRange(), mOptions.isAlternateSelectionMode(),this);

long[] dateRange = mOptions.getDateRange();

Expand Down Expand Up @@ -636,7 +636,7 @@ public void onDateChanged(SublimeDatePicker view, SelectedDate selectedDate) {
//selectedDate.getStartDate().get(Calendar.MONTH),
//selectedDate.getStartDate().get(Calendar.DAY_OF_MONTH),
//mOptions.canPickDateRange(), this);
mDatePicker.init(selectedDate, mOptions.canPickDateRange(), this);
mDatePicker.init(selectedDate, mOptions.canPickDateRange(), mOptions.isAlternateSelectionMode(),this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ public Type getType() {
return compareDates(mFirstDate, mSecondDate) == 0 ? Type.SINGLE : Type.RANGE;
}

boolean isSingleDaySelected() {
return mFirstDate == mSecondDate;
}

// a & b should never be null, so don't perform a null check here.
// Let the source of error identify itself.
public static int compareDates(Calendar a, Calendar b) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ public class SublimeDatePicker extends FrameLayout {
private static final int DEFAULT_START_YEAR = 1900;
private static final int DEFAULT_END_YEAR = 2100;

private boolean isAlternateDatePicker = false;
private boolean canPickRange = false;

private Context mContext;

private SimpleDateFormat mYearFormat;
Expand Down Expand Up @@ -298,25 +301,43 @@ public void onDaySelected(DayPickerView view, Calendar day) {

boolean goToPosition = true;

// We're in Range selection mode
if (llHeaderDateRangeCont.getVisibility() == View.VISIBLE) {
// We're in Range selection mode
if (tvHeaderDateStart.isActivated()) {
if (SelectedDate.compareDates(day, mCurrentDate.getEndDate()) > 0) {
if (isAlternateDatePicker) {
if (mCurrentDate == null) {
mCurrentDate = new SelectedDate(day);
} else {
goToPosition = false;
mCurrentDate = new SelectedDate(day, mCurrentDate.getEndDate());
if (mCurrentDate.isSingleDaySelected()) { //we need to select a date range
if (SelectedDate.compareDates(day, mCurrentDate.getStartDate()) < 0) {
mCurrentDate = new SelectedDate(day, mCurrentDate.getEndDate());
} else {
if (SelectedDate.compareDates(day, mCurrentDate.getEndDate()) > 0) {
mCurrentDate = new SelectedDate(mCurrentDate.getStartDate(), day);
}
}
} else {
mCurrentDate = new SelectedDate(day);
}
}
} else if (tvHeaderDateEnd.isActivated()) {
if (SelectedDate.compareDates(day, mCurrentDate.getStartDate()) < 0) {
mCurrentDate = new SelectedDate(day);
} else {
goToPosition = false;
mCurrentDate = new SelectedDate(mCurrentDate.getStartDate(), day);
}
} else { // Should never happen
if (Config.DEBUG) {
Log.i(TAG, "onDaySelected: Neither tvDateStart, nor tvDateEnd is activated");
} else {
if (tvHeaderDateStart.isActivated()) {
if (SelectedDate.compareDates(day, mCurrentDate.getEndDate()) > 0) {
mCurrentDate = new SelectedDate(day);
} else {
goToPosition = false;
mCurrentDate = new SelectedDate(day, mCurrentDate.getEndDate());
}
} else if (tvHeaderDateEnd.isActivated()) {
if (SelectedDate.compareDates(day, mCurrentDate.getStartDate()) < 0) {
mCurrentDate = new SelectedDate(day);
} else {
goToPosition = false;
mCurrentDate = new SelectedDate(mCurrentDate.getStartDate(), day);
}
} else { // Should never happen
if (Config.DEBUG) {
Log.i(TAG, "onDaySelected: Neither tvDateStart, nor tvDateEnd is activated");
}
}
}
} else {
Expand Down Expand Up @@ -384,23 +405,25 @@ public void onYearChanged(YearPickerView view, int year) {
private final OnClickListener mOnHeaderClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
SUtils.vibrateForDatePicker(SublimeDatePicker.this);

if (v.getId() == R.id.date_picker_header_year) {
setCurrentView(VIEW_YEAR);
} else if (v.getId() == R.id.date_picker_header_date) {
setCurrentView(VIEW_MONTH_DAY);
} else if (v.getId() == R.id.tv_header_date_start) {
mCurrentlyActivatedRangeItem = RANGE_ACTIVATED_START;
tvHeaderDateStart.setActivated(true);
tvHeaderDateEnd.setActivated(false);
} else if (v.getId() == R.id.tv_header_date_end) {
mCurrentlyActivatedRangeItem = RANGE_ACTIVATED_END;
tvHeaderDateStart.setActivated(false);
tvHeaderDateEnd.setActivated(true);
} else if (v.getId() == R.id.iv_header_date_reset) {
mCurrentDate = new SelectedDate(mCurrentDate.getStartDate());
onDateChanged(true, false, true);
if (!isAlternateDatePicker) {
SUtils.vibrateForDatePicker(SublimeDatePicker.this);

if (v.getId() == R.id.date_picker_header_year) {
setCurrentView(VIEW_YEAR);
} else if (v.getId() == R.id.date_picker_header_date) {
setCurrentView(VIEW_MONTH_DAY);
} else if (v.getId() == R.id.tv_header_date_start) {
mCurrentlyActivatedRangeItem = RANGE_ACTIVATED_START;
tvHeaderDateStart.setActivated(true);
tvHeaderDateEnd.setActivated(false);
} else if (v.getId() == R.id.tv_header_date_end) {
mCurrentlyActivatedRangeItem = RANGE_ACTIVATED_END;
tvHeaderDateStart.setActivated(false);
tvHeaderDateEnd.setActivated(true);
} else if (v.getId() == R.id.iv_header_date_reset) {
mCurrentDate = new SelectedDate(mCurrentDate.getStartDate());
onDateChanged(true, false, true);
}
}
}
};
Expand Down Expand Up @@ -483,10 +506,10 @@ private void setCurrentView(int viewIndex) {
case VIEW_MONTH_DAY:
mDayPickerView.setDate(mCurrentDate);

if (mCurrentDate.getType() == SelectedDate.Type.SINGLE) {
switchToSingleDateView();
} else if (mCurrentDate.getType() == SelectedDate.Type.RANGE) {
if (canPickRange) {
switchToDateRangeView();
} else {
switchToSingleDateView();
}

if (mCurrentView != viewIndex) {
Expand Down Expand Up @@ -520,17 +543,19 @@ private void setCurrentView(int viewIndex) {
* @param callback How user is notified date is changed by
* user, can be null.
*/


//public void init(int year, int monthOfYear, int dayOfMonth, boolean canPickRange,
public void init(SelectedDate selectedDate, boolean canPickRange,
public void init(SelectedDate selectedDate, boolean canPickRange, boolean isMultipleDayPicker,
SublimeDatePicker.OnDateChangedListener callback) {
//mCurrentDate.set(Calendar.YEAR, year);
//mCurrentDate.set(Calendar.MONTH, monthOfYear);
//mCurrentDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
mCurrentDate = new SelectedDate(selectedDate);

this.canPickRange = canPickRange;
this.isAlternateDatePicker = isMultipleDayPicker;
mDayPickerView.setCanPickRange(canPickRange);
mDateChangedListener = callback;

onDateChanged(false, false, true);
}

Expand Down Expand Up @@ -582,10 +607,10 @@ private void updateHeaderViews() {
+ mCurrentDate.getSecondDate().getTimeInMillis());
}

if (mCurrentDate.getType() == SelectedDate.Type.SINGLE) {
switchToSingleDateView();
} else if (mCurrentDate.getType() == SelectedDate.Type.RANGE) {
if (canPickRange ) {
switchToDateRangeView();
} else {
switchToSingleDateView();
}
}

Expand All @@ -609,8 +634,13 @@ private void switchToDateRangeView() {
ivHeaderDateReset.setVisibility(View.VISIBLE);
llHeaderDateRangeCont.setVisibility(View.VISIBLE);

tvHeaderDateStart.setActivated(mCurrentlyActivatedRangeItem == RANGE_ACTIVATED_START);
tvHeaderDateEnd.setActivated(mCurrentlyActivatedRangeItem == RANGE_ACTIVATED_END);
if (isAlternateDatePicker) {
tvHeaderDateStart.setActivated(true);
tvHeaderDateEnd.setActivated(true);
} else {
tvHeaderDateStart.setActivated(mCurrentlyActivatedRangeItem == RANGE_ACTIVATED_START);
tvHeaderDateEnd.setActivated(mCurrentlyActivatedRangeItem == RANGE_ACTIVATED_END);
}
}

public SelectedDate getSelectedDate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ public enum Picker {DATE_PICKER, TIME_PICKER, REPEAT_OPTION_PICKER, INVALID}
// Allow date range selection
private boolean mCanPickDateRange;

//allow alternate selection mode
private boolean isAlternateSelection;

// Defaults
private Picker mPickerToShow = Picker.DATE_PICKER;

Expand Down Expand Up @@ -313,6 +316,15 @@ public boolean canPickDateRange() {
return mCanPickDateRange;
}

public SublimeOptions setAlternateSelectionMode(boolean isAlternateSelection) {
this.isAlternateSelection = isAlternateSelection;
return this;
}

public boolean isAlternateSelectionMode() {
return isAlternateSelection;
}

@Override
public int describeContents() {
return 0;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.appeaser.sublimepickerlibrary.utilities;

import com.appeaser.sublimepickerlibrary.BuildConfig;

/**
* Created by Admin on 13/02/2016.
*/
public class Config {

public static final boolean DEBUG = false;
public static final boolean DEBUG = BuildConfig.DEBUG;

@SuppressWarnings("unused")
public static final int DEBUG_VERSION = 2;
Expand Down