diff --git a/.drone.yml b/.drone.yml index 1042e9f..195de40 100644 --- a/.drone.yml +++ b/.drone.yml @@ -32,34 +32,48 @@ steps: - ./gradlew assembleRelease - ./gradlew bundleRelease -- name: deploy latest build - image: curlimages/curl - environment: - SEAFILE_API_KEY: - from_secret: SeafileApiKey - APK_FILE: app/build/outputs/apk/release/app-release.apk - BUNDLE_FILE: app/build/outputs/bundle/release/app-release.aab - SEAFILE_REPO: 6debeef9-121e-46ba-acc7-81e109fdcbdd - commands: - - 'UPLOAD_URL=$(curl -H "Authorization: Token $SEAFILE_API_KEY" https://seafile.zobrist.me/api2/repos/$SEAFILE_REPO/upload-link/ | tr -d "\"")' - - echo $UPLOAD_URL - - 'curl -H "Authorization: Token $SEAFILE_API_KEY" -F file=@$APK_FILE -F parent_dir=/ -F relative_path=latest/ -F replace=1 "$UPLOAD_URL"' - - 'curl -H "Authorization: Token $SEAFILE_API_KEY" -F file=@$BUNDLE_FILE -F parent_dir=/ -F relative_path=latest/ -F replace=1 "$UPLOAD_URL"' +- name: upload latest apk + image: vividboarder/drone-webdav + settings: + file: app/build/outputs/apk/release/app-release.apk + destination: https://nextcloud.zobrist.me/remote.php/dav/files/deploy/TichuCounter/latest/app-release.apk + username: + from_secret: NextCloudUser + password: + from_secret: NextCloudPassword -- name: deploy tagged build - image: curlimages/curl - environment: - SEAFILE_API_KEY: - from_secret: SeafileApiKey - APK_FILE: app/build/outputs/apk/release/app-release.apk - BUNDLE_FILE: app/build/outputs/bundle/release/app-release.aab - SEAFILE_REPO: 6debeef9-121e-46ba-acc7-81e109fdcbdd - commands: - - 'UPLOAD_URL=$(curl -H "Authorization: Token $SEAFILE_API_KEY" https://seafile.zobrist.me/api2/repos/$SEAFILE_REPO/upload-link/ | tr -d "\"")' - - 'curl -H "Authorization: Token $SEAFILE_API_KEY" -F file=@$APK_FILE -F parent_dir=/ -F relative_path=tagged/$DRONE_TAG/ -F replace=1 "$UPLOAD_URL"' - - 'curl -H "Authorization: Token $SEAFILE_API_KEY" -F file=@$BUNDLE_FILE -F parent_dir=/ -F relative_path=tagged/$DRONE_TAG/ -F replace=1 "$UPLOAD_URL"' - - 'curl -d "operation=rename&newname=app-release$DRONE_TAG.apk" -H "Authorization: Token $SEAFILE_API_KEY" https://seafile.zobrist.me/api2/repos/$SEAFILE_REPO/file/?p=/tagged/$DRONE_TAG/app-release.apk' - - 'curl -d "operation=rename&newname=app-release$DRONE_TAG.aab" -H "Authorization: Token $SEAFILE_API_KEY" https://seafile.zobrist.me/api2/repos/$SEAFILE_REPO/file/?p=/tagged/$DRONE_TAG/app-release.aab' +- name: upload latest bundle + image: vividboarder/drone-webdav + settings: + file: app/build/outputs/bundle/release/app-release.aab + destination: https://nextcloud.zobrist.me/remote.php/dav/files/deploy/TichuCounter/latest/app-release.aab + username: + from_secret: NextCloudUser + password: + from_secret: NextCloudPassword + +- name: upload tagged apk + image: vividboarder/drone-webdav + settings: + file: app/build/outputs/apk/release/app-release.apk + destination: 'https://nextcloud.zobrist.me/remote.php/dav/files/deploy/TichuCounter/tagged/app-release$DRONE_TAG.apk' + username: + from_secret: NextCloudUser + password: + from_secret: NextCloudPassword + when: + event: + - tag + +- name: upload tagged bundle + image: vividboarder/drone-webdav + settings: + file: app/build/outputs/bundle/release/app-release.aab + destination: 'https://nextcloud.zobrist.me/remote.php/dav/files/deploy/TichuCounter/tagged/app-release$DRONE_TAG.aab' + username: + from_secret: NextCloudUser + password: + from_secret: NextCloudPassword when: event: - tag diff --git a/app/build.gradle b/app/build.gradle index f1eb6f9..663caf8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ def keystoreProperties = new Properties() def versionProperties = new Properties() def versionMajor = 2 -def versionMinor = 1 +def versionMinor = 2 // Load your keystore.properties file into the keystoreProperties object. keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) @@ -32,7 +32,7 @@ android { targetSdkVersion 33 versionCode versionProperties["versionCode"].toInteger() versionName "${versionMajor}.${versionMinor}.${versionProperties["versionCode"].toInteger()}" - resConfigs 'de', 'en' + resourceConfigurations += ['de', 'en'] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables { @@ -68,7 +68,7 @@ android { } composeOptions { - kotlinCompilerExtensionVersion = "1.3.2" + kotlinCompilerExtensionVersion = "1.4.7" } compileOptions { @@ -89,9 +89,9 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.9.0' - implementation 'androidx.appcompat:appcompat:1.6.0-rc01' - implementation "androidx.compose.material3:material3:1.0.1" + implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation "androidx.compose.material3:material3:1.1.0" implementation 'com.google.android.play:core-ktx:1.8.1' implementation 'com.google.android.play:core-ktx:1.8.1' implementation 'com.google.code.gson:gson:2.9.0' @@ -99,32 +99,32 @@ dependencies { implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' - implementation 'androidx.fragment:fragment-ktx:1.5.5' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' + implementation 'androidx.fragment:fragment-ktx:1.5.7' implementation 'androidx.preference:preference-ktx:1.2.0' - implementation 'androidx.recyclerview:recyclerview:1.2.1' - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' - implementation 'androidx.compose.material:material-icons-extended:1.3.1' + implementation 'androidx.recyclerview:recyclerview:1.3.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' + implementation 'androidx.compose.material:material-icons-extended:1.4.3' implementation "com.google.accompanist:accompanist-systemuicontroller:0.27.0" - implementation 'androidx.activity:activity-compose:1.6.1' - implementation "androidx.compose.ui:ui:1.3.3" - implementation "androidx.compose.ui:ui-tooling-preview:1.3.3" - implementation "androidx.compose.runtime:runtime-livedata:1.3.3" + implementation 'androidx.activity:activity-compose:1.7.2' + implementation "androidx.compose.ui:ui:1.4.3" + implementation "androidx.compose.ui:ui-tooling-preview:1.4.3" + implementation "androidx.compose.runtime:runtime-livedata:1.4.3" implementation "androidx.navigation:navigation-compose:2.5.3" - implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1" testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation "com.google.dagger:hilt-android:2.44" - androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.3.3" - debugImplementation "androidx.compose.ui:ui-tooling:1.3.3" - debugImplementation "androidx.compose.ui:ui-test-manifest:1.3.3" + androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.4.3" + debugImplementation "androidx.compose.ui:ui-tooling:1.4.3" + debugImplementation "androidx.compose.ui:ui-test-manifest:1.4.3" kapt "com.google.dagger:hilt-compiler:2.44" - implementation "androidx.room:room-runtime:2.5.0" - annotationProcessor "androidx.room:room-compiler:2.5.0" - kapt "androidx.room:room-compiler:2.5.0" - implementation "androidx.room:room-ktx:2.5.0" + implementation "androidx.room:room-runtime:2.5.1" + annotationProcessor "androidx.room:room-compiler:2.5.1" + kapt "androidx.room:room-compiler:2.5.1" + implementation "androidx.room:room-ktx:2.5.1" implementation "androidx.multidex:multidex:2.0.1" api "androidx.navigation:navigation-fragment-ktx:2.5.3" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index df25535..35a488c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,6 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:localeConfig="@xml/locales_config" - android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> { @Query("UPDATE game SET active = 0 WHERE uid is not :gameId;") fun setOthersInactive(gameId: Long) + @Query("SELECT names FROM (SELECT nameA AS names FROM game UNION ALL SELECT nameB AS names FROM game) GROUP BY names") + fun getDistinctTeamNames(): Flow> + } \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt b/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt index 314c8af..a4face9 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/entity/Game.kt @@ -2,7 +2,7 @@ package me.zobrist.tichucounter.data.entity import androidx.room.Entity import androidx.room.PrimaryKey -import java.util.* +import java.util.Date @Entity data class Game( diff --git a/app/src/main/java/me/zobrist/tichucounter/domain/NavExtensions.kt b/app/src/main/java/me/zobrist/tichucounter/domain/NavExtensions.kt index 31b0240..a6fdf6d 100644 --- a/app/src/main/java/me/zobrist/tichucounter/domain/NavExtensions.kt +++ b/app/src/main/java/me/zobrist/tichucounter/domain/NavExtensions.kt @@ -1,7 +1,11 @@ package me.zobrist.tichucounter.domain import androidx.compose.runtime.Composable -import androidx.navigation.* +import androidx.navigation.NamedNavArgument +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavController +import androidx.navigation.NavDeepLink +import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable fun NavController.navigate(route: Route) { diff --git a/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt b/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt index 78e5bb3..ce01b3c 100644 --- a/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt +++ b/app/src/main/java/me/zobrist/tichucounter/repository/GameRepository.kt @@ -13,7 +13,7 @@ import me.zobrist.tichucounter.data.GameWithScores import me.zobrist.tichucounter.data.RoundDao import me.zobrist.tichucounter.data.entity.Game import me.zobrist.tichucounter.data.entity.Round -import java.util.* +import java.util.Date import javax.inject.Inject class GameRepository @Inject constructor( @@ -130,4 +130,8 @@ class GameRepository @Inject constructor( fun getAllWithRoundFlow(): Flow> { return gameDao.getGamesWithRounds() } + + fun getDistinctTeamNames(): Flow> { + return gameDao.getDistinctTeamNames() + } } \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/Theme.kt b/app/src/main/java/me/zobrist/tichucounter/ui/Theme.kt index bb0a5c7..11f0059 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/Theme.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/Theme.kt @@ -2,7 +2,11 @@ package me.zobrist.tichucounter.ui import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material3.* +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/about/AboutView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/about/AboutView.kt index eb9085c..9cd7c79 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/about/AboutView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/about/AboutView.kt @@ -2,14 +2,25 @@ package me.zobrist.tichucounter.ui.about import android.content.res.Configuration import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Mail import androidx.compose.material.icons.outlined.Shop -import androidx.compose.material3.* +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ShapeDefaults +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.Top import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource @@ -37,15 +48,19 @@ fun AboutView() { ) { - Row() { + Row { Image( modifier = Modifier - .height(80.dp) .padding(end = 10.dp) - .align(Top), - painter = painterResource(R.drawable.app_logo), + .align(Top) + .size(75.dp) + .background( + color = Color.Red, + shape = ShapeDefaults.Medium + ), + painter = painterResource(R.drawable.tichu_logo), contentDescription = null, - contentScale = ContentScale.Fit + contentScale = ContentScale.None ) Column { @@ -86,7 +101,7 @@ fun AboutView() { @Preview(name = "Dark Mode", uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true) @Composable fun AboutViewPreview() { - AppTheme() { + AppTheme { Surface { AboutView() } diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/composables/TypeaheadTextField.kt b/app/src/main/java/me/zobrist/tichucounter/ui/composables/TypeaheadTextField.kt new file mode 100644 index 0000000..5fcae12 --- /dev/null +++ b/app/src/main/java/me/zobrist/tichucounter/ui/composables/TypeaheadTextField.kt @@ -0,0 +1,100 @@ +package me.zobrist.tichucounter.ui.composables + +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldColors +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.input.key.key +import androidx.compose.ui.input.key.onKeyEvent +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.ImeAction + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class) +@Composable +fun TypeaheadTextField( + value: String, + items: List, + onValueChange: (String) -> Unit, + modifier: Modifier, + colors: TextFieldColors, + textStyle: TextStyle +) { + + var isFocused by remember { mutableStateOf(false) } + val focusManager = LocalFocusManager.current + + ExposedDropdownMenuBox( + expanded = isFocused, + modifier = modifier, + onExpandedChange = {} + ) { + + var dropDownWidth by remember { mutableStateOf(0) } + + TextField( + value = value, + textStyle = textStyle, + onValueChange = { + onValueChange(it) + }, + singleLine = true, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Done, + ), + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + } + ), + modifier = Modifier + .menuAnchor() + .onFocusChanged { + isFocused = it.isFocused + } + .onSizeChanged { dropDownWidth = it.width } + .onKeyEvent { event -> + if (event.key == Key.Back || event.key == Key.Enter) { + focusManager.clearFocus() + true + } else { + false + } + }, + colors = colors + ) + ExposedDropdownMenu( + expanded = isFocused && items.isNotEmpty(), + modifier = Modifier + .width(with(LocalDensity.current) { dropDownWidth.toDp() }), + onDismissRequest = { } + ) { + + items.forEach { + DropdownMenuItem( + onClick = { + onValueChange(it) + focusManager.clearFocus() + }, + text = { Text(it) }, + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterView.kt index a9b0497..a338d72 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterView.kt @@ -4,7 +4,11 @@ import android.content.res.Configuration import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.material3.Surface -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.platform.LocalConfiguration @@ -35,6 +39,8 @@ fun Landscape(viewModel: ICounterViewModel) { TeamNamesView( viewModel.teamNameA, viewModel.teamNameB, + viewModel.teamNameSuggestionsA, + viewModel.teamNameSuggestionsB, { viewModel.updateNameA(it) }, { viewModel.updateNameB(it) } ) @@ -64,6 +70,8 @@ fun Portrait(viewModel: ICounterViewModel) { TeamNamesView( viewModel.teamNameA, viewModel.teamNameB, + viewModel.teamNameSuggestionsA, + viewModel.teamNameSuggestionsB, { viewModel.updateNameA(it) }, { viewModel.updateNameB(it) } ) @@ -111,6 +119,10 @@ internal class PreviewViewModel : ICounterViewModel { override var activeValue: String = currentScoreA override var inactiveValue: String = currentScoreB override var keyboardHidden: Boolean = false + override val teamNameSuggestionsA: List = + listOf("TeamA", "asdffd", "TeamB", "really really long Team Name that is way too long") + override val teamNameSuggestionsB: List = + listOf("TeamA", "asdffd", "TeamB", "really really long Team Name that is way too long") override fun focusLastInput() { } diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterViewModel.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterViewModel.kt index 81bed74..751d186 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterViewModel.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterViewModel.kt @@ -55,6 +55,8 @@ interface ICounterViewModel : IKeyBoardViewModel { val totalScoreB: Int val teamNameA: String val teamNameB: String + val teamNameSuggestionsA: List + val teamNameSuggestionsB: List fun updateNameA(value: String) fun updateNameB(value: String) @@ -105,6 +107,12 @@ class CounterViewModel @Inject constructor( override var keyboardHidden by mutableStateOf(false) private set + override var teamNameSuggestionsA by mutableStateOf(listOf()) + private set + + override var teamNameSuggestionsB by mutableStateOf(listOf()) + private set + override var activeValue: String get() { return if (isBFocused) { @@ -144,6 +152,8 @@ class CounterViewModel @Inject constructor( private var deleteJob: Job? = null + private var distinctTeamNames = listOf() + init { viewModelScope.launch { gameRepository.getActiveGameFlow().collect { @@ -157,9 +167,20 @@ class CounterViewModel @Inject constructor( teamNameA = it.game.nameA teamNameB = it.game.nameB + + buildTeamNameSuggestions() + } } } + + viewModelScope.launch { + gameRepository.getDistinctTeamNames().collect { + distinctTeamNames = it + + buildTeamNameSuggestions() + } + } } override fun focusLastInput() { @@ -255,12 +276,14 @@ class CounterViewModel @Inject constructor( } override fun updateNameA(value: String) { + teamNameA = value viewModelScope.launch { gameRepository.updateActiveTeamName(nameA = value) } } override fun updateNameB(value: String) { + teamNameB = value viewModelScope.launch { gameRepository.updateActiveTeamName(nameB = value) } @@ -324,4 +347,19 @@ class CounterViewModel @Inject constructor( } } } + + private fun buildTeamNameSuggestions() { + teamNameSuggestionsA = buildTypeaheadList(distinctTeamNames, teamNameA) + teamNameSuggestionsB = buildTypeaheadList(distinctTeamNames, teamNameB) + } + + private fun buildTypeaheadList(rawList: List, currentInput: String): List { + var filtered = rawList.filter { it.isNotEmpty() && it != currentInput } + + if (currentInput.isNotEmpty()) { + filtered = filtered.filter { it.contains(currentInput, ignoreCase = true) } + } + + return filtered.sorted().sortedBy { it.length }.take(10) + } } \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/KeyboardView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/KeyboardView.kt index a88778c..3ab3407 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/KeyboardView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/KeyboardView.kt @@ -251,7 +251,6 @@ fun KeyboardIconButton( } } -@OptIn(ExperimentalMaterial3Api::class) @Composable fun CenteredTextField( value: String, diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamNamesView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamNamesView.kt index 596c861..9527c73 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamNamesView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamNamesView.kt @@ -2,46 +2,53 @@ package me.zobrist.tichucounter.ui.counter import android.content.res.Configuration import androidx.compose.foundation.layout.* - import androidx.compose.material3.* -import androidx.compose.runtime.Composable +import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import me.zobrist.tichucounter.ui.AppTheme +import me.zobrist.tichucounter.ui.composables.TypeaheadTextField -@OptIn(ExperimentalMaterial3Api::class) @Composable fun TeamNamesView( nameA: String, nameB: String, + nameSuggestionsA: List, + nameSuggestionsB: List, updateA: (String) -> Unit, updateB: (String) -> Unit ) { - val color = TextFieldDefaults.textFieldColors( - containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp) + val containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp) + val color = TextFieldDefaults.colors( + focusedContainerColor = containerColor, + unfocusedContainerColor = containerColor, + disabledContainerColor = containerColor, ) Row { - TextField( + + TypeaheadTextField( value = nameA, - textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center), + items = nameSuggestionsA, onValueChange = { updateA(it) }, - singleLine = true, modifier = Modifier.weight(1f), - colors = color + colors = color, + textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center) ) - TextField( + TypeaheadTextField( value = nameB, - textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center), + items = nameSuggestionsB, onValueChange = { updateB(it) }, - singleLine = true, modifier = Modifier.weight(1f), - colors = color + colors = color, + textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center) ) + + } } @@ -50,6 +57,6 @@ fun TeamNamesView( @Composable private fun TeamNamesViewPreview() { AppTheme { - TeamNamesView("TeamA", "TeamB", {}, {}) + TeamNamesView("TeamA", "TeamB", listOf("Test1", "Test3"), listOf("Test3", "Test5"), {}, {}) } } diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamScoresView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamScoresView.kt index 30adac4..fb9d9f7 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamScoresView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/TeamScoresView.kt @@ -4,7 +4,11 @@ import android.content.res.Configuration import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding -import androidx.compose.material3.* +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt index 2dfc42e..fa6eabe 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/history/HistoryView.kt @@ -2,14 +2,31 @@ package me.zobrist.tichucounter.ui.history import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DeleteForever import androidx.compose.material.icons.outlined.MoreVert -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -23,7 +40,8 @@ import me.zobrist.tichucounter.data.entity.Round import me.zobrist.tichucounter.domain.getTotalPoints import me.zobrist.tichucounter.ui.composables.DropDownMenu import java.text.DateFormat -import java.util.* +import java.util.Date +import java.util.Locale @Composable diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/layout/DrawerContent.kt b/app/src/main/java/me/zobrist/tichucounter/ui/layout/DrawerContent.kt index e025a4a..1dd1b55 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/layout/DrawerContent.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/layout/DrawerContent.kt @@ -16,7 +16,6 @@ import me.zobrist.tichucounter.domain.* import me.zobrist.tichucounter.ui.AppTheme import me.zobrist.tichucounter.ui.counter.* -@OptIn(ExperimentalMaterial3Api::class) @Composable fun DrawerContent( drawerItems: List, diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt b/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt index 38840be..bcdddf4 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/settings/SettingsView.kt @@ -8,8 +8,16 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowDropDown -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment.Companion.End import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource diff --git a/app/src/main/res/drawable/app_logo.png b/app/src/main/res/drawable/app_logo.png deleted file mode 100644 index 7681534..0000000 Binary files a/app/src/main/res/drawable/app_logo.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..e5cc68d --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,54 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/tichu_logo.xml b/app/src/main/res/drawable/tichu_logo.xml new file mode 100644 index 0000000..d91ec60 --- /dev/null +++ b/app/src/main/res/drawable/tichu_logo.xml @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index c9ad5f9..0648fb4 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index c9ad5f9..ac94b34 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index d5c3561..0ec5985 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 62e8f8e..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 69a212e..0ec5985 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 373dd9d..fdcbe44 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 416a89e..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 167fc6d..fdcbe44 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 6654c4f..f4fe3c7 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index ea422fa..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index b900d27..f4fe3c7 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 4ec20d0..83c9b55 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 1ed8456..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index cce4cea..83c9b55 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index b00cee0..5978362 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 82f96f6..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index c5a298c..5978362 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index ad9de19..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - #d50000 - - \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index d8bfdb7..939714f 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - @color/primaryColor + #DC0E00 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 30a2071..48012ba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,7 +19,7 @@ Delete history You really want to delete the the history? This action can\'t be undone. Cancel - Ok + OK Delete Delete all Current Game diff --git a/app/src/test/java/me/zobrist/tichucounter/TichuUnitTest.kt b/app/src/test/java/me/zobrist/tichucounter/TichuUnitTest.kt index c42f7e5..723277b 100644 --- a/app/src/test/java/me/zobrist/tichucounter/TichuUnitTest.kt +++ b/app/src/test/java/me/zobrist/tichucounter/TichuUnitTest.kt @@ -1,7 +1,9 @@ package me.zobrist.tichucounter import me.zobrist.tichucounter.domain.Tichu -import org.junit.Assert.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Test /** diff --git a/build.gradle b/build.gradle index 5f2692d..24af24d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext { - compose_version = '1.1.1' - } - ext.kotlin_version = "1.7.20" + ext.kotlin_version = "1.8.21" repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' + classpath 'com.android.tools.build:gradle:8.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle.properties b/gradle.properties index 30dbeb4..834a004 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,7 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=false # Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official \ No newline at end of file +kotlin.code.style=official +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=true +android.nonFinalResIds=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f9d4a26..4f7780d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip