Skip to content

Commit 1f59b4c

Browse files
committed
Scoreboard(except onClick all done)
1 parent a86d30f commit 1f59b4c

12 files changed

Lines changed: 255 additions & 41 deletions

File tree

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package com.devcommop.joaquin.seceleaderboard.data.remote.custom
22

3+
import com.devcommop.joaquin.seceleaderboard.domain.util.SortHashMap
4+
35
data class ScoreboardResult(
46
// var list: List<ScoreboardRow>? = null,
57
val scores: HashMap<String, List<Int>> = hashMapOf<String, List<Int>>(),
6-
val totalScores: HashMap<String, Int> = hashMapOf<String, Int>(),
8+
var totalScores: HashMap<String, Int> = hashMapOf<String, Int>(),
79
var exception: Exception? = null
8-
)
10+
){
11+
fun sortTotalScores(){
12+
totalScores = SortHashMap.sortByValueDescending(totalScores)
13+
}
14+
}

app/src/main/java/com/devcommop/joaquin/seceleaderboard/data/repository/CFRepositoryImpl.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class CFRepositoryImpl @Inject constructor(
7676
scoreboardResult.exception = exception
7777
}
7878
Log.d(TAG, scoreboardResult.totalScores.toSortedMap().toString())
79+
scoreboardResult.sortTotalScores()
7980
return scoreboardResult
8081
}
8182

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.devcommop.joaquin.seceleaderboard.domain.util;
2+
3+
import java.util.Collections;
4+
import java.util.Comparator;
5+
import java.util.HashMap;
6+
import java.util.LinkedHashMap;
7+
import java.util.LinkedList;
8+
import java.util.List;
9+
import java.util.Map;
10+
11+
public class SortHashMap {
12+
13+
public static HashMap<String, Integer> sortByValueDescending(HashMap<String, Integer> hm) {
14+
//aim: convert the given map into list
15+
List<Map.Entry<String, Integer>> list = new LinkedList<Map.Entry<String, Integer>>(hm.entrySet());
16+
17+
//aim: sort the list
18+
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
19+
@Override
20+
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
21+
return o2.getValue().compareTo(o1.getValue());
22+
}
23+
});
24+
25+
//aim: convert this list into hashmap
26+
HashMap<String, Integer> ans = new LinkedHashMap<String, Integer>();
27+
for(Map.Entry<String, Integer> entryItem: list){
28+
ans.put(entryItem.getKey(), entryItem.getValue());
29+
}
30+
31+
//aim: return the answer
32+
return ans;
33+
}
34+
35+
}

app/src/main/java/com/devcommop/joaquin/seceleaderboard/presentation/MainActivity.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.navigation.compose.composable
1717
import androidx.navigation.compose.rememberNavController
1818
import androidx.navigation.navArgument
1919
import com.devcommop.joaquin.seceleaderboard.presentation.contest.ContestScreen
20+
import com.devcommop.joaquin.seceleaderboard.presentation.contestslist.ContestsListScreen
2021
import com.devcommop.joaquin.seceleaderboard.presentation.scoreboard.ScoreboardScreen
2122
import com.devcommop.joaquin.seceleaderboard.presentation.settings.SettingsScreen
2223
import com.devcommop.joaquin.seceleaderboard.presentation.ui.theme.BackgroundColor
@@ -64,6 +65,11 @@ class MainActivity : ComponentActivity() {
6465
){
6566
SettingsScreen(navController = navController)
6667
}
68+
composable(
69+
route = Screen.ContestsListScreen.route
70+
){
71+
ContestsListScreen(navController = navController)
72+
}
6773
}
6874
}
6975
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.devcommop.joaquin.seceleaderboard.presentation.common
2+
3+
import androidx.compose.foundation.layout.fillMaxWidth
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.material.Text
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.text.font.Font
9+
import androidx.compose.ui.text.font.FontFamily
10+
import androidx.compose.ui.text.font.FontWeight
11+
import androidx.compose.ui.text.style.TextAlign
12+
import androidx.compose.ui.unit.dp
13+
import androidx.compose.ui.unit.sp
14+
import com.devcommop.joaquin.seceleaderboard.R
15+
import com.devcommop.joaquin.seceleaderboard.presentation.ui.theme.SecondaryColor
16+
17+
@Composable
18+
fun HeaderText(text: String) {
19+
Text(
20+
text = text,
21+
fontFamily = FontFamily(Font(R.font.poppins)),
22+
color = SecondaryColor,
23+
textAlign = TextAlign.Center,
24+
modifier = Modifier
25+
.fillMaxWidth()
26+
.padding(top = 30.dp, bottom = 10.dp),
27+
fontWeight = FontWeight.ExtraBold,
28+
fontSize = 16.sp
29+
)
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.devcommop.joaquin.seceleaderboard.presentation.contestslist
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.runtime.Composable
5+
import androidx.hilt.navigation.compose.hiltViewModel
6+
import androidx.navigation.NavController
7+
import com.devcommop.joaquin.seceleaderboard.presentation.common.HeaderText
8+
9+
@Composable
10+
fun ContestsListScreen(
11+
navController: NavController,
12+
viewModel: ContestsListViewModel = hiltViewModel()
13+
) {
14+
Column() {
15+
HeaderText(text = "Codeforces Contests")
16+
PastContestsUI()
17+
UpcomingContestsUI()
18+
}
19+
}
20+
21+
@Composable
22+
fun UpcomingContestsUI() {
23+
TODO("Not yet implemented")
24+
}
25+
26+
@Composable
27+
fun PastContestsUI() {
28+
TODO("Not yet implemented")
29+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.devcommop.joaquin.seceleaderboard.presentation.contestslist
2+
3+
import androidx.lifecycle.SavedStateHandle
4+
import androidx.lifecycle.ViewModel
5+
import com.devcommop.joaquin.seceleaderboard.domain.use_cases.AppUseCases
6+
import dagger.hilt.android.lifecycle.HiltViewModel
7+
import javax.inject.Inject
8+
9+
@HiltViewModel
10+
class ContestsListViewModel @Inject constructor(
11+
private val appUseCases: AppUseCases,
12+
savedStateHandle: SavedStateHandle
13+
): ViewModel() {
14+
15+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.devcommop.joaquin.seceleaderboard.presentation.contestslist.components
2+
3+
import androidx.compose.runtime.Composable
4+
5+
@Composable
6+
fun ContestItem() {
7+
8+
}

app/src/main/java/com/devcommop/joaquin/seceleaderboard/presentation/scoreboard/ScoreboardScreen.kt

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package com.devcommop.joaquin.seceleaderboard.presentation.scoreboard
22

3-
import androidx.compose.foundation.layout.Arrangement
43
import androidx.compose.foundation.layout.Column
54
import androidx.compose.foundation.layout.fillMaxSize
65
import androidx.compose.foundation.layout.padding
6+
import androidx.compose.foundation.lazy.LazyColumn
7+
import androidx.compose.foundation.rememberScrollState
8+
import androidx.compose.foundation.verticalScroll
79
import androidx.compose.material.*
8-
import androidx.compose.material.icons.Icons
9-
import androidx.compose.material.icons.filled.Add
1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.runtime.rememberCoroutineScope
12-
import androidx.compose.ui.Alignment
1312
import androidx.compose.ui.Modifier
14-
import androidx.compose.ui.tooling.preview.Preview
1513
import androidx.compose.ui.unit.dp
1614
import androidx.hilt.navigation.compose.hiltViewModel
1715
import androidx.navigation.NavController
16+
import com.devcommop.joaquin.seceleaderboard.presentation.common.AnimatedShimmer
17+
import com.devcommop.joaquin.seceleaderboard.presentation.common.HeaderText
18+
import com.devcommop.joaquin.seceleaderboard.presentation.scoreboard.components.HandleScoreItem
1819

1920
@Composable
2021
fun ScoreboardScreen(
@@ -24,23 +25,37 @@ fun ScoreboardScreen(
2425
val state = viewModel.state.value
2526
val scaffoldState = rememberScaffoldState()
2627
val scope = rememberCoroutineScope()
27-
28-
Scaffold(
29-
scaffoldState = scaffoldState
30-
) {
31-
Column(
32-
modifier = Modifier
33-
.fillMaxSize()
34-
.padding(16.dp),
35-
verticalArrangement = Arrangement.SpaceAround,
36-
horizontalAlignment = Alignment.CenterHorizontally
28+
if(state.currentStatus != "SUCCESS"){
29+
AnimatedShimmer()
30+
}else{
31+
Scaffold(
32+
scaffoldState = scaffoldState
3733
) {
38-
Text(
39-
text = state.currentStatus
40-
)
41-
Text(
42-
text = state.rankings.toString()
43-
)
34+
Column(
35+
modifier = Modifier
36+
.fillMaxSize()
37+
.padding(8.dp)
38+
) {
39+
HeaderText(text = "Scoreboard")
40+
RankingUI(state)
41+
}
42+
}
43+
}
44+
}
45+
46+
@OptIn(ExperimentalMaterialApi::class)
47+
@Composable
48+
fun RankingUI(state: ScoreboardState) {
49+
Column(
50+
modifier = Modifier
51+
.padding(horizontal = 14.dp)
52+
.padding(top = 10.dp)
53+
.verticalScroll(rememberScrollState())
54+
){
55+
var idx = 1
56+
state.rankings.forEach{
57+
//TODO: give onClick functionality to navigate to Contestant Screen
58+
HandleScoreItem(index = idx++, handleName = it.key, score = it.value, onClick = {})
4459
}
4560
}
4661
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.devcommop.joaquin.seceleaderboard.presentation.scoreboard.components
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.*
5+
import androidx.compose.material.Card
6+
import androidx.compose.material.ExperimentalMaterialApi
7+
import androidx.compose.material.Text
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.draw.clip
12+
import androidx.compose.ui.graphics.Color
13+
import androidx.compose.ui.text.font.Font
14+
import androidx.compose.ui.text.font.FontFamily
15+
import androidx.compose.ui.text.font.FontWeight
16+
import androidx.compose.ui.text.style.TextAlign
17+
import androidx.compose.ui.unit.dp
18+
import androidx.compose.ui.unit.sp
19+
import com.devcommop.joaquin.seceleaderboard.R
20+
import com.devcommop.joaquin.seceleaderboard.presentation.ui.theme.LightPrimaryColor
21+
import com.devcommop.joaquin.seceleaderboard.presentation.ui.theme.PrimaryColor
22+
import com.devcommop.joaquin.seceleaderboard.presentation.ui.theme.SecondaryColor
23+
import com.devcommop.joaquin.seceleaderboard.presentation.ui.theme.Shapes
24+
25+
@ExperimentalMaterialApi
26+
@Composable
27+
fun HandleScoreItem(
28+
index: Int,
29+
handleName: String,
30+
score: Int,
31+
onClick: () -> Unit
32+
) {
33+
Card(
34+
onClick = { onClick() },
35+
backgroundColor = PrimaryColor,//Color.White,
36+
modifier = Modifier
37+
.padding(bottom = 8.dp)
38+
.fillMaxWidth(),
39+
elevation = 0.dp,
40+
) {
41+
Row(
42+
modifier = Modifier.padding(vertical = 10.dp, horizontal = 14.dp),
43+
verticalAlignment = Alignment.CenterVertically,
44+
horizontalArrangement = Arrangement.SpaceBetween
45+
) {
46+
Row(
47+
verticalAlignment = Alignment.CenterVertically
48+
) {
49+
Box(
50+
modifier = Modifier
51+
.size(34.dp)
52+
.clip(shape = Shapes.medium)
53+
.background(LightPrimaryColor)
54+
) {
55+
Text(
56+
text = index.toString(),
57+
fontFamily = FontFamily(Font(R.font.poppins)),
58+
fontSize = 18.sp,
59+
fontWeight = FontWeight.Bold,
60+
textAlign = TextAlign.Center,
61+
color = Color.Black
62+
)
63+
}
64+
65+
Spacer(modifier = Modifier.width(14.dp))
66+
67+
Text(
68+
text = handleName,
69+
fontFamily = FontFamily(Font(R.font.poppins)),
70+
color = SecondaryColor,
71+
fontSize = 14.sp,
72+
fontWeight = FontWeight.Bold,
73+
)
74+
}
75+
Text(
76+
text = score.toString(),
77+
fontFamily = FontFamily(Font(R.font.poppins)),
78+
fontSize = 18.sp,
79+
fontWeight = FontWeight.Bold,
80+
color = Color.Black
81+
)
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)