diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3dbbbf2..291a0e9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) + implementation(libs.androidx.runtime) implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 111c250..631407c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,6 +31,22 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/data/datasource/MyService.kt b/app/src/main/java/kr/ac/anu/mumu/data/datasource/MyService.kt new file mode 100644 index 0000000..2ea80b2 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/data/datasource/MyService.kt @@ -0,0 +1,10 @@ +package kr.ac.anu.mumu.data.datasource + +import kr.ac.anu.mumu.data.model.MyResponse +import retrofit2.http.GET +import retrofit2.http.Path + +interface MyService { + @GET("/api/users/profile/{id}") + suspend fun getUserProfile(@Path("id") userId: Int): MyResponse +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/data/model/MyDto.kt b/app/src/main/java/kr/ac/anu/mumu/data/model/MyDto.kt new file mode 100644 index 0000000..6efa1cf --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/data/model/MyDto.kt @@ -0,0 +1,18 @@ +package kr.ac.anu.mumu.data.model + +import com.google.gson.annotations.SerializedName + +data class MyResponse( + val success: Boolean, + val message: String, + val user: MyDto +) + +data class MyDto( + @SerializedName("user_id") + val userId: Int, + @SerializedName("login_id") + val loginId: String, + val name: String, + val phone: String +) \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/data/repository/MyRepositoryImpl.kt b/app/src/main/java/kr/ac/anu/mumu/data/repository/MyRepositoryImpl.kt new file mode 100644 index 0000000..da6551b --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/data/repository/MyRepositoryImpl.kt @@ -0,0 +1,28 @@ +package kr.ac.anu.mumu.data.repository + +import kr.ac.anu.mumu.data.datasource.MyService +import kr.ac.anu.mumu.domain.model.MyInformation +import kr.ac.anu.mumu.domain.repository.MyRepository +import javax.inject.Inject + +class MyRepositoryImpl @Inject constructor( + private val myService: MyService +) : MyRepository { + + override suspend fun getUserProfile(userId: Int): Result { + return try { + val response = myService.getUserProfile(userId) + + val myInfo = MyInformation( + id = response.user.loginId, + name = response.user.name, + phone = response.user.phone + ) + + Result.success(myInfo) + + } catch (e: Exception) { + Result.failure(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt b/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt index 8c979fb..fb2c9c7 100644 --- a/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt +++ b/app/src/main/java/kr/ac/anu/mumu/di/NetworkModule.kt @@ -6,6 +6,7 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kr.ac.anu.mumu.data.datasource.AuthService import kr.ac.anu.mumu.data.datasource.JoinService +import kr.ac.anu.mumu.data.datasource.MyService import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import javax.inject.Singleton @@ -33,4 +34,10 @@ object NetworkModule { fun provideJoinService(retrofit: Retrofit): JoinService { return retrofit.create(JoinService::class.java) } + + @Provides + @Singleton + fun provideMyService(retrofit: Retrofit): MyService { + return retrofit.create(MyService::class.java) + } } diff --git a/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt b/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt index 8591104..326a1f9 100644 --- a/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt +++ b/app/src/main/java/kr/ac/anu/mumu/di/RepositoryModule.kt @@ -6,8 +6,10 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kr.ac.anu.mumu.data.repository.JoinRepositoryImpl import kr.ac.anu.mumu.data.repository.LoginRepositoryImpl +import kr.ac.anu.mumu.data.repository.MyRepositoryImpl import kr.ac.anu.mumu.domain.repository.JoinRepository import kr.ac.anu.mumu.domain.repository.LoginRepository +import kr.ac.anu.mumu.domain.repository.MyRepository import javax.inject.Singleton @Module @@ -24,4 +26,10 @@ abstract class RepositoryModule { abstract fun bindJoinRepository( joinRepositoryImpl: JoinRepositoryImpl ): JoinRepository + + @Binds + @Singleton + abstract fun bindMyRepository( + myRepositoryImpl: MyRepositoryImpl + ): MyRepository } diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/model/MyInformation.kt b/app/src/main/java/kr/ac/anu/mumu/domain/model/MyInformation.kt new file mode 100644 index 0000000..bb962c6 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/domain/model/MyInformation.kt @@ -0,0 +1,7 @@ +package kr.ac.anu.mumu.domain.model + +data class MyInformation( + val id: String, + val name: String, + val phone: String? +) \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/repository/MyRepository.kt b/app/src/main/java/kr/ac/anu/mumu/domain/repository/MyRepository.kt new file mode 100644 index 0000000..cc93471 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/domain/repository/MyRepository.kt @@ -0,0 +1,7 @@ +package kr.ac.anu.mumu.domain.repository + +import kr.ac.anu.mumu.domain.model.MyInformation + +interface MyRepository { + suspend fun getUserProfile(userId: Int): Result +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/domain/usecase/MyUseCase.kt b/app/src/main/java/kr/ac/anu/mumu/domain/usecase/MyUseCase.kt new file mode 100644 index 0000000..9564d05 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/domain/usecase/MyUseCase.kt @@ -0,0 +1,14 @@ +package kr.ac.anu.mumu.domain.usecase + +import kr.ac.anu.mumu.domain.model.MyInformation +import kr.ac.anu.mumu.domain.model.User +import kr.ac.anu.mumu.domain.repository.MyRepository +import javax.inject.Inject + +class MyUseCase @Inject constructor( + private val repository: MyRepository +){ + suspend operator fun invoke(userId: Int): Result { + return repository.getUserProfile(userId) + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/my/AnimalAdministerActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/my/AnimalAdministerActivity.kt new file mode 100644 index 0000000..33ae7cc --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/my/AnimalAdministerActivity.kt @@ -0,0 +1,21 @@ +package kr.ac.anu.mumu.presentation.my + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import kr.ac.anu.mumu.R + +class AnimalAdministerActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_animal_administer) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/my/ModifyInformationActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/my/ModifyInformationActivity.kt new file mode 100644 index 0000000..645d2fe --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/my/ModifyInformationActivity.kt @@ -0,0 +1,22 @@ +package kr.ac.anu.mumu.presentation.my + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import kr.ac.anu.mumu.R + +class ModifyInformationActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_modify_information) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/my/MumuLogoFragment.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MumuLogoFragment.kt new file mode 100644 index 0000000..c7286c9 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MumuLogoFragment.kt @@ -0,0 +1,19 @@ +package kr.ac.anu.mumu.presentation.my + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import kr.ac.anu.mumu.R + +class MumuLogoFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_mumu_logo, container, false) + } +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyActivity.kt new file mode 100644 index 0000000..a45cd9b --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyActivity.kt @@ -0,0 +1,73 @@ +package kr.ac.anu.mumu.presentation.my + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import kr.ac.anu.mumu.R +import kr.ac.anu.mumu.databinding.ActivityMyBinding +import kr.ac.anu.mumu.domain.model.MyInformation +import kr.ac.anu.mumu.presentation.login.LoginUiState +import kotlin.jvm.java + +@AndroidEntryPoint +class MyActivity : AppCompatActivity() { + private lateinit var binding: ActivityMyBinding + + private val viewModel: MyViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + binding = ActivityMyBinding.inflate(layoutInflater) + setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + viewModel.getUserProfile(1) + + observerViewModel() + nextScreen() + } + + private fun nextScreen() { + binding.layoutModifyInformation.setOnClickListener { + val intent = Intent(this, ModifyInformationActivity::class.java) + startActivity(intent) + } + binding.layoutAnimalAdminister.setOnClickListener { + val intent = Intent(this, AnimalAdministerActivity::class.java) + startActivity(intent) + } + binding.tvMyInformationAdminister1.setOnClickListener { + val intent = Intent(this, MyInformationAdministerActivity::class.java) + startActivity(intent) + } + } + + private fun observerViewModel() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.uiState.collect { state -> + when (state) { + is MyUiState.Success -> { + binding.tvName.text = state.myInfo.name + } + else -> {} + } + } + } + } + } +} diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyInformationAdministerActivity.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyInformationAdministerActivity.kt new file mode 100644 index 0000000..39ac069 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyInformationAdministerActivity.kt @@ -0,0 +1,21 @@ +package kr.ac.anu.mumu.presentation.my + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import kr.ac.anu.mumu.R + +class MyInformationAdministerActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_my_information_administer) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyViewModel.kt b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyViewModel.kt new file mode 100644 index 0000000..c247608 --- /dev/null +++ b/app/src/main/java/kr/ac/anu/mumu/presentation/my/MyViewModel.kt @@ -0,0 +1,38 @@ +package kr.ac.anu.mumu.presentation.my + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kr.ac.anu.mumu.domain.model.MyInformation +import kr.ac.anu.mumu.domain.usecase.MyUseCase +import javax.inject.Inject + +sealed class MyUiState{ + object Init: MyUiState() + object Loading: MyUiState() + data class Success(val myInfo: MyInformation): MyUiState() + data class Error(val message: String): MyUiState() +} +@HiltViewModel +class MyViewModel @Inject constructor( + private var myUseCase: MyUseCase +) : ViewModel() { + private val _uiState = MutableStateFlow(MyUiState.Init) + val uiState: StateFlow = _uiState.asStateFlow() + + fun getUserProfile(userId: Int) { + viewModelScope.launch { + _uiState.value = MyUiState.Loading + val result = myUseCase(userId) + result.onSuccess { myInfo -> + _uiState.value = MyUiState.Success(myInfo) + }.onFailure { error -> + _uiState.value = MyUiState.Error(error.message ?: "프로필을 불러오는데 실패했습니다.") + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_gray200_stroke.xml b/app/src/main/res/drawable/bg_gray200_stroke.xml new file mode 100644 index 0000000..8cfc520 --- /dev/null +++ b/app/src/main/res/drawable/bg_gray200_stroke.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_gray350_stroke.xml b/app/src/main/res/drawable/bg_gray350_stroke.xml new file mode 100644 index 0000000..073144b --- /dev/null +++ b/app/src/main/res/drawable/bg_gray350_stroke.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_pink_solid.xml b/app/src/main/res/drawable/bg_pink_solid.xml new file mode 100644 index 0000000..828e90a --- /dev/null +++ b/app/src/main/res/drawable/bg_pink_solid.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_start_line.xml b/app/src/main/res/drawable/bg_start_line.xml new file mode 100644 index 0000000..5cd88df --- /dev/null +++ b/app/src/main/res/drawable/bg_start_line.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_white_solid.xml b/app/src/main/res/drawable/bg_white_solid.xml new file mode 100644 index 0000000..0b064c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_white_solid.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_yellow100_solid.xml b/app/src/main/res/drawable/bg_yellow100_solid.xml new file mode 100644 index 0000000..9560956 --- /dev/null +++ b/app/src/main/res/drawable/bg_yellow100_solid.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_yellow150_solid.xml b/app/src/main/res/drawable/bg_yellow150_solid.xml new file mode 100644 index 0000000..1f375f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_yellow150_solid.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_yellow300_solid.xml b/app/src/main/res/drawable/bg_yellow300_solid.xml new file mode 100644 index 0000000..60604c1 --- /dev/null +++ b/app/src/main/res/drawable/bg_yellow300_solid.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_yellow300_stroke.xml b/app/src/main/res/drawable/bg_yellow300_stroke.xml new file mode 100644 index 0000000..109d0ba --- /dev/null +++ b/app/src/main/res/drawable/bg_yellow300_stroke.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml new file mode 100644 index 0000000..61429f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_eidt.xml b/app/src/main/res/drawable/ic_eidt.xml new file mode 100644 index 0000000..4699d35 --- /dev/null +++ b/app/src/main/res/drawable/ic_eidt.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_gender_man.xml b/app/src/main/res/drawable/ic_gender_man.xml new file mode 100644 index 0000000..ce5da88 --- /dev/null +++ b/app/src/main/res/drawable/ic_gender_man.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/activity_animal_administer.xml b/app/src/main/res/layout/activity_animal_administer.xml new file mode 100644 index 0000000..e3f65aa --- /dev/null +++ b/app/src/main/res/layout/activity_animal_administer.xml @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_modify_information.xml b/app/src/main/res/layout/activity_modify_information.xml new file mode 100644 index 0000000..4bcbdea --- /dev/null +++ b/app/src/main/res/layout/activity_modify_information.xml @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml new file mode 100644 index 0000000..d48bbc7 --- /dev/null +++ b/app/src/main/res/layout/activity_my.xml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_my_information_administer.xml b/app/src/main/res/layout/activity_my_information_administer.xml new file mode 100644 index 0000000..4edb8f9 --- /dev/null +++ b/app/src/main/res/layout/activity_my_information_administer.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mumu_logo.xml b/app/src/main/res/layout/fragment_mumu_logo.xml new file mode 100644 index 0000000..5bab306 --- /dev/null +++ b/app/src/main/res/layout/fragment_mumu_logo.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph_join.xml b/app/src/main/res/navigation/nav_graph_join.xml index 8fd4d8a..9c12a35 100644 --- a/app/src/main/res/navigation/nav_graph_join.xml +++ b/app/src/main/res/navigation/nav_graph_join.xml @@ -81,4 +81,10 @@ android:label="FinishFragment" tools:layout="@layout/fragment_finish" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 88c8551..642d514 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -19,6 +19,13 @@ #797979 #404040 + #FFC13B + #FDCB60 + #FBD685 + #F9E0AB + #F7EBD0 + #F6EFE2 + #F44355 #4B88FF \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 74856dc..ee72a8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ Mumu + + Hello blank fragment \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6ec3a43..b4dffb2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,6 +16,7 @@ activity = "1.12.1" constraintlayout = "2.2.1" navigationFragmentKtx = "2.9.7" retrofit2 = "2.9.0" +runtime = "1.11.4" [libraries] androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityKtx" } @@ -37,6 +38,7 @@ material = { group = "com.google.android.material", name = "material", version.r androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } retrofit2 = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit2" } +androidx-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "runtime" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }