Skip to content

Commit

Permalink
feat: Add sorting functionality for player statistics
Browse files Browse the repository at this point in the history
  • Loading branch information
NicKoehler committed Feb 17, 2025
1 parent 0b6067c commit 5416e4f
Show file tree
Hide file tree
Showing 14 changed files with 557 additions and 49 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ permissions:
contents: write

jobs:
build:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout project
Expand Down
2 changes: 1 addition & 1 deletion PRIVACY_POLICY.md → PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
Welcome to the Brawlhalla Stats app for Android!

This open-source Android application is developed by NicKoehler.
The source code is available on GitHub under the MIT License.
The source code is available on GitHub under the GPL3 License.

## Data Collection and Usage

Expand Down
6 changes: 3 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ android {
applicationId = "com.nickoehler.brawlhalla"
minSdk = 26
targetSdk = 35
versionCode = 1
versionName = "0.0.1"
versionCode = 2
versionName = "0.0.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

Expand Down Expand Up @@ -117,4 +117,4 @@ dependencies {
implementation(libs.androidx.room.ktx)
implementation(libs.aboutlibraries.compose.m3)
ksp(libs.androidx.room.compiler)
}
}
13 changes: 4 additions & 9 deletions app/src/main/java/com/nickoehler/brawlhalla/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import com.nickoehler.brawlhalla.info.presentation.screens.InfoScreen
import com.nickoehler.brawlhalla.info.presentation.screens.LicensesScreen
import com.nickoehler.brawlhalla.legends.presentation.LegendsViewModel
import com.nickoehler.brawlhalla.legends.presentation.screens.AdaptiveLegendsPane
import com.nickoehler.brawlhalla.ranking.presentation.StatDetailAction
import com.nickoehler.brawlhalla.ranking.presentation.StatDetailViewModel
import com.nickoehler.brawlhalla.ranking.presentation.screens.AdaptiveRankingPane
import com.nickoehler.brawlhalla.ranking.presentation.screens.StatDetailScreen
Expand Down Expand Up @@ -128,19 +127,15 @@ class MainActivity : ComponentActivity() {

StatDetailScreen(
state,
onStatDetailAction = { action ->
statDetailViewModel.onStatDetailAction(action)
if (action is StatDetailAction.SelectClan) {
navController.navigate(
Route.Clan(action.clanId)
)
}
},
onStatDetailAction = statDetailViewModel::onStatDetailAction,
onBack = { navController.popBackStack() },
events = statDetailViewModel.uiEvents,
onPlayerSelection = { brawlhallaId ->
navController.navigate(Route.Stat(brawlhallaId))
},
onClanSelection = { clanId ->
navController.navigate(Route.Clan(clanId))
}
)
}
composable<Route.Rankings> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.nickoehler.brawlhalla.core.presentation.components

import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.Mode
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.nickoehler.brawlhalla.ui.theme.BrawlhallaTheme

@Composable
fun CustomSortDropDownMenu(
modifier: Modifier = Modifier,
reversed: Boolean,
expanded: Boolean,
icon: ImageVector,
onSortClick: () -> Unit,
onReversedClick: () -> Unit,
selected: @Composable () -> Unit,
content: @Composable (ColumnScope.() -> Unit),
) {
val rotation by animateFloatAsState(if (reversed) 180f else 0f)

Box(
modifier = modifier,
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Row(
modifier = Modifier
.clip(CircleShape)
.clickable { onSortClick() }
.background(MaterialTheme.colorScheme.surfaceContainer)
.padding(16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(icon, null)
selected()
}
IconButton(
onReversedClick,
modifier = Modifier
.clip(CircleShape)
.background(MaterialTheme.colorScheme.surfaceContainer)
) {
Icon(
Icons.Default.KeyboardArrowDown,
null,
modifier = Modifier
.rotate(rotation)
)
}
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { onSortClick() }
) {
content()
}
}
}

@Preview
@Composable
private fun CustomSortDropDownMenuPreview() {
BrawlhallaTheme {
Surface {
CustomSortDropDownMenu(
reversed = true,
expanded = true,
icon = Icons.Default.Mode,
selected = {
Text("test")
},
onSortClick = {},
onReversedClick = {},
) {
Text("test")
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,12 @@ package com.nickoehler.brawlhalla.legends.presentation.models

import android.content.Context
import com.nickoehler.brawlhalla.R
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingLegendUi
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingUi
import com.nickoehler.brawlhalla.ranking.presentation.models.StatLegendUi

enum class FilterOptions {
WEAPONS,
STATS
}

sealed interface RankingModalType {
data class StatLegend(val statLegend: StatLegendUi) : RankingModalType
data class Team(val team: RankingUi.RankingTeamUi) : RankingModalType
data class RankingLegend(val legend: RankingLegendUi) : RankingModalType
}

fun FilterOptions.toLocalizedString(context: Context): String {
return context.getString(
when (this) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package com.nickoehler.brawlhalla.ranking.presentation

import com.nickoehler.brawlhalla.legends.presentation.models.RankingModalType
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingFilterType
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingModalType
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingSortType
import com.nickoehler.brawlhalla.ranking.presentation.models.StatFilterType
import com.nickoehler.brawlhalla.ranking.presentation.models.StatType

sealed interface StatDetailAction {
data class SelectPlayer(val brawlhallaId: Int) : StatDetailAction
data class SelectStatType(val stat: StatType) : StatDetailAction
data class SelectClan(val clanId: Int) : StatDetailAction
data class SelectRankingFilterType(val type: RankingFilterType) : StatDetailAction
data class SelectStatFilterType(val type: StatFilterType) : StatDetailAction
data class TogglePlayerFavorites(val brawlhallaId: Int, val name: String) : StatDetailAction
data class SelectRankingModalType(val modalType: RankingModalType?) : StatDetailAction
data class SortBy(val sortType: RankingSortType) : StatDetailAction
data object StatLegendSortTypeReversed : StatDetailAction
data object RankingLegendSortTypeReversed : StatDetailAction
data object TeamSortTypeReversed : StatDetailAction
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.nickoehler.brawlhalla.ranking.presentation

import androidx.compose.runtime.Immutable
import com.nickoehler.brawlhalla.legends.presentation.models.RankingModalType
import com.nickoehler.brawlhalla.ranking.presentation.models.GeneralRankingSortType
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingDetailUi
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingFilterType
import com.nickoehler.brawlhalla.ranking.presentation.models.RankingModalType
import com.nickoehler.brawlhalla.ranking.presentation.models.StatDetailUi
import com.nickoehler.brawlhalla.ranking.presentation.models.StatFilterType
import com.nickoehler.brawlhalla.ranking.presentation.models.StatLegendSortType
import com.nickoehler.brawlhalla.ranking.presentation.models.StatType

@Immutable
Expand All @@ -22,4 +24,12 @@ data class StatDetailState(
val selectedRankingFilterType: RankingFilterType = RankingFilterType.Stat,
val rankingEnabled: Boolean = true,
val modalType: RankingModalType? = null,

val statLegendSortType: StatLegendSortType = StatLegendSortType.Alpha,
val rankedLegendSortType: GeneralRankingSortType = GeneralRankingSortType.Alpha,
val teamSortType: GeneralRankingSortType = GeneralRankingSortType.Alpha,

val statLegendSortReversed: Boolean = false,
val rankedLegendSortReversed: Boolean = false,
val teamSortReversed: Boolean = false,
)
Loading

0 comments on commit 5416e4f

Please sign in to comment.