11package es.hegocre.scorecounter
22
3+ import android.content.Context
4+ import android.os.Build
35import android.os.Bundle
4- import android.view.View
5- import androidx.appcompat.app.AlertDialog
6- import androidx.appcompat.app.AppCompatActivity
6+ import androidx.activity.ComponentActivity
7+ import androidx.activity.compose.setContent
8+ import androidx.activity.viewModels
9+ import androidx.compose.foundation.background
10+ import androidx.compose.foundation.gestures.detectTapGestures
11+ import androidx.compose.foundation.isSystemInDarkTheme
12+ import androidx.compose.foundation.layout.*
13+ import androidx.compose.material3.*
14+ import androidx.compose.runtime.Composable
15+ import androidx.compose.runtime.getValue
16+ import androidx.compose.runtime.mutableStateOf
17+ import androidx.compose.runtime.saveable.rememberSaveable
18+ import androidx.compose.runtime.setValue
19+ import androidx.compose.ui.Alignment
20+ import androidx.compose.ui.Modifier
21+ import androidx.compose.ui.geometry.Offset
22+ import androidx.compose.ui.graphics.Color
23+ import androidx.compose.ui.input.pointer.pointerInput
24+ import androidx.compose.ui.platform.LocalContext
25+ import androidx.compose.ui.res.stringResource
26+ import androidx.compose.ui.unit.dp
27+ import androidx.compose.ui.unit.sp
728import androidx.core.view.WindowCompat
829import androidx.core.view.WindowInsetsCompat
930import androidx.core.view.WindowInsetsControllerCompat
10- import androidx.databinding.DataBindingUtil
11- import androidx.preference.PreferenceManager
12- import es.hegocre.scorecounter.data.Score
13- import es.hegocre.scorecounter.databinding.ActivityScoreBinding
14-
15- class MainActivity : AppCompatActivity () {
16- private lateinit var binding: ActivityScoreBinding
1731
32+ class MainActivity : ComponentActivity () {
1833 override fun onCreate (savedInstanceState : Bundle ? ) {
1934 super .onCreate(savedInstanceState)
20- binding = DataBindingUtil .setContentView(this , R .layout.activity_score)
2135
22- Score .setSharedPreferences(PreferenceManager .getDefaultSharedPreferences(this ).also {
23- if (it.getBoolean(" firstRun" , true )) {
24- showTutorialDialog()
25- it.edit().putBoolean(" firstRun" , false ).apply ()
36+ val scoreViewModel by viewModels<ScoreViewModel >()
37+
38+ WindowCompat .setDecorFitsSystemWindows(window, false )
39+
40+ setContent {
41+ val darkTheme = isSystemInDarkTheme()
42+ val colorScheme = when {
43+ Build .VERSION .SDK_INT >= Build .VERSION_CODES .S -> {
44+ val context = LocalContext .current
45+ if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(
46+ context
47+ )
48+ }
49+ darkTheme -> darkColorScheme()
50+ else -> lightColorScheme()
51+ }
52+ MaterialTheme (colorScheme = colorScheme) {
53+ Surface (color = if (darkTheme) Color .Black else MaterialTheme .colorScheme.surface) {
54+ val context = LocalContext .current
55+
56+ var showTutorialDialog by rememberSaveable {
57+ mutableStateOf(
58+ context.getSharedPreferences(" preferences" , Context .MODE_PRIVATE )
59+ .getBoolean(" isFirstLaunch" , true )
60+ )
61+ }
62+
63+ Row {
64+ ScoreView (
65+ score = scoreViewModel.score1,
66+ onScoreAdd = { scoreViewModel.score1++ },
67+ onScoreSub = { scoreViewModel.score1-- },
68+ onScoreReset = { scoreViewModel.score1 = 0 },
69+ modifier = Modifier
70+ .weight(1f )
71+ .fillMaxHeight()
72+ )
73+ Spacer (
74+ modifier = Modifier
75+ .fillMaxHeight()
76+ .width(4 .dp)
77+ .background(MaterialTheme .colorScheme.onSurface)
78+ )
79+ ScoreView (
80+ score = scoreViewModel.score2,
81+ onScoreAdd = { scoreViewModel.score2++ },
82+ onScoreSub = { scoreViewModel.score2-- },
83+ onScoreReset = { scoreViewModel.score2 = 0 },
84+ modifier = Modifier
85+ .weight(1f )
86+ .fillMaxHeight()
87+ )
88+ }
89+
90+ if (showTutorialDialog) {
91+ context.getSharedPreferences(" preferences" , Context .MODE_PRIVATE )
92+ .edit().putBoolean(" isFirstLaunch" , false ).apply ()
93+
94+ AlertDialog (
95+ onDismissRequest = { showTutorialDialog = false },
96+ confirmButton = {
97+ TextButton (onClick = { showTutorialDialog = false }) {
98+ Text (text = stringResource(id = android.R .string.ok))
99+ }
100+ },
101+ title = { Text (text = stringResource(id = R .string.dialog_tutorial_title)) },
102+ text = { Text (text = stringResource(id = R .string.dialog_tutorial_message)) }
103+ )
104+ }
105+ }
26106 }
27- })
28- Score (" score1" ).let { score ->
29- binding.score1 = score
30- loadScore(score, binding.add1Layout, binding.sub1Layout)
31- }
32- Score (" score2" ).let { score ->
33- binding.score2 = score
34- loadScore(score, binding.add2Layout, binding.sub2Layout)
35107 }
36108 }
37109
38- private fun hideSystemUI () {
110+ override fun onResume () {
111+ super .onResume()
39112 WindowCompat .setDecorFitsSystemWindows(window, false )
40- WindowInsetsControllerCompat (window, binding.root ).let { controller ->
113+ WindowInsetsControllerCompat (window, window.decorView ).let { controller ->
41114 controller.hide(WindowInsetsCompat .Type .statusBars() or WindowInsetsCompat .Type .navigationBars())
42115 controller.systemBarsBehavior =
43116 WindowInsetsControllerCompat .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
44117 }
45118 }
119+ }
46120
47- override fun onResume () {
48- hideSystemUI()
49- super .onResume()
50- }
51-
52- private fun loadScore (score : Score , addLayout : View , subLayout : View ) {
53- addLayout.setOnClickListener {
54- score.inc()
121+ @Composable
122+ fun ScoreView (
123+ score : Int ,
124+ onScoreAdd : (Offset ) -> Unit ,
125+ onScoreSub : (Offset ) -> Unit ,
126+ onScoreReset : (Offset ) -> Unit ,
127+ modifier : Modifier = Modifier
128+ ) {
129+ Box (modifier = modifier, contentAlignment = Alignment .Center ) {
130+ Text (
131+ text = " $score " ,
132+ fontSize = 70 .sp,
133+ color = MaterialTheme .colorScheme.onSurface
134+ )
135+ Column (modifier = Modifier .fillMaxSize()) {
136+ Box (modifier = Modifier
137+ .fillMaxWidth()
138+ .weight(1f )
139+ .pointerInput(Unit ) {
140+ detectTapGestures(onTap = onScoreAdd, onLongPress = onScoreReset)
141+ }
142+ )
143+ Box (modifier = Modifier
144+ .fillMaxWidth()
145+ .weight(1f )
146+ .pointerInput(Unit ) {
147+ detectTapGestures(onTap = onScoreSub, onLongPress = onScoreReset)
148+ }
149+ )
55150 }
56- addLayout.setOnLongClickListener {
57- score.reset()
58- true
59- }
60- subLayout.setOnClickListener {
61- score.dec()
62- }
63- subLayout.setOnLongClickListener {
64- score.reset()
65- true
66- }
67- }
68-
69- private fun showTutorialDialog () {
70- AlertDialog .Builder (this )
71- .setTitle(R .string.dialog_tutorial_title)
72- .setMessage(R .string.dialog_tutorial_message)
73- .setPositiveButton(android.R .string.ok, null )
74- .show()
75151 }
76152}
0 commit comments