Skip to content

Commit 8b7d771

Browse files
committed
compose: create components and screen(#1)
1 parent d11477b commit 8b7d771

File tree

5 files changed

+508
-40
lines changed

5 files changed

+508
-40
lines changed

app/src/main/java/com/example/cfseeker/MainActivity.kt

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,34 @@
11
package com.example.cfseeker
22

33
import android.os.Bundle
4+
import androidx.activity.ComponentActivity
5+
import androidx.activity.compose.setContent
46
import androidx.activity.enableEdgeToEdge
57
import androidx.activity.viewModels
6-
import androidx.appcompat.app.AppCompatActivity
7-
import androidx.core.view.ViewCompat
8-
import androidx.core.view.WindowInsetsCompat
9-
import androidx.lifecycle.Lifecycle
10-
import androidx.lifecycle.lifecycleScope
11-
import androidx.lifecycle.repeatOnLifecycle
12-
import androidx.recyclerview.widget.LinearLayoutManager
13-
import com.example.cfseeker.databinding.ActivityMainBinding
14-
import com.example.cfseeker.ui.UserAdapter
8+
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.material3.MaterialTheme
10+
import androidx.compose.material3.Surface
11+
import androidx.compose.ui.Modifier
1512
import com.example.cfseeker.ui.UserViewModel
16-
import com.example.cfseeker.ui.base.UiState
13+
import com.example.cfseeker.ui.screens.UserListScreen
14+
import com.example.cfseeker.ui.theme.CFSeekerTheme
1715
import dagger.hilt.android.AndroidEntryPoint
18-
import kotlinx.coroutines.launch
1916

2017
@AndroidEntryPoint
21-
class MainActivity : AppCompatActivity() {
18+
class MainActivity : ComponentActivity() {
2219
private val viewModel: UserViewModel by viewModels()
23-
private lateinit var binding: ActivityMainBinding
20+
2421
override fun onCreate(savedInstanceState: Bundle?) {
2522
super.onCreate(savedInstanceState)
2623
enableEdgeToEdge()
27-
binding = ActivityMainBinding.inflate(layoutInflater)
28-
setContentView(binding.root)
29-
ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
30-
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
31-
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
32-
insets
33-
}
34-
35-
val userAdapter = UserAdapter()
36-
binding.userRatingsRv.apply {
37-
adapter = userAdapter
38-
layoutManager = LinearLayoutManager(this@MainActivity)
39-
}
4024

41-
lifecycleScope.launch {
42-
repeatOnLifecycle(Lifecycle.State.STARTED) {
43-
viewModel.uiState.collect { uiState ->
44-
when(uiState) {
45-
is UiState.Error -> {
46-
// TODO
47-
}
48-
is UiState.Loading -> {
49-
// TODO
50-
}
51-
is UiState.Success -> {
52-
userAdapter.submitList(uiState.data)
53-
}
54-
}
25+
setContent {
26+
CFSeekerTheme {
27+
Surface(
28+
modifier = Modifier.fillMaxSize(),
29+
color = MaterialTheme.colorScheme.background
30+
) {
31+
UserListScreen(viewModel = viewModel)
5532
}
5633
}
5734
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.example.cfseeker.ui.components
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxSize
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.foundation.layout.size
8+
import androidx.compose.material.icons.Icons
9+
import androidx.compose.material.icons.filled.Warning
10+
import androidx.compose.material3.Icon
11+
import androidx.compose.material3.MaterialTheme
12+
import androidx.compose.material3.Text
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.Alignment
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.text.style.TextAlign
17+
import androidx.compose.ui.tooling.preview.Preview
18+
import androidx.compose.ui.unit.dp
19+
import com.example.cfseeker.ui.theme.CFSeekerTheme
20+
21+
@Composable
22+
fun ErrorState(
23+
message: String,
24+
modifier: Modifier = Modifier
25+
) {
26+
Column(
27+
modifier = modifier
28+
.fillMaxSize()
29+
.padding(16.dp),
30+
horizontalAlignment = Alignment.CenterHorizontally,
31+
verticalArrangement = Arrangement.Center
32+
) {
33+
Icon(
34+
imageVector = Icons.Default.Warning,
35+
contentDescription = "Error",
36+
modifier = Modifier.size(64.dp),
37+
tint = MaterialTheme.colorScheme.error
38+
)
39+
40+
Text(
41+
text = "Error",
42+
style = MaterialTheme.typography.headlineSmall,
43+
color = MaterialTheme.colorScheme.error,
44+
modifier = Modifier.padding(top = 16.dp)
45+
)
46+
47+
Text(
48+
text = message,
49+
style = MaterialTheme.typography.bodyMedium,
50+
color = MaterialTheme.colorScheme.onSurfaceVariant,
51+
textAlign = TextAlign.Center,
52+
modifier = Modifier.padding(top = 8.dp)
53+
)
54+
}
55+
}
56+
57+
@Preview(showBackground = true)
58+
@Composable
59+
private fun ErrorStatePreview() {
60+
CFSeekerTheme {
61+
ErrorState(message = "Failed to load user data. Please try again.")
62+
}
63+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.example.cfseeker.ui.components
2+
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.fillMaxSize
5+
import androidx.compose.foundation.layout.size
6+
import androidx.compose.material3.CircularProgressIndicator
7+
import androidx.compose.material3.MaterialTheme
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.tooling.preview.Preview
12+
import androidx.compose.ui.unit.dp
13+
import com.example.cfseeker.ui.theme.CFSeekerTheme
14+
15+
@Composable
16+
fun LoadingState(
17+
modifier: Modifier = Modifier
18+
) {
19+
Box(
20+
modifier = modifier.fillMaxSize(),
21+
contentAlignment = Alignment.Center
22+
) {
23+
CircularProgressIndicator(
24+
modifier = Modifier.size(48.dp),
25+
color = MaterialTheme.colorScheme.primary
26+
)
27+
}
28+
}
29+
30+
@Preview(showBackground = true)
31+
@Composable
32+
private fun LoadingStatePreview() {
33+
CFSeekerTheme {
34+
LoadingState()
35+
}
36+
}

0 commit comments

Comments
 (0)