Skip to content

Commit 7509ec2

Browse files
authored
Merge pull request #3 from commandiron/1.1.0-development
1.1.0 development
2 parents 6392f5d + bb517b1 commit 7509ec2

File tree

17 files changed

+826
-807
lines changed

17 files changed

+826
-807
lines changed

app/build.gradle

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ plugins {
44
}
55

66
android {
7-
compileSdk 32
7+
compileSdk 33
88

99
defaultConfig {
1010
applicationId "com.commandiron.wheelpickercompose"
1111
minSdk 23
12-
targetSdk 32
12+
targetSdk 33
1313
versionCode 1
1414
versionName "1.0"
1515

@@ -36,7 +36,7 @@ android {
3636
compose true
3737
}
3838
composeOptions {
39-
kotlinCompilerExtensionVersion compose_version
39+
kotlinCompilerExtensionVersion compose_compiler_version
4040
}
4141
packagingOptions {
4242
resources {
@@ -48,17 +48,17 @@ android {
4848
dependencies {
4949

5050
implementation 'androidx.core:core-ktx:1.7.0'
51-
implementation "androidx.compose.ui:ui:$compose_version"
51+
implementation "androidx.compose.ui:ui:$compose_ui_version"
5252
implementation "androidx.compose.material3:material3:1.0.0-alpha15"
53-
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
53+
implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
5454
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
5555
implementation 'androidx.activity:activity-compose:1.3.1'
5656
testImplementation 'junit:junit:4.13.2'
5757
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
5858
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
59-
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
60-
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
61-
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
59+
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version"
60+
debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version"
61+
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version"
6262

6363
implementation project(':wheel-picker-compose')
6464
// implementation 'com.github.commandiron:WheelPickerCompose:1.0.9'

app/src/main/java/com/commandiron/wheelpickercompose/MainActivity.kt

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import android.os.Bundle
55
import androidx.activity.ComponentActivity
66
import androidx.activity.compose.setContent
77
import androidx.annotation.RequiresApi
8-
import androidx.compose.foundation.layout.*
9-
import androidx.compose.material3.Card
8+
import androidx.compose.foundation.layout.Arrangement
9+
import androidx.compose.foundation.layout.Column
10+
import androidx.compose.foundation.layout.fillMaxSize
1011
import androidx.compose.material3.MaterialTheme
1112
import androidx.compose.material3.Surface
1213
import androidx.compose.ui.Alignment
1314
import androidx.compose.ui.Modifier
14-
import androidx.compose.ui.unit.dp
15-
import com.commandiron.wheel_picker_compose.*
15+
import com.commandiron.wheel_picker_compose.WheelDatePicker
16+
import com.commandiron.wheel_picker_compose.WheelDateTimePicker
17+
import com.commandiron.wheel_picker_compose.WheelTimePicker
1618
import com.commandiron.wheelpickercompose.ui.theme.WheelPickerComposeTheme
1719

1820
class MainActivity : ComponentActivity() {
@@ -29,28 +31,15 @@ class MainActivity : ComponentActivity() {
2931
horizontalAlignment = Alignment.CenterHorizontally,
3032
verticalArrangement = Arrangement.Center
3133
) {
32-
WheelDateTimePicker { snappedDateTime -> }
33-
WheelDatePicker { snappedDate -> }
34-
WheelTimePicker { snappedTime -> }
35-
WheelTextPicker(texts = (1..6).map { "Text $it" })
36-
WheelPicker(count = 6) { index, snappedIndex ->
37-
Card(Modifier.size(128.dp).padding(8.dp)) {}
34+
WheelTimePicker { snappedTime ->
35+
println(snappedTime)
36+
}
37+
WheelDatePicker { snappedDate ->
38+
println(snappedDate)
39+
}
40+
WheelDateTimePicker { snappedDateTime ->
41+
println(snappedDateTime)
3842
}
39-
// WheelDateTimePicker(
40-
// startDateTime = LocalDateTime.of(
41-
// 2025, 10, 30, 5, 0
42-
// ),
43-
// minYear = 1950,
44-
// maxYear = 2050,
45-
// disablePastDateTime = true,
46-
// size = DpSize(200.dp, 100.dp),
47-
// textStyle = MaterialTheme.typography.titleSmall,
48-
// textColor = Color(0xFFffc300),
49-
// selectorEnabled = true,
50-
// selectorShape = RoundedCornerShape(0.dp),
51-
// selectorColor = Color(0xFFf1faee).copy(alpha = 0.2f),
52-
// selectorBorder = BorderStroke(2.dp, Color(0xFFf1faee))
53-
// ) { snappedDateTime -> }
5443
}
5544
}
5645
}

build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
buildscript {
22
ext {
3-
compose_version = '1.1.1'
3+
compose_ui_version = '1.3.1'
4+
compose_compiler_version = '1.3.2'
45
}
56
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
67
plugins {
7-
id 'com.android.application' version '7.2.1' apply false
8-
id 'com.android.library' version '7.2.1' apply false
9-
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
8+
id 'com.android.application' version '7.3.0' apply false
9+
id 'com.android.library' version '7.3.0' apply false
10+
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
1011
}
1112

1213
task clean(type: Delete) {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Wed Sep 07 10:30:27 TRT 2022
1+
#Mon Nov 14 07:26:13 TRT 2022
22
distributionBase=GRADLE_USER_HOME
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
44
distributionPath=wrapper/dists
55
zipStorePath=wrapper/dists
66
zipStoreBase=GRADLE_USER_HOME

wheel-picker-compose/build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ plugins {
55
}
66

77
android {
8-
compileSdk 32
8+
compileSdk 33
99

1010
defaultConfig {
1111
minSdk 23
12-
targetSdk 32
12+
targetSdk 33
1313

1414
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1515
consumerProguardFiles "consumer-rules.pro"
@@ -36,12 +36,12 @@ android {
3636
compose true
3737
}
3838
composeOptions {
39-
kotlinCompilerExtensionVersion compose_version
39+
kotlinCompilerExtensionVersion compose_compiler_version
4040
}
4141
}
4242

4343
dependencies {
44-
implementation "androidx.compose.ui:ui:$compose_version"
44+
implementation "androidx.compose.ui:ui:$compose_ui_version"
4545
implementation "androidx.compose.material3:material3:1.0.0-alpha15"
4646

4747
implementation "dev.chrisbanes.snapper:snapper:0.3.0"
@@ -55,7 +55,7 @@ afterEvaluate {
5555

5656
groupId = 'com.github.commandiron'
5757
artifactId = 'wheel-picker-compose'
58-
version = '1.0.11'
58+
version = '1.1.0'
5959
}
6060
}
6161
}

wheel-picker-compose/src/main/java/com/commandiron/wheel_picker_compose/WheelDatePicker.kt

Lines changed: 20 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,17 @@ package com.commandiron.wheel_picker_compose
22

33
import android.os.Build
44
import androidx.annotation.RequiresApi
5-
import androidx.compose.foundation.BorderStroke
6-
import androidx.compose.foundation.layout.Box
7-
import androidx.compose.foundation.layout.Row
8-
import androidx.compose.foundation.layout.size
9-
import androidx.compose.foundation.shape.RoundedCornerShape
105
import androidx.compose.material3.LocalContentColor
116
import androidx.compose.material3.MaterialTheme
12-
import androidx.compose.material3.Surface
137
import androidx.compose.runtime.Composable
14-
import androidx.compose.runtime.mutableStateOf
15-
import androidx.compose.runtime.remember
16-
import androidx.compose.ui.Alignment
178
import androidx.compose.ui.Modifier
189
import androidx.compose.ui.graphics.Color
19-
import androidx.compose.ui.graphics.Shape
2010
import androidx.compose.ui.text.TextStyle
2111
import androidx.compose.ui.unit.DpSize
2212
import androidx.compose.ui.unit.dp
23-
import java.text.DateFormatSymbols
13+
import com.commandiron.wheel_picker_compose.core.DefaultWheelDatePicker
14+
import com.commandiron.wheel_picker_compose.core.SelectorProperties
15+
import com.commandiron.wheel_picker_compose.core.WheelPickerDefaults
2416
import java.time.LocalDate
2517

2618
@RequiresApi(Build.VERSION_CODES.O)
@@ -30,175 +22,26 @@ fun WheelDatePicker(
3022
startDate: LocalDate = LocalDate.now(),
3123
minYear: Int = 1922,
3224
maxYear: Int = 2122,
33-
disablePastDate: Boolean = false,
25+
backwardsDisabled: Boolean = false,
3426
size: DpSize = DpSize(256.dp, 128.dp),
3527
textStyle: TextStyle = MaterialTheme.typography.titleMedium,
3628
textColor: Color = LocalContentColor.current,
37-
selectorEnabled: Boolean = true,
38-
selectorShape: Shape = RoundedCornerShape(16.dp),
39-
selectorColor: Color = MaterialTheme.colorScheme.primary.copy(alpha = 0.2f),
40-
selectorBorder: BorderStroke? = BorderStroke(1.dp, MaterialTheme.colorScheme.primary),
41-
onScrollFinished: (snappedDate: LocalDate) -> Unit = {},
29+
selectorProperties: SelectorProperties = WheelPickerDefaults.selectorProperties(),
30+
onSnappedDate : (snappedDate: LocalDate) -> Unit = {}
4231
) {
43-
val dayTexts = remember { mutableStateOf((1..31).toList().map { it.toString() }) }
44-
val selectedDayOfMonth = remember { mutableStateOf(startDate.dayOfMonth)}
45-
46-
val monthTexts: List<String> = if(size.width / 3 < 55.dp){
47-
DateFormatSymbols().shortMonths.toList()
48-
}else{
49-
DateFormatSymbols().months.toList()
50-
}
51-
val selectedMonth = remember { mutableStateOf(startDate.month.value)}
52-
53-
val years = IntRange(
54-
start = minYear,
55-
endInclusive = maxYear,
56-
)
57-
val yearTexts = years.map { it.toString() }
58-
val selectedYear = remember { mutableStateOf(startDate.year)}
59-
60-
Box(modifier = modifier, contentAlignment = Alignment.Center){
61-
if(selectorEnabled){
62-
Surface(
63-
modifier = Modifier
64-
.size(size.width, size.height / 3),
65-
shape = selectorShape,
66-
color = selectorColor,
67-
border = selectorBorder
68-
) {}
32+
DefaultWheelDatePicker(
33+
modifier,
34+
startDate,
35+
minYear,
36+
maxYear,
37+
backwardsDisabled,
38+
size,
39+
textStyle,
40+
textColor,
41+
selectorProperties,
42+
onSnappedDate = { snappedDate ->
43+
onSnappedDate(snappedDate.snappedLocalDate)
44+
snappedDate.snappedIndex
6945
}
70-
Row {
71-
WheelTextPicker(
72-
size = DpSize(size.width / 3, size.height),
73-
texts = dayTexts.value,
74-
textStyle = textStyle,
75-
textColor = textColor,
76-
selectorEnabled = false,
77-
startIndex = startDate.dayOfMonth - 1,
78-
onScrollFinished = { selectedIndex ->
79-
try {
80-
81-
val selectedDate = LocalDate.of(
82-
selectedYear.value,
83-
selectedMonth.value,
84-
selectedIndex + 1
85-
)
86-
val isDateBefore = isDateBefore(selectedDate, startDate)
87-
88-
if(disablePastDate){
89-
if(!isDateBefore){
90-
selectedDayOfMonth.value = selectedIndex + 1
91-
}
92-
}else{
93-
selectedDayOfMonth.value = selectedIndex + 1
94-
}
95-
96-
onScrollFinished(
97-
LocalDate.of(
98-
selectedYear.value,
99-
selectedMonth.value,
100-
selectedDayOfMonth.value
101-
)
102-
)
103-
}catch (e: Exception){
104-
e.printStackTrace()
105-
}
106-
return@WheelTextPicker selectedDayOfMonth.value - 1
107-
}
108-
)
109-
WheelTextPicker(
110-
size = DpSize(size.width / 3, size.height),
111-
texts = monthTexts,
112-
textStyle = textStyle,
113-
textColor = textColor,
114-
selectorEnabled = false,
115-
startIndex = startDate.month.value - 1,
116-
onScrollFinished = { selectedIndex ->
117-
118-
dayTexts.value = calculateMonthDayTexts(selectedIndex + 1, selectedYear.value)
119-
120-
try {
121-
val selectedDate = LocalDate.of(
122-
selectedYear.value,
123-
selectedIndex + 1,
124-
selectedDayOfMonth.value
125-
)
126-
127-
val isDateBefore = isDateBefore(selectedDate, startDate)
128-
129-
if(disablePastDate){
130-
if(!isDateBefore){
131-
selectedMonth.value = selectedIndex + 1
132-
}else{
133-
dayTexts.value = calculateMonthDayTexts(selectedMonth.value, selectedYear.value)
134-
}
135-
}else{
136-
selectedMonth.value = selectedIndex + 1
137-
}
138-
139-
onScrollFinished(
140-
LocalDate.of(
141-
selectedYear.value,
142-
selectedMonth.value,
143-
selectedDayOfMonth.value
144-
)
145-
)
146-
}catch (e: Exception){
147-
selectedMonth.value = selectedIndex + 1
148-
e.printStackTrace()
149-
}
150-
return@WheelTextPicker selectedMonth.value - 1
151-
}
152-
)
153-
WheelTextPicker(
154-
size = DpSize(size.width / 3, size.height),
155-
texts = yearTexts,
156-
textStyle = textStyle,
157-
textColor = textColor,
158-
selectorEnabled = false,
159-
startIndex = if(years.indexOf(years.find { it == startDate.year }) == -1) {
160-
throw IllegalArgumentException(
161-
"startDate.year should greater than minYear and smaller than maxYear"
162-
)
163-
} else years.indexOf(years.find { it == startDate.year }),
164-
onScrollFinished = { selectedIndex ->
165-
dayTexts.value = calculateMonthDayTexts(selectedMonth.value, yearTexts[selectedIndex].toInt())
166-
try {
167-
val selectedDate = LocalDate.of(
168-
yearTexts[selectedIndex].toInt(),
169-
selectedMonth.value,
170-
selectedDayOfMonth.value
171-
)
172-
173-
val isDateBefore = isDateBefore(selectedDate, startDate)
174-
175-
if(disablePastDate){
176-
if(!isDateBefore){
177-
selectedYear.value = yearTexts[selectedIndex].toInt()
178-
}
179-
}else{
180-
selectedYear.value = yearTexts[selectedIndex].toInt()
181-
}
182-
183-
onScrollFinished(
184-
LocalDate.of(
185-
selectedYear.value,
186-
selectedMonth.value,
187-
selectedDayOfMonth.value
188-
)
189-
)
190-
}catch (e: Exception){
191-
selectedYear.value = yearTexts[selectedIndex].toInt()
192-
e.printStackTrace()
193-
}
194-
return@WheelTextPicker yearTexts.indexOf(selectedYear.value.toString())
195-
}
196-
)
197-
}
198-
}
199-
}
200-
201-
@RequiresApi(Build.VERSION_CODES.O)
202-
private fun isDateBefore(date: LocalDate, currentDate: LocalDate): Boolean{
203-
return date.isBefore(currentDate)
46+
)
20447
}

0 commit comments

Comments
 (0)