From 20d21156ef1f95ca04fd80b040d0ceaa13fd86db Mon Sep 17 00:00:00 2001 From: Christian Grasser Date: Sat, 13 Oct 2018 21:54:48 +0200 Subject: [PATCH] Added new option by month last and others updates Updated to support API 27, build tools 28.0.3, removed allowBackup, added new BYMONTHLAST option, updated MAX interval to 999, added MINUTELY and HOURLY, AM/PM corrections --- sublimepickerlibrary/.gitignore | 1 + sublimepickerlibrary/build.gradle | 25 ++++++++----- .../src/main/AndroidManifest.xml | 7 +--- .../sublimepickerlibrary/SublimePicker.java | 18 +++++++++ .../datepicker/CircularIndicatorTextView.java | 3 +- .../recurrencepicker/EventRecurrence.java | 22 ++++++++++- .../EventRecurrenceFormatter.java | 10 +++++ .../RecurrenceOptionCreator.java | 35 +++++++++++++++++- .../SublimeRecurrencePicker.java | 16 +++++++- .../utilities/SUtils.java | 1 + .../res/layout-land/time_picker_layout.xml | 4 ++ .../res/layout/recurrence_options_menu.xml | 14 +++++++ .../src/main/res/layout/recurrence_picker.xml | 10 ++++- .../main/res/layout/time_picker_header.xml | 5 ++- .../src/main/res/values/colors.xml | 2 + .../src/main/res/values/strings.xml | 3 ++ .../src/main/res/values/styles.xml | 5 ++- sublimepickerlibrary/sublimepickerlibrary.iml | 37 ++++++------------- 18 files changed, 166 insertions(+), 52 deletions(-) diff --git a/sublimepickerlibrary/.gitignore b/sublimepickerlibrary/.gitignore index 796b96d..e8fa30f 100644 --- a/sublimepickerlibrary/.gitignore +++ b/sublimepickerlibrary/.gitignore @@ -1 +1,2 @@ /build +*.iml diff --git a/sublimepickerlibrary/build.gradle b/sublimepickerlibrary/build.gradle index 06c228d..94b14ff 100644 --- a/sublimepickerlibrary/build.gradle +++ b/sublimepickerlibrary/build.gradle @@ -41,15 +41,20 @@ ext { } android { - compileSdkVersion 25 - buildToolsVersion "23.0.3" + compileSdkVersion 27 + buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 14 - targetSdkVersion 25 + targetSdkVersion 27 versionCode 4 versionName "2.1.4" } + + lintOptions { + disable 'Instantiatable' + } + buildTypes { release { minifyEnabled false @@ -64,15 +69,15 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:23.2.1' - compile 'com.android.support:support-v4:23.2.1' - compile 'com.android.support:gridlayout-v7:23.2.1' - compile 'com.android.support:support-annotations:23.2.1' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'com.android.support:support-v4:27.1.0' + implementation 'com.android.support:gridlayout-v7:27.1.0' + implementation 'com.android.support:support-annotations:27.1.0' // For IconicDrawable - No download needed (see https://github.com/mikepenz/Android-Iconics) - compile "com.mikepenz:iconics-core:2.8.2@aar" - compile 'com.mikepenz:community-material-typeface:1.7.22.1@aar' + implementation "com.mikepenz:iconics-core:2.8.2@aar" + implementation 'com.mikepenz:community-material-typeface:1.7.22.1@aar' } apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' diff --git a/sublimepickerlibrary/src/main/AndroidManifest.xml b/sublimepickerlibrary/src/main/AndroidManifest.xml index f7300a6..22a1e0a 100644 --- a/sublimepickerlibrary/src/main/AndroidManifest.xml +++ b/sublimepickerlibrary/src/main/AndroidManifest.xml @@ -1,8 +1,5 @@ - + - - - + diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/SublimePicker.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/SublimePicker.java index 7b8ee55..d04fa51 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/SublimePicker.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/SublimePicker.java @@ -31,9 +31,11 @@ import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import com.appeaser.sublimepickerlibrary.common.ButtonHandler; import com.appeaser.sublimepickerlibrary.datepicker.SelectedDate; @@ -618,6 +620,22 @@ private void processOptions() { mTimePicker.setIs24HourView(mOptions.is24HourView()); mTimePicker.setValidationCallback(this); + // if AM/PM we need to move the icon to the left, because we don't have enough space + // to show it on the right + if(ivRecurrenceOptionsTP.getLayoutParams() instanceof RelativeLayout.LayoutParams) { + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ivRecurrenceOptionsTP.getLayoutParams(); + if (!mOptions.is24HourView()) { + params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); + } else { + params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + if (SUtils.isApi_17_OrHigher()) { + params.addRule(RelativeLayout.ALIGN_PARENT_END); + } + } + ivRecurrenceOptionsTP.setLayoutParams(params); //causes layout update + } + + ivRecurrenceOptionsTP.setVisibility(mRecurrencePickerEnabled ? View.VISIBLE : View.GONE); } else { diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/datepicker/CircularIndicatorTextView.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/datepicker/CircularIndicatorTextView.java index f0d8d0a..ebb17e3 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/datepicker/CircularIndicatorTextView.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/datepicker/CircularIndicatorTextView.java @@ -17,6 +17,7 @@ package com.appeaser.sublimepickerlibrary.datepicker; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; @@ -32,7 +33,7 @@ * Indicator used for selected year in YearPickerView * Needs fixing. */ -class CircularIndicatorTextView extends TextView { +public class CircularIndicatorTextView extends TextView { private static final int SELECTED_CIRCLE_ALPHA = 60; private final Paint mCirclePaint = new Paint(); diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrence.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrence.java index 9d384fc..2e4896a 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrence.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrence.java @@ -74,6 +74,8 @@ public class EventRecurrence { public int bymonthCount; public int[] bysetpos; public int bysetposCount; + public int[] bymonthLast; + public int bymonthLastCount; /** * maps a part string to a parser object @@ -96,6 +98,7 @@ public class EventRecurrence { sParsePartMap.put("BYMONTH", new ParseByMonth()); sParsePartMap.put("BYSETPOS", new ParseBySetPos()); sParsePartMap.put("WKST", new ParseWkst()); + sParsePartMap.put("BYMONTHLAST", new ParseByMonthLast()); } /* values for bit vector that keeps track of what we have already seen */ @@ -113,6 +116,7 @@ public class EventRecurrence { private static final int PARSED_BYMONTH = 1 << 11; private static final int PARSED_BYSETPOS = 1 << 12; private static final int PARSED_WKST = 1 << 13; + private static final int PARSED_BYMONTH_LAST = 1 << 14; /** * maps a FREQ value to an integer constant @@ -392,6 +396,7 @@ public String toString() { appendNumbers(s, ";BYWEEKNO=", this.byweeknoCount, this.byweekno); appendNumbers(s, ";BYMONTH=", this.bymonthCount, this.bymonth); appendNumbers(s, ";BYSETPOS=", this.bysetposCount, this.bysetpos); + appendNumbers(s, ";BYMONTHLAST=", this.bymonthLastCount, this.bymonthLast); return s.toString(); } @@ -490,6 +495,7 @@ public boolean equals(Object obj) { arraysEqual(byyearday, byyeardayCount, er.byyearday, er.byyeardayCount) && arraysEqual(byweekno, byweeknoCount, er.byweekno, er.byweeknoCount) && arraysEqual(bymonth, bymonthCount, er.bymonth, er.bymonthCount) && + arraysEqual(bymonthLast, bymonthLastCount, er.bymonthLast, er.bymonthLastCount) && arraysEqual(bysetpos, bysetposCount, er.bysetpos, er.bysetposCount); } @@ -512,7 +518,7 @@ private void resetFields() { until = null; freq = count = interval = bysecondCount = byminuteCount = byhourCount = bydayCount = bymonthdayCount = byyeardayCount = byweeknoCount = bymonthCount = - bysetposCount = 0; + bymonthLastCount = bysetposCount = 0; } /** @@ -833,7 +839,7 @@ public int parsePart(String value, EventRecurrence er) { int[] bydayNum; int bydayCount; - if (value.indexOf(",") < 0) { + if (value.indexOf(",") < 0) { /* only one entry, skip split() overhead */ bydayCount = 1; byday = new int[1]; @@ -932,6 +938,18 @@ public int parsePart(String value, EventRecurrence er) { } } + /** + * parses BYMONTHLAST=bymolist + */ + private static class ParseByMonthLast extends PartParser { + @Override + public int parsePart(String value, EventRecurrence er) { + int[] bymonthLast = parseNumberList(value, 1, 12, false); + er.bymonthLast = bymonthLast; + er.bymonthLastCount = bymonthLast.length; + return PARSED_BYMONTH_LAST; + } + } /** * parses BYSETPOS=bysplist */ diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrenceFormatter.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrenceFormatter.java index a65c675..7950f91 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrenceFormatter.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/EventRecurrenceFormatter.java @@ -122,6 +122,16 @@ public static String getRepeatString(Context context, Resources r, EventRecurren return sb.toString(); } + if(recurrence.bymonthLastCount == 1) { + StringBuilder sb = new StringBuilder(); + sb.append(monthlyStart); + sb.append(" ("); + sb.append(r.getString(R.string.on_the_last_day_each_month)); + sb.append(")"); + sb.append(endString); + return sb.toString(); + } + return monthlyStart + endString; } case EventRecurrence.YEARLY: diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/RecurrenceOptionCreator.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/RecurrenceOptionCreator.java index 91a4dc3..9c1acd9 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/RecurrenceOptionCreator.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/RecurrenceOptionCreator.java @@ -86,7 +86,7 @@ private enum CurrentView { } // Update android:maxLength in EditText as needed - private static final int INTERVAL_MAX = 99; + private static final int INTERVAL_MAX = 999; private static final int INTERVAL_DEFAULT = 1; // Update android:maxLength in EditText as needed private static final int COUNT_MAX = 730; @@ -175,6 +175,7 @@ private enum CurrentView { private RadioGroup mMonthRepeatByRadioGroup; private RadioButton mRepeatMonthlyByNthDayOfWeek; private RadioButton mRepeatMonthlyByNthDayOfMonth; + private RadioButton mRepeatMonthlyByLastDyOfMonth; private String mMonthRepeatByDayOfWeekStr; private OnRecurrenceSetListener mRecurrenceSetListener; @@ -241,6 +242,7 @@ private class RecurrenceModel implements Parcelable { static final int MONTHLY_BY_DATE = 0; static final int MONTHLY_BY_NTH_DAY_OF_WEEK = 1; + static final int MONTHLY_BY_LAST_DAY_OF_MONTH = 2; static final int STATE_NO_RECURRENCE = 0; static final int STATE_RECURRENCE = 1; @@ -289,6 +291,12 @@ private class RecurrenceModel implements Parcelable { */ int monthlyByMonthDay; + /** + * Day of the month to repeat. Used when monthlyRepeat == + * MONTHLY_BY_LAST_DAY_OF_MONTH + */ + int monthlyByLastDayOfMonth; + /** * Day of the week to repeat. Used when monthlyRepeat == * MONTHLY_BY_NTH_DAY_OF_WEEK @@ -313,7 +321,8 @@ public String toString() { + endDate + ", endCount=" + endCount + ", weeklyByDayOfWeek=" + Arrays.toString(weeklyByDayOfWeek) + ", monthlyRepeat=" + monthlyRepeat + ", monthlyByMonthDay=" + monthlyByMonthDay + ", monthlyByDayOfWeek=" - + monthlyByDayOfWeek + ", monthlyByNthDayOfWeek=" + monthlyByNthDayOfWeek + "]"; + + monthlyByDayOfWeek + ", monthlyByNthDayOfWeek=" + monthlyByNthDayOfWeek + + ", monthlyByLastDayOfMonth=" + monthlyByLastDayOfMonth +"]"; } @Override @@ -340,6 +349,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeBooleanArray(weeklyByDayOfWeek); dest.writeInt(monthlyRepeat); dest.writeInt(monthlyByMonthDay); + dest.writeInt(monthlyByLastDayOfMonth); dest.writeInt(monthlyByDayOfWeek); dest.writeInt(monthlyByNthDayOfWeek); dest.writeInt(recurrenceState); @@ -357,6 +367,7 @@ private void readFromParcel(Parcel in) { in.readBooleanArray(weeklyByDayOfWeek); monthlyRepeat = in.readInt(); monthlyByMonthDay = in.readInt(); + monthlyByLastDayOfMonth = in.readInt(); monthlyByDayOfWeek = in.readInt(); monthlyByNthDayOfWeek = in.readInt(); recurrenceState = in.readInt(); @@ -511,6 +522,10 @@ static private void copyEventRecurrenceToModel(final EventRecurrence er, break; case EventRecurrence.MONTHLY: model.freq = RecurrenceModel.FREQ_MONTHLY; + if(er.bymonthLastCount == 1) { + model.monthlyRepeat = RecurrenceModel.MONTHLY_BY_LAST_DAY_OF_MONTH; + model.monthlyByLastDayOfMonth = er.bymonthLastCount; + } break; case EventRecurrence.YEARLY: model.freq = RecurrenceModel.FREQ_YEARLY; @@ -647,6 +662,7 @@ static private void copyModelToEventRecurrence(final RecurrenceModel model, // Weekly && monthly repeat patterns er.bydayCount = 0; er.bymonthdayCount = 0; + er.bymonthLastCount = 0; switch (model.freq) { case RecurrenceModel.FREQ_MONTHLY: @@ -671,6 +687,10 @@ static private void copyModelToEventRecurrence(final RecurrenceModel model, er.bydayCount = count; er.byday[0] = EventRecurrence.timeDay2Day(model.monthlyByDayOfWeek); er.bydayNum[0] = model.monthlyByNthDayOfWeek; + } else if(model.monthlyRepeat == RecurrenceModel.MONTHLY_BY_LAST_DAY_OF_MONTH) { + er.bymonthLastCount = 1; + er.bymonthLast = new int[1]; + er.bymonthLast[0] = model.monthlyByLastDayOfMonth; } break; case RecurrenceModel.FREQ_WEEKLY: @@ -910,6 +930,8 @@ void onChange(int v) { findViewById(R.id.repeatMonthlyByNthDayOfTheWeek); mRepeatMonthlyByNthDayOfMonth = (RadioButton) findViewById(R.id.repeatMonthlyByNthDayOfMonth); + mRepeatMonthlyByLastDyOfMonth = (RadioButton) + findViewById(R.id.repeatMonthlyByLastDayOfMonth); } public void initializeData(long currentlyChosenTime, @@ -976,6 +998,7 @@ private void togglePickerOptions() { mEndDateTextView.setEnabled(false); mRepeatMonthlyByNthDayOfWeek.setEnabled(false); mRepeatMonthlyByNthDayOfMonth.setEnabled(false); + mRepeatMonthlyByLastDyOfMonth.setEnabled(false); for (Button button : mWeekByDayButtons) { button.setEnabled(false); } @@ -992,6 +1015,7 @@ private void togglePickerOptions() { mEndDateTextView.setEnabled(true); mRepeatMonthlyByNthDayOfWeek.setEnabled(true); mRepeatMonthlyByNthDayOfMonth.setEnabled(true); + mRepeatMonthlyByLastDyOfMonth.setEnabled(true); for (Button button : mWeekByDayButtons) { button.setEnabled(true); } @@ -1176,8 +1200,13 @@ public void updateDialog() { if (mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_DATE) { mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByNthDayOfMonth); + mModel.monthlyByLastDayOfMonth = 0; } else if (mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK) { mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByNthDayOfTheWeek); + mModel.monthlyByLastDayOfMonth = 0; + } else if(mModel.monthlyRepeat == RecurrenceModel.MONTHLY_BY_LAST_DAY_OF_MONTH) { + mMonthRepeatByRadioGroup.check(R.id.repeatMonthlyByLastDayOfMonth); + mModel.monthlyByLastDayOfMonth = 1; } if (mMonthRepeatByDayOfWeekStr == null) { @@ -1379,6 +1408,8 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_DATE; } else if (checkedId == R.id.repeatMonthlyByNthDayOfTheWeek) { mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_NTH_DAY_OF_WEEK; + } else if (checkedId == R.id.repeatMonthlyByLastDayOfMonth) { + mModel.monthlyRepeat = RecurrenceModel.MONTHLY_BY_LAST_DAY_OF_MONTH; } updateDialog(); } diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/SublimeRecurrencePicker.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/SublimeRecurrencePicker.java index db235bc..d586e6e 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/SublimeRecurrencePicker.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/recurrencepicker/SublimeRecurrencePicker.java @@ -53,7 +53,7 @@ public class SublimeRecurrencePicker extends FrameLayout // format. Choosing 'CUSTOM' takes the user // to 'RecurrenceOptionCreator'. public enum RecurrenceOption { - DOES_NOT_REPEAT("DOES NOT REPEAT"), + DOES_NOT_REPEAT("DOES NOT REPEAT"), MINUTELY("MINUTELY"), HOURLY("HOURLY"), DAILY("DAILY"), WEEKLY("WEEKLY"), MONTHLY("MONTHLY"), YEARLY("YEARLY"), CUSTOM("CUSTOM..."); @@ -197,6 +197,10 @@ void initializeLayout() { (TextView) findViewById(R.id.tvChosenCustomOption)); mRepeatOptionTextViews.add( (TextView) findViewById(R.id.tvDoesNotRepeat)); + mRepeatOptionTextViews.add( + (TextView) findViewById(R.id.tvMinutely)); + mRepeatOptionTextViews.add( + (TextView) findViewById(R.id.tvHourly)); mRepeatOptionTextViews.add( (TextView) findViewById(R.id.tvDaily)); mRepeatOptionTextViews.add( @@ -264,6 +268,12 @@ void updateFlowLayout(RecurrenceOption recurrenceOption) { case DOES_NOT_REPEAT: viewIdToSelect = R.id.tvDoesNotRepeat; break; + case MINUTELY: + viewIdToSelect = R.id.tvMinutely; + break; + case HOURLY: + viewIdToSelect = R.id.tvHourly; + break; case DAILY: viewIdToSelect = R.id.tvDaily; break; @@ -342,6 +352,10 @@ public void onClick(View v) { return; } else if (v.getId() == R.id.tvDoesNotRepeat) { mCurrentRecurrenceOption = RecurrenceOption.DOES_NOT_REPEAT; + } else if (v.getId() == R.id.tvMinutely) { + mCurrentRecurrenceOption = RecurrenceOption.MINUTELY; + } else if (v.getId() == R.id.tvHourly) { + mCurrentRecurrenceOption = RecurrenceOption.HOURLY; } else if (v.getId() == R.id.tvDaily) { mCurrentRecurrenceOption = RecurrenceOption.DAILY; } else if (v.getId() == R.id.tvWeekly) { diff --git a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/utilities/SUtils.java b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/utilities/SUtils.java index eef2db1..72fd41f 100644 --- a/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/utilities/SUtils.java +++ b/sublimepickerlibrary/src/main/java/com/appeaser/sublimepickerlibrary/utilities/SUtils.java @@ -76,6 +76,7 @@ public class SUtils { public static final int CORNER_TOP_LEFT = 0x01, CORNER_TOP_RIGHT = 0x02, CORNER_BOTTOM_RIGHT = 0x04, CORNER_BOTTOM_LEFT = 0x08, CORNERS_ALL = 0x0f; + @SuppressWarnings("ResourceType") public static void initializeResources(Context context) { TypedArray a = context.obtainStyledAttributes( new int[]{R.attr.colorAccent, R.attr.colorControlHighlight, diff --git a/sublimepickerlibrary/src/main/res/layout-land/time_picker_layout.xml b/sublimepickerlibrary/src/main/res/layout-land/time_picker_layout.xml index babd49c..d71ee1e 100644 --- a/sublimepickerlibrary/src/main/res/layout-land/time_picker_layout.xml +++ b/sublimepickerlibrary/src/main/res/layout-land/time_picker_layout.xml @@ -135,6 +135,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="16dp" + android:paddingRight="16dp" + android:paddingEnd="16dp" + android:paddingLeft="16dp" + android:paddingStart="16dp" android:layout_gravity="end|right|top"/> diff --git a/sublimepickerlibrary/src/main/res/layout/recurrence_options_menu.xml b/sublimepickerlibrary/src/main/res/layout/recurrence_options_menu.xml index c1562a6..8211d15 100644 --- a/sublimepickerlibrary/src/main/res/layout/recurrence_options_menu.xml +++ b/sublimepickerlibrary/src/main/res/layout/recurrence_options_menu.xml @@ -53,6 +53,20 @@ android:layout_height="wrap_content" android:text="@string/recurrence_does_not_repeat" /> + + + + + + + \ No newline at end of file diff --git a/sublimepickerlibrary/src/main/res/values/colors.xml b/sublimepickerlibrary/src/main/res/values/colors.xml index 29f29a4..acfd61f 100644 --- a/sublimepickerlibrary/src/main/res/values/colors.xml +++ b/sublimepickerlibrary/src/main/res/values/colors.xml @@ -41,4 +41,6 @@ #ffffffff #b3ffffff + #000000 + \ No newline at end of file diff --git a/sublimepickerlibrary/src/main/res/values/strings.xml b/sublimepickerlibrary/src/main/res/values/strings.xml index eb091cf..95f87cf 100644 --- a/sublimepickerlibrary/src/main/res/values/strings.xml +++ b/sublimepickerlibrary/src/main/res/values/strings.xml @@ -147,6 +147,8 @@ repeat options does not repeat + every minute + every hour every day every week every month @@ -157,5 +159,6 @@ Previous month Next month + on the last day each month diff --git a/sublimepickerlibrary/src/main/res/values/styles.xml b/sublimepickerlibrary/src/main/res/values/styles.xml index 2fa9146..f2a5e07 100644 --- a/sublimepickerlibrary/src/main/res/values/styles.xml +++ b/sublimepickerlibrary/src/main/res/values/styles.xml @@ -74,7 +74,8 @@