diff --git a/README.md b/README.md index 67e156b..ffbccb8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # CosmoCalendar [![GitHub license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/AppliKeySolutions/CosmoCalendar/blob/master/LICENSE) -Made by [Applikey Solutions](https://applikeysolutions.com) +Made by [Applikey Solutions](https://applikeysolutions.com) and updated by Mustafa Bayram. ![](pictures/cosmo-calendar.png) @@ -23,7 +23,7 @@ Made by [Applikey Solutions](https://applikeysolutions.com) # Usage ```xml - compile 'com.github.applikeysolutions:cosmocalendar:1.0.4' + compile 'com.github.mustafabayram:CosmoCalendar:1.4' ``` # Customization diff --git a/build.gradle b/build.gradle index c1941f5..a4e6c49 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,15 @@ buildscript { repositories { jcenter() mavenCentral() + maven { + url 'https://maven.google.com/' + name 'Google' + } } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.4.2' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' } } @@ -14,6 +18,10 @@ allprojects { repositories { jcenter() mavenCentral() + maven { + url 'https://maven.google.com/' + name 'Google' + } } tasks.withType(Javadoc).all { diff --git a/cosmocalendar/build.gradle b/cosmocalendar/build.gradle index f5fdb9c..247263a 100644 --- a/cosmocalendar/build.gradle +++ b/cosmocalendar/build.gradle @@ -1,5 +1,7 @@ apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' +group = 'com.github.mustafabayram' ext { bintrayRepo = 'maven' bintrayName = 'cosmocalendar' @@ -25,14 +27,14 @@ ext { } android { - compileSdkVersion 25 - buildToolsVersion "25.0.3" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { - minSdkVersion 17 - targetSdkVersion 25 - versionCode 5 - versionName "1.0.4" + minSdkVersion 16 + targetSdkVersion 28 + versionCode 14 + versionName "1.4" } buildTypes { release { @@ -43,9 +45,9 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.3.1' - compile "com.android.support:recyclerview-v7:25.3.1" + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation "com.android.support:recyclerview-v7:28.0.0" } // Place it at the end of the file diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/MonthAdapter.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/MonthAdapter.java index 043ef89..c302326 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/MonthAdapter.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/MonthAdapter.java @@ -125,6 +125,28 @@ public void setWeekendDays(Set weekendDays) { setDaysAccordingToSet(weekendDays, DayFlag.WEEKEND); } + public void setEnableMinDate(Calendar minDate) { + for (Month month : months) { + for (Day day : month.getDays()) { + if (!day.isDisabled()) { + day.setDisabled(CalendarUtils.isDayDisabledByMinDate(day, minDate)); + } + } + } + notifyDataSetChanged(); + } + + public void setEnableMaxDate(Calendar maxDate) { + for (Month month : months) { + for (Day day : month.getDays()) { + if (!day.isDisabled()) { + day.setDisabled(CalendarUtils.isDayDisabledByMaxDate(day, maxDate)); + } + } + } + notifyDataSetChanged(); + } + public void setDisabledDays(Set disabledDays) { setDaysAccordingToSet(disabledDays, DayFlag.DISABLED); } @@ -133,10 +155,10 @@ public void setConnectedCalendarDays(Set connectedCalendarDays) { setDaysAccordingToSet(connectedCalendarDays, DayFlag.FROM_CONNECTED_CALENDAR); } - public void setDisabledDaysCriteria(DisabledDaysCriteria criteria){ + public void setDisabledDaysCriteria(DisabledDaysCriteria criteria) { for (Month month : months) { for (Day day : month.getDays()) { - if(!day.isDisabled()){ + if (!day.isDisabled()) { day.setDisabled(CalendarUtils.isDayDisabledByCriteria(day, criteria)); } } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayHolder.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayHolder.java index 4b5399d..6849150 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayHolder.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayHolder.java @@ -1,6 +1,7 @@ package com.applikeysolutions.cosmocalendar.adapter.viewholder; import android.content.res.Resources; +import android.support.v4.widget.TextViewCompat; import android.view.View; import com.applikeysolutions.cosmocalendar.settings.appearance.ConnectedDayIconPosition; @@ -26,6 +27,7 @@ public DayHolder(View itemView, CalendarView calendarView) { public void bind(Day day, BaseSelectionManager selectionManager) { this.selectionManager = selectionManager; ctvDay.setText(String.valueOf(day.getDayNumber())); + TextViewCompat.setTextAppearance(ctvDay, calendarView.getDayTextAppearance()); boolean isSelected = selectionManager.isDaySelected(day); if (isSelected && !day.isDisabled()) { @@ -36,21 +38,22 @@ public void bind(Day day, BaseSelectionManager selectionManager) { if (day.isCurrent()) { addCurrentDayIcon(isSelected); + //ctvDay.setTextColor(calendarView.getCurrentDayTextColor()); } - if(day.isDisabled()){ + if (day.isDisabled()) { ctvDay.setTextColor(calendarView.getDisabledDayTextColor()); } } - private void addCurrentDayIcon(boolean isSelected){ + private void addCurrentDayIcon(boolean isSelected) { ctvDay.setCompoundDrawablePadding(getPadding(getCurrentDayIconHeight(isSelected)) * -1); ctvDay.setCompoundDrawablesWithIntrinsicBounds(0, isSelected ? calendarView.getCurrentDaySelectedIconRes() : calendarView.getCurrentDayIconRes(), 0, 0); } - private int getCurrentDayIconHeight(boolean isSelected){ + private int getCurrentDayIconHeight(boolean isSelected) { if (isSelected) { return CalendarUtils.getIconHeight(calendarView.getContext().getResources(), calendarView.getCurrentDaySelectedIconRes()); } else { @@ -58,7 +61,7 @@ private int getCurrentDayIconHeight(boolean isSelected){ } } - private int getConnectedDayIconHeight(boolean isSelected){ + private int getConnectedDayIconHeight(boolean isSelected) { if (isSelected) { return CalendarUtils.getIconHeight(calendarView.getContext().getResources(), calendarView.getConnectedDaySelectedIconRes()); } else { @@ -68,7 +71,7 @@ private int getConnectedDayIconHeight(boolean isSelected){ private void select(Day day) { if (day.isFromConnectedCalendar()) { - if(day.isDisabled()){ + if (day.isDisabled()) { ctvDay.setTextColor(day.getConnectedDaysDisabledTextColor()); } else { ctvDay.setTextColor(day.getConnectedDaysSelectedTextColor()); @@ -88,10 +91,10 @@ private void select(Day day) { animateDay(state, day); } - private void addConnectedDayIcon(boolean isSelected){ + private void addConnectedDayIcon(boolean isSelected) { ctvDay.setCompoundDrawablePadding(getPadding(getConnectedDayIconHeight(isSelected)) * -1); - switch (calendarView.getConnectedDayIconPosition()){ + switch (calendarView.getConnectedDayIconPosition()) { case ConnectedDayIconPosition.TOP: ctvDay.setCompoundDrawablesWithIntrinsicBounds(0, isSelected ? calendarView.getConnectedDaySelectedIconRes() @@ -161,7 +164,7 @@ private void animateDay(SelectionState state, Day day) { private void unselect(Day day) { int textColor; if (day.isFromConnectedCalendar()) { - if(day.isDisabled()){ + if (day.isDisabled()) { textColor = day.getConnectedDaysDisabledTextColor(); } else { textColor = day.getConnectedDaysTextColor(); @@ -179,7 +182,7 @@ private void unselect(Day day) { ctvDay.clearView(); } - private int getPadding(int iconHeight){ + private int getPadding(int iconHeight) { return (int) (iconHeight * Resources.getSystem().getDisplayMetrics().density); } } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayOfWeekHolder.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayOfWeekHolder.java index 6d63934..5ad42d7 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayOfWeekHolder.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/DayOfWeekHolder.java @@ -1,5 +1,6 @@ package com.applikeysolutions.cosmocalendar.adapter.viewholder; +import android.support.v4.widget.TextViewCompat; import android.view.View; import android.widget.TextView; @@ -22,6 +23,7 @@ public DayOfWeekHolder(View itemView, CalendarView calendarView) { } public void bind(Day day) { + TextViewCompat.setTextAppearance(tvDay, calendarView.getDayTextAppearance()); tvDay.setText(mDayOfWeekFormatter.format(day.getCalendar().getTime())); tvDay.setTextColor(calendarView.getWeekDayTitleTextColor()); } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/MonthHolder.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/MonthHolder.java index 0a4074c..f3ea7ff 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/MonthHolder.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/MonthHolder.java @@ -1,9 +1,9 @@ package com.applikeysolutions.cosmocalendar.adapter.viewholder; +import android.support.v4.widget.TextViewCompat; import android.support.v7.widget.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.view.View; -import android.widget.LinearLayout; import android.widget.TextView; import com.applikeysolutions.cosmocalendar.settings.SettingsManager; @@ -14,20 +14,16 @@ public class MonthHolder extends RecyclerView.ViewHolder { - private LinearLayout llMonthHeader; private TextView tvMonthName; - private View viewLeftLine; - private View viewRightLine; private MonthView monthView; + private View monthHeaderBorder; private SettingsManager appearanceModel; public MonthHolder(View itemView, SettingsManager appearanceModel) { super(itemView); - llMonthHeader = (LinearLayout) itemView.findViewById(R.id.ll_month_header); monthView = (MonthView) itemView.findViewById(R.id.month_view); tvMonthName = (TextView) itemView.findViewById(R.id.tv_month_name); - viewLeftLine = itemView.findViewById(R.id.view_left_line); - viewRightLine = itemView.findViewById(R.id.view_right_line); + monthHeaderBorder = itemView.findViewById(R.id.month_header_border); this.appearanceModel = appearanceModel; } @@ -38,11 +34,10 @@ public void setDayAdapter(DaysAdapter adapter) { public void bind(Month month) { tvMonthName.setText(month.getMonthName()); tvMonthName.setTextColor(appearanceModel.getMonthTextColor()); + TextViewCompat.setTextAppearance(tvMonthName, appearanceModel.getMonthTextAppearance()); - viewLeftLine.setVisibility(appearanceModel.getCalendarOrientation() == OrientationHelper.HORIZONTAL ? View.INVISIBLE : View.VISIBLE); - viewRightLine.setVisibility(appearanceModel.getCalendarOrientation() == OrientationHelper.HORIZONTAL ? View.INVISIBLE : View.VISIBLE); - llMonthHeader.setBackgroundResource(appearanceModel.getCalendarOrientation() == OrientationHelper.HORIZONTAL ? R.drawable.border_top_bottom : 0); - + tvMonthName.setBackgroundResource(appearanceModel.getCalendarOrientation() == OrientationHelper.HORIZONTAL ? R.drawable.border_top_bottom : 0); + monthHeaderBorder.setVisibility(appearanceModel.getCalendarOrientation() == OrientationHelper.HORIZONTAL ? View.GONE : View.VISIBLE); monthView.initAdapter(month); } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/OtherDayHolder.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/OtherDayHolder.java index 9eebf85..55edfb6 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/OtherDayHolder.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/adapter/viewholder/OtherDayHolder.java @@ -1,5 +1,6 @@ package com.applikeysolutions.cosmocalendar.adapter.viewholder; +import android.support.v4.widget.TextViewCompat; import android.view.View; import android.widget.TextView; @@ -15,7 +16,9 @@ public OtherDayHolder(View itemView, CalendarView calendarView) { } public void bind(Day day) { + TextViewCompat.setTextAppearance(tvDay, calendarView.getDayTextAppearance()); tvDay.setText(String.valueOf(day.getDayNumber())); tvDay.setTextColor(calendarView.getOtherDayTextColor()); + tvDay.setVisibility(calendarView.getOtherDayVisibility() ? View.VISIBLE : View.INVISIBLE); } } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/dialog/CalendarDialog.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/dialog/CalendarDialog.java index 440f7f1..cc8618a 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/dialog/CalendarDialog.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/dialog/CalendarDialog.java @@ -26,6 +26,7 @@ import com.applikeysolutions.cosmocalendar.settings.selection.SelectionInterface; import com.applikeysolutions.cosmocalendar.view.CalendarView; +import java.util.Calendar; import java.util.List; import java.util.Set; @@ -218,6 +219,26 @@ public int getNextMonthIconRes() { return calendarView.getNextMonthIconRes(); } + @Override + public boolean getOtherDayVisibility() { + return calendarView.getOtherDayVisibility(); + } + + @Override + public int getDayTextAppearance() { + return calendarView.getDayTextAppearance(); + } + + @Override + public int getWeekTextAppearance() { + return calendarView.getWeekTextAppearance(); + } + + @Override + public int getMonthTextAppearance() { + return calendarView.getMonthTextAppearance(); + } + @Override public boolean isShowDaysOfWeek() { return calendarView.isShowDaysOfWeek(); @@ -343,6 +364,46 @@ public void setShowDaysOfWeekTitle(boolean showDaysOfWeekTitle) { calendarView.setShowDaysOfWeekTitle(showDaysOfWeekTitle); } + @Override + public void setDayTextAppearance(int dayTextAppearance) { + calendarView.setDayTextAppearance(dayTextAppearance); + } + + @Override + public void setWeekTextAppearance(int weekTextAppearance) { + calendarView.setWeekTextAppearance(weekTextAppearance); + } + + @Override + public void setMonthTextAppearance(int monthTextAppearance) { + calendarView.setMonthTextAppearance(monthTextAppearance); + } + + @Override + public void setOtherDayVisibility(boolean isVisible) { + calendarView.setOtherDayVisibility(isVisible); + } + + @Override + public Calendar getEnableMinDate() { + return calendarView.getEnableMinDate(); + } + + @Override + public Calendar getEnableMaxDate() { + return calendarView.getEnableMaxDate(); + } + + @Override + public Calendar getVisibleMinDate() { + return calendarView.getVisibleMinDate(); + } + + @Override + public Calendar getVisibleMaxDate() { + return calendarView.getVisibleMaxDate(); + } + @Override public Set getDisabledDays() { return calendarView.getDisabledDays(); @@ -368,6 +429,26 @@ public void setDisabledDays(Set disabledDays) { calendarView.setDisabledDays(disabledDays); } + @Override + public void setEnableMinDate(Calendar minDate) { + calendarView.setEnableMinDate(minDate); + } + + @Override + public void setEnableMaxDate(Calendar maxDate) { + calendarView.setEnableMaxDate(maxDate); + } + + @Override + public void setVisibleMinDate(Calendar minDate) { + calendarView.setVisibleMinDate(minDate); + } + + @Override + public void setVisibleMaxDate(Calendar maxDate) { + calendarView.setVisibleMaxDate(maxDate); + } + @Override public void setWeekendDays(Set weekendDays) { calendarView.setWeekendDays(weekendDays); diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/listeners/DateSelectedListener.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/listeners/DateSelectedListener.java new file mode 100644 index 0000000..525694a --- /dev/null +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/listeners/DateSelectedListener.java @@ -0,0 +1,10 @@ +package com.applikeysolutions.cosmocalendar.listeners; + +import java.util.Calendar; + +/** + * Created by Mustafa Bayram on 18.12.2018. + */ +public interface DateSelectedListener { + void onDateSelected(Calendar calendar); +} diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/model/Month.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/model/Month.java index 00d2b09..1f803b2 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/model/Month.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/model/Month.java @@ -49,7 +49,7 @@ public List getDaysWithoutTitlesAndOnlyCurrent() { } public String getMonthName() { - return new SimpleDateFormat("MMMM yyyy", Locale.getDefault()).format(firstDay.getCalendar().getTime()); + return new SimpleDateFormat("MMMM", Locale.getDefault()).format(firstDay.getCalendar().getTime()); } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/SettingsManager.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/SettingsManager.java index b8b016c..5f4fcc6 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/SettingsManager.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/SettingsManager.java @@ -23,6 +23,7 @@ public class SettingsManager implements AppearanceInterface, DateInterface, Cale //Default values public static final int DEFAULT_MONTH_COUNT = 20; + public static final int DEFAULT_INITIAL_POSITION = 0; public static final int DEFAULT_SELECTION_TYPE = SelectionType.SINGLE; public static final int DEFAULT_FIRST_DAY_OF_WEEK = Calendar.MONDAY; public static final int DEFAULT_ORIENTATION = LinearLayoutManager.VERTICAL; @@ -33,6 +34,7 @@ public class SettingsManager implements AppearanceInterface, DateInterface, Cale private DateModel dateModel; private CalendarListsModel calendarListsModel; private SelectionModel selectionModel; + private int initialPosition = DEFAULT_INITIAL_POSITION; public SettingsManager() { appearanceModel = new AppearanceModel(); @@ -41,6 +43,10 @@ public SettingsManager() { selectionModel = new SelectionModel(); } + public int getInitialPosition() { + return initialPosition; + } + @Override @SelectionType public int getSelectionType() { @@ -157,6 +163,26 @@ public int getNextMonthIconRes() { return appearanceModel.getNextMonthIconRes(); } + @Override + public boolean getOtherDayVisibility() { + return appearanceModel.getOtherDayVisibility(); + } + + @Override + public int getDayTextAppearance() { + return appearanceModel.getDayTextAppearance(); + } + + @Override + public int getWeekTextAppearance() { + return appearanceModel.getWeekTextAppearance(); + } + + @Override + public int getMonthTextAppearance() { + return appearanceModel.getMonthTextAppearance(); + } + @Override public boolean isShowDaysOfWeek() { return appearanceModel.isShowDaysOfWeek(); @@ -167,6 +193,10 @@ public boolean isShowDaysOfWeekTitle() { return appearanceModel.isShowDaysOfWeekTitle(); } + public void setInitialPosition(int initialPosition) { + this.initialPosition = initialPosition; + } + @Override public void setCalendarBackgroundColor(int calendarBackgroundColor) { appearanceModel.setCalendarBackgroundColor(calendarBackgroundColor); @@ -282,6 +312,46 @@ public void setShowDaysOfWeekTitle(boolean showDaysOfWeekTitle) { appearanceModel.setShowDaysOfWeekTitle(showDaysOfWeekTitle); } + @Override + public void setDayTextAppearance(int dayTextAppearance) { + appearanceModel.setDayTextAppearance(dayTextAppearance); + } + + @Override + public void setWeekTextAppearance(int weekTextAppearance) { + appearanceModel.setWeekTextAppearance(weekTextAppearance); + } + + @Override + public void setMonthTextAppearance(int monthTextAppearance) { + appearanceModel.setMonthTextAppearance(monthTextAppearance); + } + + @Override + public void setOtherDayVisibility(boolean isVisible) { + appearanceModel.setOtherDayVisibility(isVisible); + } + + @Override + public Calendar getEnableMinDate() { + return calendarListsModel.getEnableMinDate(); + } + + @Override + public Calendar getEnableMaxDate() { + return calendarListsModel.getEnableMaxDate(); + } + + @Override + public Calendar getVisibleMinDate() { + return calendarListsModel.getVisibleMinDate(); + } + + @Override + public Calendar getVisibleMaxDate() { + return calendarListsModel.getVisibleMaxDate(); + } + @Override public Set getDisabledDays() { return calendarListsModel.getDisabledDays(); @@ -331,4 +401,24 @@ public int getFirstDayOfWeek() { public void setFirstDayOfWeek(int firstDayOfWeek) { dateModel.setFirstDayOfWeek(firstDayOfWeek); } + + @Override + public void setEnableMinDate(Calendar minDate) { + calendarListsModel.setEnableMinDate(minDate); + } + + @Override + public void setEnableMaxDate(Calendar maxDate) { + calendarListsModel.setEnableMaxDate(maxDate); + } + + @Override + public void setVisibleMinDate(Calendar minDate) { + calendarListsModel.setVisibleMinDate(minDate); + } + + @Override + public void setVisibleMaxDate(Calendar maxDate) { + calendarListsModel.setVisibleMaxDate(maxDate); + } } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceInterface.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceInterface.java index 90574df..4c1c698 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceInterface.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceInterface.java @@ -1,5 +1,7 @@ package com.applikeysolutions.cosmocalendar.settings.appearance; +import android.support.annotation.StyleRes; + public interface AppearanceInterface { int getCalendarBackgroundColor(); @@ -44,6 +46,17 @@ public interface AppearanceInterface { int getNextMonthIconRes(); + boolean getOtherDayVisibility(); + + @StyleRes + int getDayTextAppearance(); + + @StyleRes + int getWeekTextAppearance(); + + @StyleRes + int getMonthTextAppearance(); + boolean isShowDaysOfWeek(); boolean isShowDaysOfWeekTitle(); @@ -93,4 +106,12 @@ public interface AppearanceInterface { void setShowDaysOfWeek(boolean showDaysOfWeek); void setShowDaysOfWeekTitle(boolean showDaysOfWeekTitle); + + void setDayTextAppearance(@StyleRes int dayTextAppearance); + + void setWeekTextAppearance(@StyleRes int weekTextAppearance); + + void setMonthTextAppearance(@StyleRes int monthTextAppearance); + + void setOtherDayVisibility(boolean isVisible); } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceModel.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceModel.java index 18b1415..212ec2c 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceModel.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/appearance/AppearanceModel.java @@ -62,6 +62,18 @@ public class AppearanceModel implements AppearanceInterface { //Icon resource of next month navigation button private int nextMonthIconRes; + //Text Appearance resource of day text + private int dayTextAppearanceRes; + + //Text Appearance resource of week text + private int weekTextAppearanceRes; + + //Text Appearance resource of month text + private int monthTextAppearanceRes; + + //Other day text visibility + private boolean isOtherDayVisible = true; + /** * Orientation of calendar * possible values: @@ -182,6 +194,26 @@ public int getNextMonthIconRes() { return nextMonthIconRes; } + @Override + public boolean getOtherDayVisibility() { + return isOtherDayVisible; + } + + @Override + public int getDayTextAppearance() { + return dayTextAppearanceRes; + } + + @Override + public int getWeekTextAppearance() { + return weekTextAppearanceRes; + } + + @Override + public int getMonthTextAppearance() { + return monthTextAppearanceRes; + } + @Override public boolean isShowDaysOfWeek() { return showDaysOfWeek; @@ -306,4 +338,24 @@ public void setShowDaysOfWeek(boolean showDaysOfWeek) { public void setShowDaysOfWeekTitle(boolean showDaysOfWeekTitle) { this.showDaysOfWeekTitle = showDaysOfWeekTitle; } + + @Override + public void setDayTextAppearance(int dayTextAppearance) { + this.dayTextAppearanceRes = dayTextAppearance; + } + + @Override + public void setWeekTextAppearance(int weekTextAppearance) { + this.weekTextAppearanceRes = weekTextAppearance; + } + + @Override + public void setMonthTextAppearance(int monthTextAppearance) { + this.monthTextAppearanceRes = monthTextAppearance; + } + + @Override + public void setOtherDayVisibility(boolean isVisible) { + isOtherDayVisible = isVisible; + } } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsInterface.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsInterface.java index 6b5f64a..dd39525 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsInterface.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsInterface.java @@ -3,10 +3,19 @@ import com.applikeysolutions.cosmocalendar.settings.lists.connected_days.ConnectedDays; import com.applikeysolutions.cosmocalendar.settings.lists.connected_days.ConnectedDaysManager; +import java.util.Calendar; import java.util.Set; public interface CalendarListsInterface { + Calendar getEnableMinDate(); + + Calendar getEnableMaxDate(); + + Calendar getVisibleMinDate(); + + Calendar getVisibleMaxDate(); + Set getDisabledDays(); ConnectedDaysManager getConnectedDaysManager(); @@ -17,9 +26,18 @@ public interface CalendarListsInterface { void setDisabledDays(Set disabledDays); + void setEnableMinDate(Calendar minDate); + + void setEnableMaxDate(Calendar maxDate); + + void setVisibleMinDate(Calendar minDate); + + void setVisibleMaxDate(Calendar maxDate); + void setWeekendDays(Set weekendDays); void setDisabledDaysCriteria(DisabledDaysCriteria criteria); + void addConnectedDays(ConnectedDays connectedDays); } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsModel.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsModel.java index 0d9d53c..8352bff 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsModel.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/settings/lists/CalendarListsModel.java @@ -10,6 +10,14 @@ public class CalendarListsModel implements CalendarListsInterface { + private Calendar enableMinDate; + + private Calendar enableMaxDate; + + private Calendar visibleMinDate; + + private Calendar visibleMaxDate; + //Disabled days cannot be selected private Set disabledDays = new TreeSet<>(); @@ -22,6 +30,26 @@ public class CalendarListsModel implements CalendarListsInterface { add(Calendar.SUNDAY); }}; + @Override + public Calendar getEnableMinDate() { + return enableMinDate; + } + + @Override + public Calendar getEnableMaxDate() { + return enableMaxDate; + } + + @Override + public Calendar getVisibleMinDate() { + return visibleMinDate; + } + + @Override + public Calendar getVisibleMaxDate() { + return visibleMaxDate; + } + @Override public Set getDisabledDays() { return disabledDays; @@ -42,6 +70,26 @@ public DisabledDaysCriteria getDisabledDaysCriteria() { return disabledDaysCriteria; } + @Override + public void setEnableMinDate(Calendar minDate) { + this.enableMinDate = minDate; + } + + @Override + public void setEnableMaxDate(Calendar maxDate) { + this.enableMaxDate = maxDate; + } + + @Override + public void setVisibleMinDate(Calendar minDate) { + this.visibleMinDate = minDate; + } + + @Override + public void setVisibleMaxDate(Calendar maxDate) { + this.visibleMaxDate = maxDate; + } + @Override public void setDisabledDays(Set disabledDays) { this.disabledDays = disabledDays; diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/CalendarUtils.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/CalendarUtils.java index 0cc63c3..67d6cf1 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/CalendarUtils.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/CalendarUtils.java @@ -3,6 +3,7 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.BitmapFactory; +import android.util.DisplayMetrics; import android.view.WindowManager; import com.applikeysolutions.cosmocalendar.settings.SettingsManager; @@ -93,7 +94,11 @@ public static List createWeekDayTitles(int firstDayOfWeek) { return titles; } - public static List createInitialMonths(SettingsManager settingsManager) { + public static List createInitialMonths(SettingsManager settingsManager, boolean hasLimit) { + return hasLimit ? createInitialMonthsWithLimit(settingsManager) : createInitialMonthsDefault(settingsManager); + } + + private static List createInitialMonthsDefault(SettingsManager settingsManager) { final List months = new ArrayList<>(); final Calendar calendar = Calendar.getInstance(); @@ -101,6 +106,8 @@ public static List createInitialMonths(SettingsManager settingsManager) { calendar.add(Calendar.MONTH, -1); } + settingsManager.setInitialPosition(SettingsManager.DEFAULT_MONTH_COUNT / 2); + for (int i = 0; i < SettingsManager.DEFAULT_MONTH_COUNT; i++) { months.add(createMonth(calendar.getTime(), settingsManager)); DateUtils.addMonth(calendar); @@ -108,6 +115,43 @@ public static List createInitialMonths(SettingsManager settingsManager) { return months; } + + private static List createInitialMonthsWithLimit(SettingsManager settingsManager) { + final List months = new ArrayList<>(); + + final Calendar calendar = Calendar.getInstance(); + + int previousMonthCount; + + if (settingsManager.getVisibleMaxDate() == null) { + return new ArrayList<>(); + } + + if (settingsManager.getVisibleMinDate() != null) { + + previousMonthCount = monthsBetween(settingsManager.getVisibleMinDate(), calendar); + settingsManager.setInitialPosition(previousMonthCount); + + while (calendar.compareTo(settingsManager.getVisibleMinDate()) >= 0) { + calendar.add(Calendar.DAY_OF_MONTH, -1); + } + } + + do { + months.add(createMonth(calendar.getTime(), settingsManager)); + DateUtils.addMonth(calendar); + } while (calendar.compareTo(settingsManager.getVisibleMaxDate()) <= 0 + || calendar.get(Calendar.MONTH) == settingsManager.getVisibleMaxDate().get(Calendar.MONTH)); + + return months; + } + + public static int monthsBetween(Calendar startDate, Calendar endDate) { + int diffYear = endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR); + int diffMonth = diffYear * 12 + endDate.get(Calendar.MONTH) - startDate.get(Calendar.MONTH); + return diffMonth; + } + /** * Returns selected Days grouped by month/year * @@ -145,10 +189,21 @@ public static int getCircleWidth(Context context) { return getDisplayWidth(context) / Constants.DAYS_IN_WEEK; } + public static int getCircleHeight(Context context) { + return getDisplayWidth(context) / (Constants.DAYS_IN_WEEK + 2); + } + public static int getDisplayWidth(Context context) { return ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); } + public static int dipToPx(Context context, float dipValue) { + Resources resources = context.getResources(); + DisplayMetrics displayMetrics = resources.getDisplayMetrics(); + float scale = displayMetrics.density; + return (int) (dipValue * scale + 0.5f); + } + /** * Sets variables(isWeekend, isDisabled, isFromConnectedCalendar) to day */ @@ -157,12 +212,23 @@ public static void setDay(Day day, SettingsManager settingsManager) { day.setWeekend(settingsManager.getWeekendDays().contains(day.getCalendar().get(Calendar.DAY_OF_WEEK))); } + if (settingsManager.getEnableMinDate() != null) { + day.setDisabled(isDayDisabledByMinDate(day, settingsManager.getEnableMinDate())); + } + if (settingsManager.getEnableMaxDate() != null) { + if (!day.isDisabled()) { + day.setDisabled(isDayDisabledByMaxDate(day, settingsManager.getEnableMaxDate())); + } + } + if (settingsManager.getDisabledDays() != null) { - day.setDisabled(isDayInSet(day, settingsManager.getDisabledDays())); + if (!day.isDisabled()) { + day.setDisabled(isDayInSet(day, settingsManager.getDisabledDays())); + } } if (settingsManager.getDisabledDaysCriteria() != null) { - if(!day.isDisabled()){ + if (!day.isDisabled()) { day.setDisabled(isDayDisabledByCriteria(day, settingsManager.getDisabledDaysCriteria())); } } @@ -183,9 +249,21 @@ public static boolean isDayInSet(Day day, Set daysInSet) { return false; } + public static boolean isDayDisabledByMinDate(Day day, Calendar minDate) { + return day.getCalendar().get(Calendar.YEAR) < minDate.get(Calendar.YEAR) + || day.getCalendar().get(Calendar.YEAR) == minDate.get(Calendar.YEAR) + && day.getCalendar().get(Calendar.DAY_OF_YEAR) < minDate.get(Calendar.DAY_OF_YEAR); + } + + public static boolean isDayDisabledByMaxDate(Day day, Calendar maxDate) { + return day.getCalendar().get(Calendar.YEAR) > maxDate.get(Calendar.YEAR) + || day.getCalendar().get(Calendar.YEAR) == maxDate.get(Calendar.YEAR) + && day.getCalendar().get(Calendar.DAY_OF_YEAR) > maxDate.get(Calendar.DAY_OF_YEAR); + } + public static boolean isDayDisabledByCriteria(Day day, DisabledDaysCriteria criteria) { int field = -1; - switch (criteria.getCriteriaType()){ + switch (criteria.getCriteriaType()) { case DAYS_OF_MONTH: field = Calendar.DAY_OF_MONTH; break; @@ -195,15 +273,15 @@ public static boolean isDayDisabledByCriteria(Day day, DisabledDaysCriteria crit break; } - for(int dayInt : criteria.getDays()){ - if(dayInt == day.getCalendar().get(field)){ + for (int dayInt : criteria.getDays()) { + if (dayInt == day.getCalendar().get(field)) { return true; } } return false; } - public static int getIconHeight(Resources resources, int iconResId){ + public static int getIconHeight(Resources resources, int iconResId) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(resources, iconResId, options); diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/ViewIDGenerator.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/ViewIDGenerator.java new file mode 100644 index 0000000..8aaab79 --- /dev/null +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/utils/ViewIDGenerator.java @@ -0,0 +1,34 @@ +package com.applikeysolutions.cosmocalendar.utils; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.view.View; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by Mustafa Bayram on 30.11.2018. + */ +public class ViewIDGenerator { + private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); + + @SuppressLint("NewApi") + public static int generateViewId() { + + if (Build.VERSION.SDK_INT < 17) { + for (; ; ) { + final int result = sNextGeneratedId.get(); + // aapt-generated IDs have the high byte nonzero; clamp to the range under that. + int newValue = result + 1; + if (newValue > 0x00FFFFFF) + newValue = 1; // Roll over to 1, not 0. + if (sNextGeneratedId.compareAndSet(result, newValue)) { + return result; + } + } + } else { + return View.generateViewId(); + } + + } +} diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java index 8d224b7..cebac0d 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java @@ -11,6 +11,7 @@ import android.support.annotation.StyleRes; import android.support.v4.content.ContextCompat; import android.support.v4.util.Pair; +import android.support.v4.widget.TextViewCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.OrientationHelper; @@ -27,6 +28,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; +import com.applikeysolutions.cosmocalendar.listeners.DateSelectedListener; import com.applikeysolutions.cosmocalendar.selection.NoneSelectionManager; import com.applikeysolutions.cosmocalendar.FetchMonthsAsyncTask; import com.applikeysolutions.cosmocalendar.adapter.MonthAdapter; @@ -50,6 +52,7 @@ import com.applikeysolutions.cosmocalendar.settings.selection.SelectionInterface; import com.applikeysolutions.cosmocalendar.utils.CalendarUtils; import com.applikeysolutions.cosmocalendar.utils.SelectionType; +import com.applikeysolutions.cosmocalendar.utils.ViewIDGenerator; import com.applikeysolutions.cosmocalendar.utils.WeekDay; import com.applikeysolutions.cosmocalendar.utils.snap.GravitySnapHelper; import com.applikeysolutions.cosmocalendar.view.customviews.CircleAnimationTextView; @@ -96,13 +99,16 @@ public class CalendarView extends RelativeLayout implements OnDaySelectedListene private OnMonthChangeListener onMonthChangeListener; private Month previousSelectedMonth; - private int lastVisibleMonthPosition = SettingsManager.DEFAULT_MONTH_COUNT / 2; + private int lastVisibleMonthPosition = SettingsManager.DEFAULT_INITIAL_POSITION; + private boolean hasMinOrMaxVisibleDateLimit; + private boolean isFirstSelect = true; private FetchMonthsAsyncTask asyncTask; + private DateSelectedListener dateSelectedListener; + public CalendarView(Context context) { - super(context); - init(); + this(context, null); } public CalendarView(Context context, @Nullable AttributeSet attrs) { @@ -125,7 +131,7 @@ public CalendarView(@NonNull Context context, @Nullable AttributeSet attrs, @Att protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if(asyncTask != null && !asyncTask.isCancelled()){ + if (asyncTask != null && !asyncTask.isCancelled()) { asyncTask.cancel(false); } } @@ -268,7 +274,7 @@ private void createDaysOfWeekTitle() { boolean isTitleAlreadyAdded = llDaysOfWeekTitles != null; if (!isTitleAlreadyAdded) { llDaysOfWeekTitles = new LinearLayout(getContext()); - llDaysOfWeekTitles.setId(View.generateViewId()); + llDaysOfWeekTitles.setId(ViewIDGenerator.generateViewId()); llDaysOfWeekTitles.setOrientation(LinearLayout.HORIZONTAL); llDaysOfWeekTitles.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); } else { @@ -283,6 +289,7 @@ private void createDaysOfWeekTitle() { tvDayTitle.setText(title); tvDayTitle.setLayoutParams(textViewParam); tvDayTitle.setGravity(Gravity.CENTER); + TextViewCompat.setTextAppearance(tvDayTitle, settingsManager.getWeekTextAppearance()); llDaysOfWeekTitles.addView(tvDayTitle); } @@ -300,7 +307,7 @@ private void createDaysOfWeekTitle() { private void createBottomSelectionBar() { flBottomSelectionBar = new FrameLayout(getContext()); // flBottomSelectionBar.setLayoutTransition(new LayoutTransition()); - flBottomSelectionBar.setId(View.generateViewId()); + flBottomSelectionBar.setId(ViewIDGenerator.generateViewId()); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, rvMonths.getId()); flBottomSelectionBar.setLayoutParams(params); @@ -318,7 +325,7 @@ private void createBottomSelectionBar() { */ private void createMultipleSelectionBarRecycler() { rvMultipleSelectedList = new RecyclerView(getContext()); - rvMultipleSelectedList.setId(View.generateViewId()); + rvMultipleSelectedList.setId(ViewIDGenerator.generateViewId()); rvMultipleSelectedList.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); rvMultipleSelectedList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); multipleSelectionBarAdapter = new MultipleSelectionBarAdapter(this, this); @@ -381,8 +388,8 @@ public void update() { private void createRecyclerView() { rvMonths = new SlowdownRecyclerView(getContext()); - rvMonths.setId(View.generateViewId()); - rvMonths.setHasFixedSize(true); + rvMonths.setId(ViewIDGenerator.generateViewId()); + rvMonths.setHasFixedSize(false); rvMonths.setNestedScrollingEnabled(false); ((SimpleItemAnimator) rvMonths.getItemAnimator()).setSupportsChangeAnimations(false); @@ -393,10 +400,10 @@ private void createRecyclerView() { rvMonths.setLayoutManager(new GridLayoutManager(getContext(), 1, settingsManager.getCalendarOrientation(), false)); monthAdapter = createAdapter(); - changeSnapHelper(); + //changeSnapHelper(); rvMonths.setAdapter(monthAdapter); - rvMonths.scrollToPosition(SettingsManager.DEFAULT_MONTH_COUNT / 2); + rvMonths.scrollToPosition(settingsManager.getInitialPosition()); rvMonths.addOnScrollListener(pagingScrollListener); rvMonths.getRecycledViewPool().setMaxRecycledViews(ItemViewType.MONTH, 10); addView(rvMonths); @@ -440,7 +447,7 @@ public void onClick(View v) { private MonthAdapter createAdapter() { return new MonthAdapter.MonthAdapterBuilder() - .setMonths(CalendarUtils.createInitialMonths(settingsManager)) + .setMonths(CalendarUtils.createInitialMonths(settingsManager, false)) .setMonthDelegate(new MonthDelegate(settingsManager)) .setCalendarView(this) .setSelectionManager(selectionManager) @@ -480,9 +487,9 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { int firstVisibleItemPosition = getFirstVisiblePosition(manager); lastVisibleMonthPosition = firstVisibleItemPosition; - if (firstVisibleItemPosition < 2) { + if (firstVisibleItemPosition < 2 && getVisibleMinDate() == null) { loadAsyncMonths(false); - } else if (firstVisibleItemPosition >= totalItemCount - 2) { + } else if (firstVisibleItemPosition >= totalItemCount - 2 && getVisibleMaxDate() == null) { loadAsyncMonths(true); } } @@ -496,8 +503,8 @@ private int getFirstVisiblePosition(RecyclerView.LayoutManager manager) { } } - private void loadAsyncMonths(final boolean future){ - if(asyncTask != null && (asyncTask.getStatus() == AsyncTask.Status.PENDING || asyncTask.getStatus() == AsyncTask.Status.RUNNING)) + private void loadAsyncMonths(final boolean future) { + if (asyncTask != null && (asyncTask.getStatus() == AsyncTask.Status.PENDING || asyncTask.getStatus() == AsyncTask.Status.RUNNING)) return; asyncTask = new FetchMonthsAsyncTask(); @@ -512,6 +519,26 @@ private void loadAsyncMonths(final boolean future){ asyncTask.execute(new FetchMonthsAsyncTask.FetchParams(future, month, settingsManager, monthAdapter, SettingsManager.DEFAULT_MONTH_COUNT)); } + @Override + public Calendar getEnableMinDate() { + return settingsManager.getEnableMinDate(); + } + + @Override + public Calendar getEnableMaxDate() { + return settingsManager.getEnableMaxDate(); + } + + @Override + public Calendar getVisibleMinDate() { + return settingsManager.getVisibleMinDate(); + } + + @Override + public Calendar getVisibleMaxDate() { + return settingsManager.getVisibleMaxDate(); + } + @Override public Set getDisabledDays() { return settingsManager.getDisabledDays(); @@ -532,6 +559,36 @@ public DisabledDaysCriteria getDisabledDaysCriteria() { return settingsManager.getDisabledDaysCriteria(); } + @Override + public void setEnableMinDate(Calendar minDate) { + settingsManager.setEnableMinDate(minDate); + monthAdapter.setEnableMinDate(minDate); + update(); + } + + @Override + public void setEnableMaxDate(Calendar maxDate) { + settingsManager.setEnableMaxDate(maxDate); + monthAdapter.setEnableMaxDate(maxDate); + update(); + } + + @Override + public void setVisibleMinDate(Calendar minDate) { + settingsManager.setVisibleMinDate(minDate); + hasMinOrMaxVisibleDateLimit = minDate != null; + recreateInitialMonth(hasMinOrMaxVisibleDateLimit); + update(); + } + + @Override + public void setVisibleMaxDate(Calendar maxDate) { + settingsManager.setVisibleMaxDate(maxDate); + hasMinOrMaxVisibleDateLimit = maxDate != null; + recreateInitialMonth(hasMinOrMaxVisibleDateLimit); + update(); + } + public void setDisabledDays(Set disabledDays) { settingsManager.setDisabledDays(disabledDays); monthAdapter.setDisabledDays(disabledDays); @@ -551,7 +608,7 @@ public void setDisabledDaysCriteria(DisabledDaysCriteria criteria) { @Override public void addConnectedDays(ConnectedDays connectedDays) { settingsManager.getConnectedDaysManager().addConnectedDays(connectedDays); - recreateInitialMonth(); + recreateInitialMonth(hasMinOrMaxVisibleDateLimit); } /** @@ -574,9 +631,9 @@ public void clearSelections() { */ public List getSelectedDays() { List selectedDays = new ArrayList<>(); - for(Iterator monthIterator = monthAdapter.getData().iterator(); monthIterator.hasNext();) { + for (Iterator monthIterator = monthAdapter.getData().iterator(); monthIterator.hasNext(); ) { Month month = monthIterator.next(); - for(Iterator dayIterator = month.getDaysWithoutTitlesAndOnlyCurrent().iterator(); dayIterator.hasNext();) { + for (Iterator dayIterator = month.getDaysWithoutTitlesAndOnlyCurrent().iterator(); dayIterator.hasNext(); ) { Day day = dayIterator.next(); if (selectionManager.isDaySelected(day)) { selectedDays.add(day); @@ -623,16 +680,36 @@ public SettingsManager getSettingsManager() { return settingsManager; } - private void recreateInitialMonth() { + private void recreateInitialMonth(boolean hasLimit) { monthAdapter.getData().clear(); - monthAdapter.getData().addAll(CalendarUtils.createInitialMonths(settingsManager)); - lastVisibleMonthPosition = SettingsManager.DEFAULT_MONTH_COUNT / 2; + monthAdapter.getData().addAll(CalendarUtils.createInitialMonths(settingsManager, hasLimit)); + lastVisibleMonthPosition = settingsManager.getInitialPosition(); } @Override public void onDaySelected() { selectedDays = getSelectedDays(); + if (selectedDays == null || selectedDays.isEmpty()) { + return; + } displaySelectedDays(); + + int index = 0; + Calendar selectedCalendar = selectedDays.get(0).getCalendar(); + for (Month month : monthAdapter.getData()) { + if (month.getFirstDay().getCalendar().compareTo(selectedCalendar) > 0) { + lastVisibleMonthPosition = index - 1; + if (isFirstSelect) { + rvMonths.scrollToPosition(lastVisibleMonthPosition); + isFirstSelect = false; + } + break; + } + index++; + } + if (dateSelectedListener != null) { + dateSelectedListener.onDateSelected(selectedDays.get(0).getCalendar()); + } } /** @@ -848,6 +925,26 @@ public int getNextMonthIconRes() { return settingsManager.getNextMonthIconRes(); } + @Override + public boolean getOtherDayVisibility() { + return settingsManager.getOtherDayVisibility(); + } + + @Override + public int getDayTextAppearance() { + return settingsManager.getDayTextAppearance(); + } + + @Override + public int getWeekTextAppearance() { + return settingsManager.getWeekTextAppearance(); + } + + @Override + public int getMonthTextAppearance() { + return settingsManager.getMonthTextAppearance(); + } + @Override public boolean isShowDaysOfWeek() { return settingsManager.isShowDaysOfWeek(); @@ -944,11 +1041,11 @@ public void setCalendarOrientation(int calendarOrientation) { clearSelections(); settingsManager.setCalendarOrientation(calendarOrientation); setDaysOfWeekTitles(); - recreateInitialMonth(); + recreateInitialMonth(hasMinOrMaxVisibleDateLimit); rvMonths.setLayoutManager(new GridLayoutManager(getContext(), 1, getCalendarOrientation(), false)); - changeSnapHelper(); + //changeSnapHelper(); if (getCalendarOrientation() == LinearLayout.HORIZONTAL) { if (flNavigationButtons != null) { @@ -1011,7 +1108,7 @@ public void setNextMonthIconRes(int nextMonthIconRes) { @Override public void setShowDaysOfWeek(boolean showDaysOfWeek) { settingsManager.setShowDaysOfWeek(showDaysOfWeek); - recreateInitialMonth(); + recreateInitialMonth(hasMinOrMaxVisibleDateLimit); } @Override @@ -1024,6 +1121,30 @@ public void setShowDaysOfWeekTitle(boolean showDaysOfWeekTitle) { } } + @Override + public void setDayTextAppearance(int dayTextAppearance) { + settingsManager.setDayTextAppearance(dayTextAppearance); + update(); + } + + @Override + public void setWeekTextAppearance(int weekTextAppearance) { + settingsManager.setWeekTextAppearance(weekTextAppearance); + update(); + } + + @Override + public void setMonthTextAppearance(int monthTextAppearance) { + settingsManager.setMonthTextAppearance(monthTextAppearance); + update(); + } + + @Override + public void setOtherDayVisibility(boolean isVisible) { + settingsManager.setOtherDayVisibility(isVisible); + update(); + } + @Override public int getFirstDayOfWeek() { return settingsManager.getFirstDayOfWeek(); @@ -1033,17 +1154,25 @@ public int getFirstDayOfWeek() { public void setFirstDayOfWeek(int firstDayOfWeek) { if (firstDayOfWeek > 0 && firstDayOfWeek < 8) { settingsManager.setFirstDayOfWeek(firstDayOfWeek); - recreateInitialMonth(); + recreateInitialMonth(hasMinOrMaxVisibleDateLimit); createDaysOfWeekTitle(); } else { throw new IllegalArgumentException("First day of week must be 1 - 7"); } } + public DateSelectedListener getDateSelectedListener() { + return dateSelectedListener; + } + + public void setDateSelectedListener(DateSelectedListener dateSelectedListener) { + this.dateSelectedListener = dateSelectedListener; + } + private void changeSnapHelper() { rvMonths.setOnFlingListener(null); if (snapHelper == null) { - snapHelper = new GravitySnapHelper(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START, true, this); + snapHelper = new GravitySnapHelper(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START, false, this); snapHelper.attachToRecyclerView(rvMonths); } else { snapHelper.setGravity(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START); @@ -1061,16 +1190,16 @@ public void onMultipleSelectionListItemClick(final Day day) { } } - public void setOnMonthChangeListener(OnMonthChangeListener onMonthChangeListener){ + public void setOnMonthChangeListener(OnMonthChangeListener onMonthChangeListener) { this.onMonthChangeListener = onMonthChangeListener; } @Override public void onSnap(int position) { Month month = monthAdapter.getData().get(position); - if(onMonthChangeListener != null + if (onMonthChangeListener != null && (previousSelectedMonth == null || !previousSelectedMonth.getMonthName().equals(month.getMonthName()))) { - onMonthChangeListener.onMonthChanged(month); + onMonthChangeListener.onMonthChanged(month); previousSelectedMonth = month; } } diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/customviews/CircleAnimationTextView.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/customviews/CircleAnimationTextView.java index 92f4106..722c994 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/customviews/CircleAnimationTextView.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/customviews/CircleAnimationTextView.java @@ -43,20 +43,23 @@ public class CircleAnimationTextView extends AppCompatTextView { private Paint backgroundRectanglePaint; private Rect backgroundRectangle; - public static final int DEFAULT_PADDING = 10; + public static int DEFAULT_PADDING = 25; public static final int MAX_PROGRESS = 100; public static final long SELECTION_ANIMATION_DURATION = 300; public CircleAnimationTextView(Context context) { super(context); + DEFAULT_PADDING = CalendarUtils.dipToPx(context, 12); } public CircleAnimationTextView(Context context, AttributeSet attrs) { super(context, attrs); + DEFAULT_PADDING = CalendarUtils.dipToPx(context, 12); } public CircleAnimationTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + DEFAULT_PADDING = CalendarUtils.dipToPx(context, 12); } //Square view @@ -64,7 +67,7 @@ public CircleAnimationTextView(Context context, AttributeSet attrs, int defStyle public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) { //For making all day views same height (ex. screen width 1080 and we have days with width 154/154/155/154/154/155/154) - super.onMeasure(widthMeasureSpec, CalendarUtils.getCircleWidth(getContext()) + MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, CalendarUtils.getCircleHeight(getContext()) + MeasureSpec.EXACTLY); } else { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } @@ -132,7 +135,7 @@ private void drawCircle(Canvas canvas) { final int diameterProgress = animationProgress * diameter / MAX_PROGRESS; setBackgroundColor(Color.TRANSPARENT); - canvas.drawCircle(getWidth() / 2, getWidth() / 2, diameterProgress / 2, circlePaint); + canvas.drawCircle(getWidth() / 2, getHeight() / 2, diameterProgress / 2, circlePaint); } private void drawCircleUnder(Canvas canvas) { diff --git a/cosmocalendar/src/main/res/layout/view_day.xml b/cosmocalendar/src/main/res/layout/view_day.xml index b94f553..7d3be1b 100644 --- a/cosmocalendar/src/main/res/layout/view_day.xml +++ b/cosmocalendar/src/main/res/layout/view_day.xml @@ -10,7 +10,6 @@ android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" - android:padding="@dimen/day_text_padding" android:textColor="@color/default_day_text_color" android:textSize="@dimen/day_text_size" tools:text="10" /> diff --git a/cosmocalendar/src/main/res/layout/view_month.xml b/cosmocalendar/src/main/res/layout/view_month.xml index 5cdc203..c4f0ad5 100644 --- a/cosmocalendar/src/main/res/layout/view_month.xml +++ b/cosmocalendar/src/main/res/layout/view_month.xml @@ -5,43 +5,21 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center" + android:padding="6dp" + android:textSize="@dimen/text_medium" + tools:text="April 2015" /> - - - - - - - + - 8dp - 16dp + 4dp + 8dp + 10dp 24dp 32dp 40dp @@ -19,7 +20,8 @@ 16sp 18sp - 14sp - 8dp + 12sp + @dimen/space_1x + @dimen/space_2.5x diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a91a603..cff195c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Mar 15 15:07:26 EET 2017 +#Mon Jul 29 11:58:23 EET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/sample/build.gradle b/sample/build.gradle index 203182b..0847a75 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.3" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { applicationId "com.applikeysolutions.cosmocalendar" - minSdkVersion 17 - targetSdkVersion 25 + minSdkVersion 16 + targetSdkVersion 28 versionCode 1 versionName "1.0" } @@ -19,6 +19,8 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile project(path: ':cosmocalendar') + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(path: ':cosmocalendar') + + implementation "com.android.support:design:28.0.0" }