1
1
package com.shahzadafridi.calendarview
2
2
3
+ import android.annotation.SuppressLint
3
4
import android.content.Context
5
+ import android.graphics.Typeface
6
+ import android.graphics.fonts.FontFamily
4
7
import android.util.AttributeSet
8
+ import android.util.Log
5
9
import android.view.LayoutInflater
6
10
import android.view.View
7
11
import android.widget.*
8
12
import androidx.core.content.ContextCompat
9
13
import androidx.core.content.res.ResourcesCompat
14
+ import androidx.core.graphics.drawable.toDrawable
10
15
import androidx.core.view.children
11
16
import androidx.recyclerview.widget.GridLayoutManager
12
17
import androidx.recyclerview.widget.LinearLayoutManager
13
18
import androidx.recyclerview.widget.RecyclerView
14
19
import com.shahzadafridi.calendarview.Util.dp
20
+ import com.shahzadafridi.calendarview.Util.months
21
+ import com.shahzadafridi.calendarview.Util.weekDays
22
+ import java.lang.Exception
15
23
import java.text.SimpleDateFormat
16
24
import java.util.*
17
25
import kotlin.collections.ArrayList
18
26
19
27
class CalendarView : LinearLayout , CalenderViewInterface {
20
28
29
+ val TAG : String = " CalendarView"
30
+
21
31
// how many days to show, defaults to six weeks, 42 days
22
32
private val DAYS_COUNT = 42
23
33
24
34
// Date format //Default
25
- private var dateFormat: String? = null ; private val DATE_FORMAT : String = " yyyy"
35
+ private var yearDateFormat: String? = null ; private val YEAR_DATE_FORMAT : String = " yyyy"
36
+ private var yearTextColor: Int? = null ; private val YEAR_TEXT_COLOR : Int = R .color.cblack
37
+ private var yearTextSize: Float? = null ; private val YEAR_TEXT_SIZE : Float = 16f
38
+ private var yearTextFont: Int? = null ; private val YEAR_TEXT_FONT : Int = R .font.pfd_cond_regular
39
+
40
+ // Back Button //Default
41
+ private var isBackButtonShow: Boolean? = null ; private var IS_BACK_BUTTON_SHOW : Boolean = true
42
+ private var backButtonBg: Int? = null ; private var BACK_BUTTON_BG : Int = R .drawable.back_icon
26
43
27
44
// Background //Default
28
45
private var cv_bg: Int? = null ; private var CALENDER_VIEW_BG : Int = R .drawable.rect_lr_wround_bg
29
46
30
47
// Month //Default
31
48
private var month_font: Int? = null ; private var MONTH_FONT : Int = R .font.pfd_cond_regular
32
- private var month_txt_clr: Int? = null ; private var MONTH_TEXT_COLOR : Int = R .color.cblack
33
- private var month_txt_size: Int? = null ; private var MONTH_TEXT_SIZE : Int = 16
49
+ private var month_txt_size: Float? = null ; private var MONTH_TEXT_SIZE : Float = 16f
34
50
private var month_selected_txt_clr: Int? = null ; private var MONTH_SELECTED_TEXT_COLOR : Int = R .color.cblack
35
51
private var month_unselected_txt_clr: Int? = null ; private var MONTH_UNSELECTED_TEXT_COLOR : Int = R .color.greyed_out
36
- private var month_bg: Int? = null ; private var MONTH_BG : Int = R .color.cwhite
52
+ private var month_bg: Int? = null ; private var MONTH_BG : Int = android. R .color.transparent
37
53
38
54
// Week //Default
39
- private var week_font: Int? = null ; private var WEEK_TEXT_COLOR : Int = R .color.cblack
40
- private var week_txt_clr: Int? = null ; private var WEEK_BG_COLOR : Int = R .color.cwhite
41
- private var week_bg_clr: Int? = null ; private var WEEK_FONT : Int = R .font.pfd_cond_regular
42
- private var week_txt_size: Int ? = null ; private var WEEK_TEXT_SIZE : Int = 16
55
+ private var week_font: Int? = null ; private var WEEK_FONT : Int = R .font.pfd_cond_regular
56
+ private var week_txt_clr: Int? = null ; private var WEEK_TEXT_COLOR : Int = R .color.cblack
57
+ private var week_bg_clr: Int? = null ; private var WEEK_BG_COLOR : Int = android. R .color.transparent
58
+ private var week_txt_size: Float ? = null ; private var WEEK_TEXT_SIZE : Float = 16f
43
59
44
60
// Day //Default
45
61
private var day_font: Int? = null ; private var DAY_FONT : Int = R .font.pfd_cond_regular
46
- private var day_size: Int ? = null ; private var DAY_BG : Int = R .color.summer
47
- private var day_bg: Int? = null ; private var DAY_SIZE : Int = 14
62
+ private var day_size: Float ? = null ; private var DAY_SIZE : Float = 14f
63
+ private var day_bg: Int? = null ; private var DAY_BG : Int = android. R .color.transparent
48
64
private var day_txt_clr: Int? = null ; private var DAY_TEXT_COLOR : Int = R .color.cblack
49
- private var day_txt_size: Int ? = null ; private var DAY_TEXT_SIZE : Int = 14
65
+ private var day_txt_size: Float ? = null ; private var DAY_TEXT_SIZE : Float = 14f
50
66
private var day_selected_txt_clr: Int? = null ; private var DAY_SELECTED_TEXT_COLOR : Int = R .color.cwhite
51
- private var day_selected_bg: Int? = null ; private var DAY_SELECTED_BG : Int = R .color.cblack
67
+ private var day_selected_bg: Int? = null ; private var DAY_SELECTED_BG : Int = R .drawable.ic_black_oval
52
68
53
69
// internal components
54
70
private var yearLayout: RelativeLayout ? = null
@@ -106,38 +122,39 @@ class CalendarView : LinearLayout, CalenderViewInterface {
106
122
buildCalendar()
107
123
}
108
124
125
+ @SuppressLint(" ResourceAsColor" )
109
126
private fun loadDateFormat (attrs : AttributeSet ? ) {
110
127
val calenderViewAttr = context.obtainStyledAttributes(attrs, R .styleable.CalendarView )
111
128
try {
112
129
// Date Formate
113
- dateFormat = calenderViewAttr.getString(R .styleable.CalendarView_dateFormat )
130
+ yearDateFormat = calenderViewAttr.getString(R .styleable.CalendarView_year_date_Formate )
131
+ yearTextFont = calenderViewAttr.getResourceId(R .styleable.CalendarView_year_text_font ,YEAR_TEXT_FONT )
132
+ yearTextColor = calenderViewAttr.getResourceId(R .styleable.CalendarView_year_text_clr ,YEAR_TEXT_COLOR )
133
+ yearTextSize = calenderViewAttr.getDimension(R .styleable.CalendarView_year_text_size ,YEAR_TEXT_SIZE )
134
+ // Back
135
+ isBackButtonShow = calenderViewAttr.getBoolean(R .styleable.CalendarView_is_back_button_show ,IS_BACK_BUTTON_SHOW )
136
+ backButtonBg = calenderViewAttr.getResourceId(R .styleable.CalendarView_back_button_bg ,BACK_BUTTON_BG )
114
137
// Background
115
138
cv_bg = calenderViewAttr.getResourceId(R .styleable.CalendarView_cv_bg , CALENDER_VIEW_BG )
116
- /*
117
139
// Month
118
- dateFormat = calenderViewAttr.getString(R.styleable.CalendarView_dateFormat)
119
- month_font = calenderViewAttr.getResourceId(R.styleable.CalendarView_month_font, MONTH_FONT)
120
- month_txt_clr = calenderViewAttr.getResourceId(R.styleable.CalendarView_month_txt_clr, MONTH_TEXT_COLOR)
121
- month_txt_size = calenderViewAttr.getResourceId(R.styleable.CalendarView_month_txt_size, MONTH_TEXT_SIZE)
140
+ month_font = calenderViewAttr.getResourceId(R .styleable.CalendarView_month_font ,MONTH_FONT )
141
+ month_txt_size = calenderViewAttr.getDimension(R .styleable.CalendarView_month_txt_size , MONTH_TEXT_SIZE )
122
142
month_selected_txt_clr = calenderViewAttr.getResourceId(R .styleable.CalendarView_month_selected_txt_clr , MONTH_SELECTED_TEXT_COLOR )
123
143
month_unselected_txt_clr = calenderViewAttr.getResourceId(R .styleable.CalendarView_month_unselect_txt_clr , MONTH_UNSELECTED_TEXT_COLOR )
124
144
month_bg = calenderViewAttr.getResourceId(R .styleable.CalendarView_month_bg , MONTH_BG )
125
145
// Week
126
- week_font = calenderViewAttr.getResourceId(R.styleable.CalendarView_week_font, WEEK_FONT)
146
+ week_font = calenderViewAttr.getResourceId(R .styleable.CalendarView_week_font ,WEEK_FONT )
127
147
week_txt_clr = calenderViewAttr.getResourceId(R .styleable.CalendarView_week_txt_clr , WEEK_TEXT_COLOR )
128
148
week_bg_clr = calenderViewAttr.getResourceId(R .styleable.CalendarView_week_bg_clr , WEEK_BG_COLOR )
129
- week_txt_size = calenderViewAttr.getResourceId (R.styleable.CalendarView_week_txt_size, WEEK_TEXT_SIZE)
149
+ week_txt_size = calenderViewAttr.getDimension (R .styleable.CalendarView_week_txt_size , WEEK_TEXT_SIZE )
130
150
// Day
131
- day_font = calenderViewAttr.getResourceId(R.styleable.CalendarView_day_font, DAY_FONT)
132
- day_size = calenderViewAttr.getResourceId (R.styleable.CalendarView_day_size, DAY_SIZE)
151
+ day_font = calenderViewAttr.getResourceId(R .styleable.CalendarView_day_font ,DAY_FONT )
152
+ day_size = calenderViewAttr.getDimension (R .styleable.CalendarView_day_size , DAY_SIZE )
133
153
day_txt_clr = calenderViewAttr.getResourceId(R .styleable.CalendarView_day_txt_clr , DAY_TEXT_COLOR )
134
- day_txt_size = calenderViewAttr.getResourceId (R.styleable.CalendarView_day_text_size, DAY_TEXT_SIZE)
154
+ day_txt_size = calenderViewAttr.getDimension (R .styleable.CalendarView_day_text_size , DAY_TEXT_SIZE )
135
155
day_bg = calenderViewAttr.getResourceId(R .styleable.CalendarView_day_bg , DAY_BG )
136
- day_select_bg = calenderViewAttr.getResourceId(R.styleable.CalendarView_day_select_bg, DAY_SELECTED_BG)
156
+ day_selected_bg = calenderViewAttr.getResourceId(R .styleable.CalendarView_day_select_bg , DAY_SELECTED_BG )
137
157
day_selected_txt_clr = calenderViewAttr.getResourceId(R .styleable.CalendarView_day_select_txt_clr , DAY_SELECTED_TEXT_COLOR )
138
-
139
- */
140
-
141
158
} finally {
142
159
calenderViewAttr.recycle()
143
160
}
@@ -155,6 +172,14 @@ class CalendarView : LinearLayout, CalenderViewInterface {
155
172
calendarMonthRv = findViewById(R .id.calendar_month_rv)
156
173
calendarMonthRv!! .setHasFixedSize(true )
157
174
calendarMonthRv!! .layoutManager = LinearLayoutManager (context,LinearLayoutManager .HORIZONTAL ,false )
175
+ withBackButton(isBackButtonShow,backButtonBg)
176
+ withYearPanel(yearDateFormat,yearTextColor,yearTextSize,yearTextFont)
177
+ withMonthPanel(month_font,month_txt_size,month_selected_txt_clr,month_unselected_txt_clr,month_bg, months)
178
+ withWeekPanel(week_font,week_txt_clr,week_txt_size,week_bg_clr, weekDays)
179
+ withDayPanel(day_font,day_txt_clr,day_txt_size,day_selected_txt_clr,day_selected_bg,day_bg)
180
+ cv_bg?.let {
181
+ this .setBackgroundResource(it)
182
+ }
158
183
}
159
184
160
185
override fun onMonthClick (view : View ? , month : String , position : Int ) {
@@ -195,7 +220,7 @@ class CalendarView : LinearLayout, CalenderViewInterface {
195
220
adapterMonth = MonthAdapter (context,this ,monthConfig,Util .months,monthNumber)
196
221
calendarMonthRv!! .adapter = adapterMonth
197
222
198
- val sdfYear = if (dateFormat != null ) SimpleDateFormat (dateFormat ) else SimpleDateFormat (DATE_FORMAT )
223
+ val sdfYear = if (yearDateFormat != null ) SimpleDateFormat (yearDateFormat ) else SimpleDateFormat (YEAR_DATE_FORMAT )
199
224
yearTv!! .text = sdfYear.format(currentDate.time)
200
225
201
226
// set header color according to current season
@@ -223,14 +248,15 @@ class CalendarView : LinearLayout, CalenderViewInterface {
223
248
return this
224
249
}
225
250
226
- override fun withBackButton (isShow : Boolean , background : Int? ): CalendarView {
251
+ override fun withBackButton (isShow : Boolean? , background : Int? ): CalendarView {
227
252
background?.let {
228
253
backIv!! .setImageResource(it)
229
254
}
230
- if (isShow){
231
- backIv!! .visibility = View .VISIBLE
232
- }else {
233
- backIv!! .visibility = View .INVISIBLE
255
+ isShow?.let {
256
+ if (it)
257
+ backIv!! .visibility = View .VISIBLE
258
+ else
259
+ backIv!! .visibility = View .INVISIBLE
234
260
}
235
261
backIv!! .setOnClickListener { view ->
236
262
eventHandler?.onBackClick(view)
@@ -247,18 +273,22 @@ class CalendarView : LinearLayout, CalenderViewInterface {
247
273
override fun withYearPanel (
248
274
dateFormat : String? ,
249
275
textColor : Int? ,
250
- textSize : Int ? ,
276
+ textSize : Float ? ,
251
277
font : Int?
252
278
): CalendarView {
253
- this .dateFormat = dateFormat
279
+ this .yearDateFormat = dateFormat
254
280
textSize?.let {
255
- yearTv!! .textSize = it.toFloat()
281
+ yearTv!! .textSize = it
256
282
}
257
283
textColor?.let { clr ->
258
284
yearTv!! .setTextColor(ContextCompat .getColor(context, clr))
259
285
}
260
286
font?.let {
261
- yearTv!! .typeface = ResourcesCompat .getFont(context, it)
287
+ try {
288
+ yearTv!! .typeface = ResourcesCompat .getFont(context, it)
289
+ }catch (e: Exception ){
290
+ Log .e(TAG , " $font not found!" )
291
+ }
262
292
}
263
293
return this
264
294
}
@@ -275,28 +305,23 @@ class CalendarView : LinearLayout, CalenderViewInterface {
275
305
276
306
override fun withMonthPanel (
277
307
font : Int? ,
278
- textSize : Int ? ,
308
+ textSize : Float ? ,
279
309
selectedTextColor : Int? ,
280
310
unSelectedTextColor : Int? ,
281
311
background : Int? ,
282
312
months : ArrayList <String >?
283
313
): CalendarView {
284
- if (months != null ) {
285
- Util .months = months
286
- }
287
314
month_font = font
288
315
month_txt_size = textSize
289
316
month_selected_txt_clr = selectedTextColor
290
317
month_unselected_txt_clr = unSelectedTextColor
291
318
month_bg = background
319
+ if (months != null ) Util .months = months
292
320
monthConfig.mBg = month_bg
293
321
monthConfig.mSelectedClr = month_selected_txt_clr
294
322
monthConfig.mUnSelectedClr = month_unselected_txt_clr
295
323
monthConfig.mFont = month_font
296
324
monthConfig.mTxtSize = month_txt_size
297
- month_font?.let {
298
- yearTv!! .typeface = ResourcesCompat .getFont(context, it)
299
- }
300
325
month_bg?.let {
301
326
calendarMonthRv!! .background = ContextCompat .getDrawable(context, it)
302
327
}
@@ -313,7 +338,7 @@ class CalendarView : LinearLayout, CalenderViewInterface {
313
338
return this
314
339
}
315
340
316
- override fun withWeekPanel (font : Int? , textColor : Int? , textSize : Int ? , background : Int? ,weekDays : ArrayList <String >? ): CalendarView {
341
+ override fun withWeekPanel (font : Int? , textColor : Int? , textSize : Float ? , background : Int? ,weekDays : ArrayList <String >? ): CalendarView {
317
342
if (weekDays != null ) {
318
343
Util .weekDays = weekDays
319
344
}
@@ -323,16 +348,17 @@ class CalendarView : LinearLayout, CalenderViewInterface {
323
348
week_bg_clr = background
324
349
325
350
var i = 0
326
-
327
351
weekLayout!! .children.iterator().forEach {
328
352
week_font?.let { font ->
329
- (it as TextView ).typeface = ResourcesCompat .getFont(context, font)
353
+ try {
354
+ (it as TextView ).typeface = ResourcesCompat .getFont(context, font)
355
+ }catch (e: Exception ){ Log .e(TAG , " $font not found!" ) }
330
356
}
331
357
week_txt_clr?.let { clr ->
332
358
(it as TextView ).setTextColor(ContextCompat .getColor(context, clr))
333
359
}
334
360
week_txt_size?.let { size ->
335
- (it as TextView ).setTextSize(size.toFloat() )
361
+ (it as TextView ).setTextSize(size)
336
362
}
337
363
(it as TextView ).text = Util .weekDays[i]
338
364
i++
@@ -358,7 +384,7 @@ class CalendarView : LinearLayout, CalenderViewInterface {
358
384
override fun withDayPanel (
359
385
font : Int? ,
360
386
textColor : Int? ,
361
- textSize : Int ? ,
387
+ textSize : Float ? ,
362
388
selectedTextColor : Int? ,
363
389
selectedBackground : Int? ,
364
390
background : Int?
0 commit comments