diff --git a/app/src/main/java/com/t/saito/pr_agent_sample/DemoRepository.kt b/app/src/main/java/com/t/saito/pr_agent_sample/DemoRepository.kt new file mode 100644 index 0000000..087d81f --- /dev/null +++ b/app/src/main/java/com/t/saito/pr_agent_sample/DemoRepository.kt @@ -0,0 +1,28 @@ +package com.t.saito.pr_agent_sample + +class DemoRepository { + + val demoItems = mutableListOf() + + fun addAllItem(items: List): List { + demoItems.addAll(items) + return demoItems + } + + fun addItem(item: String): List { + demoItems.add(item) + return demoItems + } + + fun firstItem(): String? { + return demoItems.firstOrNull() + } + + fun lastItem(): String? { + return demoItems.lastOrNull() + } + + fun clear() { + demoItems.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/t/saito/pr_agent_sample/DemoUseCase.kt b/app/src/main/java/com/t/saito/pr_agent_sample/DemoUseCase.kt new file mode 100644 index 0000000..bba94e1 --- /dev/null +++ b/app/src/main/java/com/t/saito/pr_agent_sample/DemoUseCase.kt @@ -0,0 +1,25 @@ +package com.t.saito.pr_agent_sample + +class DemoUseCase( + private val repository: DemoRepository +) { + + fun addAllItem(items: List): List { + return repository.addAllItem(items) + } + fun addItem(item: String): List { + return repository.addItem(item) + } + + fun firstItem(): String? { + return repository.firstItem() + } + + fun lastItem(): String? { + return repository.lastItem() + } + + fun clear() { + repository.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/t/saito/pr_agent_sample/DemoViewModel.kt b/app/src/main/java/com/t/saito/pr_agent_sample/DemoViewModel.kt new file mode 100644 index 0000000..3e53570 --- /dev/null +++ b/app/src/main/java/com/t/saito/pr_agent_sample/DemoViewModel.kt @@ -0,0 +1,52 @@ +package com.t.saito.pr_agent_sample + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch + +class DemoViewModel( + private val demoUseCase: DemoUseCase +) : ViewModel() { + + private val _pageFlag = MutableStateFlow(false) + val pageFlag: SharedFlow get() = _pageFlag + + fun onClickAddItem() { + demoUseCase.addItem("item") + } + fun onClickAddAllItems() { + demoUseCase.addAllItem(listOf("item1", "item2", "item3")) + } + + fun onClickFirstItem() { + demoUseCase.firstItem() + } + + fun onClickLastItem() { + demoUseCase.lastItem() + } + + fun onClickClear() { + demoUseCase.clear() + } + + fun onClickPageSwitch() { + viewModelScope.launch { + val pageFlag = _pageFlag.value + _pageFlag.emit(pageFlag.not()) + } + } +} + +class DemoViewModelFactory( + private val demoUseCase: DemoUseCase +) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return DemoViewModel( + demoUseCase = demoUseCase, + ) as T + } +} \ No newline at end of file diff --git a/app/src/main/java/com/t/saito/pr_agent_sample/MainActivity.kt b/app/src/main/java/com/t/saito/pr_agent_sample/MainActivity.kt index 747efa5..971ad34 100644 --- a/app/src/main/java/com/t/saito/pr_agent_sample/MainActivity.kt +++ b/app/src/main/java/com/t/saito/pr_agent_sample/MainActivity.kt @@ -3,26 +3,50 @@ package com.t.saito.pr_agent_sample import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.viewModels import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import com.t.saito.pr_agent_sample.ui.DemoScreen import com.t.saito.pr_agent_sample.ui.theme.PragentsampleTheme class MainActivity : ComponentActivity() { + + private val demoViewModel by viewModels { + DemoViewModelFactory( + DemoUseCase( + DemoRepository() + ) + ) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { PragentsampleTheme { // A surface container using the 'background' color from the theme + val flag by demoViewModel.pageFlag.collectAsState(false) Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - Greeting("Android") + if(flag) { + DemoScreen( + demoViewModel = demoViewModel, + ) + } else { + Greeting(name = "Android", onClick = { + demoViewModel.onClickPageSwitch() + }) + } } } } @@ -30,17 +54,25 @@ class MainActivity : ComponentActivity() { } @Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = "Hello $name!", - modifier = modifier - ) +fun Greeting( + name: String, + onClick: () -> Unit = {} +) { + Button( + onClick = onClick, + modifier = Modifier.wrapContentSize() + ) { + Text( + text = "Hello $name!", + ) + } + } @Preview(showBackground = true) @Composable fun GreetingPreview() { PragentsampleTheme { - Greeting("Android") + Greeting(name = "Android") } } \ No newline at end of file diff --git a/app/src/main/java/com/t/saito/pr_agent_sample/ui/DemoScreen.kt b/app/src/main/java/com/t/saito/pr_agent_sample/ui/DemoScreen.kt new file mode 100644 index 0000000..fb3de28 --- /dev/null +++ b/app/src/main/java/com/t/saito/pr_agent_sample/ui/DemoScreen.kt @@ -0,0 +1,38 @@ +package com.t.saito.pr_agent_sample.ui + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.t.saito.pr_agent_sample.DemoViewModel + +@Composable +fun DemoScreen( + demoViewModel: DemoViewModel, +) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally + ) { + Button(onClick = { demoViewModel.onClickAddItem() }) { + Text("Add Item") + } + Button(onClick = { demoViewModel.onClickAddAllItems() }) { + Text("Add All Items") + } + Button(onClick = { demoViewModel.onClickClear() }) { + Text("Clear") + } + Button(onClick = { demoViewModel.onClickFirstItem() }) { + Text("First Item") + } + Button(onClick = { demoViewModel.onClickLastItem() }) { + Text("Last Item") + } + Button(onClick = { demoViewModel.onClickPageSwitch() }) { + Text("back") + } + } +} \ No newline at end of file