diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 72d34269..98daea7f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -71,6 +71,7 @@ dependencies { implementation(project(":features:rv_diff_util_2")) implementation(project(":features:base_mvvm_lifecycle")) implementation(project(":features:base_mvvm_bottom_sheet")) + implementation(project(":features:compose_permissions_result")) /** * Network diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 8d1879a8..1f389bcd 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -36,6 +36,7 @@ object Javax { object Hilt { const val android = "com.google.dagger:hilt-android:${Versions.hilt}" const val compiler = "com.google.dagger:hilt-compiler:${Versions.hilt}" + const val compose = "androidx.hilt:hilt-navigation-compose:1.0.0" } object Rx { @@ -60,7 +61,6 @@ object Retrofit { object Glide { const val base = "com.github.bumptech.glide:glide:4.16.0" const val okhttp = "com.github.bumptech.glide:okhttp3-integration:4.16.0" - // const val compiler = "com.github.bumptech.glide:compiler:4.15.1" const val compiler = "com.github.bumptech.glide:ksp:4.16.0" const val compose = "com.github.bumptech.glide:compose:1.0.0-beta01" } @@ -89,6 +89,7 @@ object Compose { const val tracing = "androidx.compose.runtime:runtime-tracing:1.0.0-beta01" const val viewModel = "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1" const val constraint = "androidx.constraintlayout:constraintlayout-compose:1.0.1" + const val runtime = "androidx.compose.runtime:runtime" } object UnitTest { diff --git a/core/build.gradle.kts b/core/build.gradle.kts index e89c6b59..516a05f0 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -105,6 +105,7 @@ dependencies { implementation(Compose.material) implementation(Compose.preview) implementation(Compose.ui) + implementation(Compose.runtime) /** * Unit Test diff --git a/core/src/main/java/com/hmju/core/compose/ComposeLifecycleState.kt b/core/src/main/java/com/hmju/core/compose/ComposeLifecycleState.kt new file mode 100644 index 00000000..fffcc5b1 --- /dev/null +++ b/core/src/main/java/com/hmju/core/compose/ComposeLifecycleState.kt @@ -0,0 +1,26 @@ +package com.hmju.core.compose + +import androidx.lifecycle.Lifecycle + +/** + * Description : 필요한 Lifecycle 만 중복 없이 처리할수 있도록 정의한 클래스 + * + * Created by juhongmin on 4/5/24 + */ +enum class ComposeLifecycleState { + UN_KNOWN, + ON_CREATE, + ON_RESUME, + ON_STOP; + + companion object { + fun Lifecycle.Event.from(): ComposeLifecycleState { + return when (this) { + Lifecycle.Event.ON_CREATE -> ON_CREATE + Lifecycle.Event.ON_RESUME -> ON_RESUME + Lifecycle.Event.ON_STOP -> ON_STOP + else -> UN_KNOWN + } + } + } +} diff --git a/core/src/main/java/com/hmju/core/compose/Extensions.kt b/core/src/main/java/com/hmju/core/compose/Extensions.kt new file mode 100644 index 00000000..39c8691c --- /dev/null +++ b/core/src/main/java/com/hmju/core/compose/Extensions.kt @@ -0,0 +1,37 @@ +package com.hmju.core.compose + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import com.hmju.core.compose.ComposeLifecycleState.Companion.from + + +/** + * Compose 전용 Lifecycle Update 처리하는 함수 + * @param lifecycleOwner Android LifecycleOwner + */ +@Composable +fun rememberLifecycleUpdatedState( + lifecycleOwner: LifecycleOwner +): MutableState { + val currentState = remember(lifecycleOwner) { mutableStateOf(ComposeLifecycleState.UN_KNOWN) } + DisposableEffect(Unit) { + val observer = LifecycleEventObserver { _, event -> + val newState = event.from() + if (currentState.value != newState && + newState != ComposeLifecycleState.UN_KNOWN + ) { + currentState.value = newState + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + } + } + return currentState +} diff --git a/core/src/main/java/com/hmju/core/permission/PermissionProvider.kt b/core/src/main/java/com/hmju/core/permission/PermissionProvider.kt new file mode 100644 index 00000000..ec886559 --- /dev/null +++ b/core/src/main/java/com/hmju/core/permission/PermissionProvider.kt @@ -0,0 +1,14 @@ +package com.hmju.core.permission + +/** + * Description : Permission Provider + * + * Created by juhongmin on 4/5/24 + */ +interface PermissionProvider { + + fun isGrated(permission: String): Boolean + fun isAllGrated(list: List): Boolean + fun isAllGrated(map: Map) : Boolean + fun moveToSetting() +} diff --git a/core/src/main/java/com/hmju/core/permission/di/PermissionModule.kt b/core/src/main/java/com/hmju/core/permission/di/PermissionModule.kt new file mode 100644 index 00000000..9fbe87fa --- /dev/null +++ b/core/src/main/java/com/hmju/core/permission/di/PermissionModule.kt @@ -0,0 +1,22 @@ +package com.hmju.core.permission.di + +import com.hmju.core.permission.PermissionProvider +import com.hmju.core.permission.impl.PermissionProviderImpl +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +/** + * Description : + * + * Created by juhongmin on 4/5/24 + */ +@InstallIn(SingletonComponent::class) +@Module +internal abstract class PermissionModule { + @Binds + abstract fun bindPermissionProvider( + impl: PermissionProviderImpl + ): PermissionProvider +} diff --git a/core/src/main/java/com/hmju/core/permission/impl/PermissionProviderImpl.kt b/core/src/main/java/com/hmju/core/permission/impl/PermissionProviderImpl.kt new file mode 100644 index 00000000..699e6ae8 --- /dev/null +++ b/core/src/main/java/com/hmju/core/permission/impl/PermissionProviderImpl.kt @@ -0,0 +1,60 @@ +package com.hmju.core.permission.impl + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.provider.Settings +import androidx.core.content.ContextCompat +import com.hmju.core.permission.PermissionProvider +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +/** + * Description : + * + * Created by juhongmin on 4/5/24 + */ +internal class PermissionProviderImpl @Inject constructor( + @ApplicationContext val context: Context +) : PermissionProvider { + override fun isGrated(permission: String): Boolean { + return ContextCompat.checkSelfPermission( + context, + permission + ) == PackageManager.PERMISSION_GRANTED + } + + override fun isAllGrated(list: List): Boolean { + var isAllGrated = true + for (permission in list) { + if (!isGrated(permission)) { + isAllGrated = false + break + } + } + return isAllGrated + } + + override fun isAllGrated(map: Map): Boolean { + var isAllGrated = true + for ((_, value) in map) { + if (!value) { + isAllGrated = false + break + } + } + return isAllGrated + } + + override fun moveToSetting() { + Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.parse("package:${context.packageName}") + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + addCategory(Intent.CATEGORY_DEFAULT) + context.startActivity(this) + } + } +} \ No newline at end of file diff --git a/features/compose_permissions_result/.gitignore b/features/compose_permissions_result/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/features/compose_permissions_result/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/compose_permissions_result/build.gradle.kts b/features/compose_permissions_result/build.gradle.kts new file mode 100644 index 00000000..9ff5a3bd --- /dev/null +++ b/features/compose_permissions_result/build.gradle.kts @@ -0,0 +1,58 @@ +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("dagger.hilt.android.plugin") + kotlin("kapt") +} + +android { + namespace = "com.hmju.compose_permissions_result" + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = Compose.compile + } +} + +dependencies { + implementation(project(":core")) + implementation(project(":features:compose_permissions_result_bridge")) + + /** + * Android X + */ + implementation(AndroidX.appCompat) + + /** + * Hilt + */ + implementation(Hilt.android) + kapt(Hilt.compiler) + implementation(Hilt.compose) + + /** + * Compose + */ + implementation(platform(Compose.base)) + implementation(Compose.material) + implementation(Compose.ui) + implementation(Compose.preview) + implementation(Compose.viewModel) + implementation(Compose.constraint) + implementation(Compose.tracing) + implementation(Compose.activity) + implementation(Glide.compose) + // implementation("com.google.accompanist:accompanist-permissions:0.23.1") + + /** + * Timber + */ + implementation(Log.timber) + + testImplementation(UnitTest.junit) + androidTestImplementation(platform(Compose.base)) + debugImplementation(UnitTest.Compose.tooling) + androidTestImplementation(UnitTest.Compose.junit) + androidTestImplementation(UnitTest.Compose.manifest) +} \ No newline at end of file diff --git a/features/compose_permissions_result/consumer-rules.pro b/features/compose_permissions_result/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/features/compose_permissions_result/proguard-rules.pro b/features/compose_permissions_result/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/features/compose_permissions_result/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/features/compose_permissions_result/src/androidTest/java/com/hmju/compose_permissions_result/ExampleInstrumentedTest.kt b/features/compose_permissions_result/src/androidTest/java/com/hmju/compose_permissions_result/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..8bb68530 --- /dev/null +++ b/features/compose_permissions_result/src/androidTest/java/com/hmju/compose_permissions_result/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.hmju.compose_permissions_result + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.hmju.compose_permissions_result.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/features/compose_permissions_result/src/main/AndroidManifest.xml b/features/compose_permissions_result/src/main/AndroidManifest.xml new file mode 100644 index 00000000..ff604443 --- /dev/null +++ b/features/compose_permissions_result/src/main/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/ComposePermissionsResultActivity.kt b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/ComposePermissionsResultActivity.kt new file mode 100644 index 00000000..80fea4bf --- /dev/null +++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/ComposePermissionsResultActivity.kt @@ -0,0 +1,15 @@ +package com.hmju.compose_permissions_result + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.activity.compose.setContent +import com.hmju.compose_permissions_result.screen.PermissionScreen +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class ComposePermissionsResultActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { PermissionScreen() } + } +} diff --git a/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/di/FeatureModule.kt b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/di/FeatureModule.kt new file mode 100644 index 00000000..b9a80146 --- /dev/null +++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/di/FeatureModule.kt @@ -0,0 +1,26 @@ +package com.hmju.compose_permissions_result.di + +import android.content.Context +import com.hmju.compose_permissions_result.impl.ComposePermissionsResultBridgeImpl +import com.hmju.compose_permissions_result_bridge.ComposePermissionsResultBridge +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent + +/** + * Description : + * + * Created by juhongmin on 4/3/24 + */ +@InstallIn(SingletonComponent::class) +@Module +class FeatureModule { + @Provides + fun provideBridge( + @ApplicationContext context: Context + ): ComposePermissionsResultBridge { + return ComposePermissionsResultBridgeImpl(context) + } +} diff --git a/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/impl/ComposePermissionsResultBridgeImpl.kt b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/impl/ComposePermissionsResultBridgeImpl.kt new file mode 100644 index 00000000..115691f3 --- /dev/null +++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/impl/ComposePermissionsResultBridgeImpl.kt @@ -0,0 +1,22 @@ +package com.hmju.compose_permissions_result.impl + +import android.content.Context +import android.content.Intent +import com.hmju.compose_permissions_result.ComposePermissionsResultActivity +import com.hmju.compose_permissions_result_bridge.ComposePermissionsResultBridge + +/** + * Description : + * + * Created by juhongmin on 4/3/24 + */ +internal class ComposePermissionsResultBridgeImpl( + private val context: Context +) : ComposePermissionsResultBridge { + override fun moveToPage() { + Intent(context, ComposePermissionsResultActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(this) + } + } +} diff --git a/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionScreen.kt b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionScreen.kt new file mode 100644 index 00000000..703b1bec --- /dev/null +++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionScreen.kt @@ -0,0 +1,117 @@ +package com.hmju.compose_permissions_result.screen + +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.hmju.core.compose.ComposeLifecycleState +import com.hmju.core.compose.TilTheme +import com.hmju.core.compose.rememberLifecycleUpdatedState + +/** + * Description : + * + * Created by juhongmin on 4/3/24 + */ +// @Preview +@Composable +fun PermissionScreen( + viewModel: PermissionViewModel = hiltViewModel() +) { + val lifecycleOwner = LocalLifecycleOwner.current + val lifecycleState = rememberLifecycleUpdatedState(lifecycleOwner) + val launcher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { result -> + if (!viewModel.isAllGrated(result)) { + viewModel.moveToSetting() + } + } + + val scrollState = rememberScrollState() + + MaterialTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + Column( + modifier = Modifier.fillMaxWidth() + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(50.dp) + .background(TilTheme.color.blue), + contentAlignment = Alignment.Center + ) { + Text( + text = "권한 팝업 입니다.", + style = TilTheme.text.h3, + color = TilTheme.color.white, + textAlign = TextAlign.Center + ) + } + + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(scrollState), + verticalArrangement = Arrangement.Center + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .background(TilTheme.color.purple) + .wrapContentHeight(), + contentAlignment = Alignment.Center + ) { + val state = lifecycleState.value + val msg = if (state == ComposeLifecycleState.ON_RESUME) { + if (viewModel.isAllGrated(viewModel.getPermissionList().toList())) { + "모든 권한 허용" + } else { + "모든 권한 거부된 상태 입니다." + } + } else { + "권한 체크중" + } + Text( + text = msg, + style = TilTheme.text.h3, + color = TilTheme.color.white, + textAlign = TextAlign.Center, + modifier = Modifier + .wrapContentSize() + .padding(top = 50.dp, bottom = 50.dp) + ) + } + } + } + } + } + LaunchedEffect(Unit) { + launcher.launch(viewModel.getPermissionList()) + } +} \ No newline at end of file diff --git a/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionViewModel.kt b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionViewModel.kt new file mode 100644 index 00000000..c51e60c6 --- /dev/null +++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionViewModel.kt @@ -0,0 +1,37 @@ +package com.hmju.compose_permissions_result.screen + +import android.Manifest +import androidx.lifecycle.ViewModel +import com.hmju.core.permission.PermissionProvider +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +/** + * Description : + * + * Created by juhongmin on 4/3/24 + */ +@HiltViewModel +class PermissionViewModel @Inject constructor( + private val provider: PermissionProvider +) : ViewModel() { + fun isAllGrated(result: Map): Boolean { + return provider.isAllGrated(result) + } + + fun isAllGrated(result: List): Boolean { + return provider.isAllGrated(result) + } + + fun moveToSetting() { + provider.moveToSetting() + } + + fun getPermissionList() : Array { + return arrayOf( + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.CAMERA + ) + } +} diff --git a/features/compose_permissions_result/src/main/res/values/strings.xml b/features/compose_permissions_result/src/main/res/values/strings.xml new file mode 100644 index 00000000..73862c41 --- /dev/null +++ b/features/compose_permissions_result/src/main/res/values/strings.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/features/compose_permissions_result/src/test/java/com/hmju/compose_permissions_result/ExampleUnitTest.kt b/features/compose_permissions_result/src/test/java/com/hmju/compose_permissions_result/ExampleUnitTest.kt new file mode 100644 index 00000000..508cf65a --- /dev/null +++ b/features/compose_permissions_result/src/test/java/com/hmju/compose_permissions_result/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.hmju.compose_permissions_result + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/features/compose_permissions_result_bridge/.gitignore b/features/compose_permissions_result_bridge/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/features/compose_permissions_result_bridge/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/compose_permissions_result_bridge/build.gradle.kts b/features/compose_permissions_result_bridge/build.gradle.kts new file mode 100644 index 00000000..1de8b47a --- /dev/null +++ b/features/compose_permissions_result_bridge/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "com.hmju.compose_permissions_result_bridge" +} + +dependencies { + /** + * Android X + */ + implementation(AndroidX.appCompat) +} \ No newline at end of file diff --git a/features/compose_permissions_result_bridge/consumer-rules.pro b/features/compose_permissions_result_bridge/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/features/compose_permissions_result_bridge/proguard-rules.pro b/features/compose_permissions_result_bridge/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/features/compose_permissions_result_bridge/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/features/compose_permissions_result_bridge/src/main/AndroidManifest.xml b/features/compose_permissions_result_bridge/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/features/compose_permissions_result_bridge/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/features/compose_permissions_result_bridge/src/main/java/com/hmju/compose_permissions_result_bridge/ComposePermissionsResultBridge.kt b/features/compose_permissions_result_bridge/src/main/java/com/hmju/compose_permissions_result_bridge/ComposePermissionsResultBridge.kt new file mode 100644 index 00000000..04ad75aa --- /dev/null +++ b/features/compose_permissions_result_bridge/src/main/java/com/hmju/compose_permissions_result_bridge/ComposePermissionsResultBridge.kt @@ -0,0 +1,10 @@ +package com.hmju.compose_permissions_result_bridge + +/** + * Description : + * + * Created by juhongmin on 4/3/24 + */ +interface ComposePermissionsResultBridge { + fun moveToPage() +} diff --git a/features/main/build.gradle.kts b/features/main/build.gradle.kts index bc38199c..1fd19e41 100644 --- a/features/main/build.gradle.kts +++ b/features/main/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation(project(":features:base-mvvm-bridge")) implementation(project(":features:async_migrate_bridge")) implementation(project(":features:compose-ui-bridge")) + implementation(project(":features:compose_permissions_result_bridge")) /** * Android X diff --git a/features/main/src/main/java/com/features/main/MainViewModel.kt b/features/main/src/main/java/com/features/main/MainViewModel.kt index e5b473e5..f1657739 100644 --- a/features/main/src/main/java/com/features/main/MainViewModel.kt +++ b/features/main/src/main/java/com/features/main/MainViewModel.kt @@ -5,6 +5,7 @@ import com.features.base_mvvm_bridge.BaseMvvmBridge import com.features.compose_ui_bridge.ComposeUiBridge import com.features.network_bridge.NetworkBridge import com.features.recyclerview_bridge.RecyclerViewBridge +import com.hmju.compose_permissions_result_bridge.ComposePermissionsResultBridge import com.hmju.core.ui.base.ActivityViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -20,7 +21,8 @@ class MainViewModel @Inject constructor( private val recyclerViewBridge: RecyclerViewBridge, private val mvvmRequirements: BaseMvvmBridge, private val asyncMigrateBridge: AsyncMigrateBridge, - private val composeUiBridge: ComposeUiBridge + private val composeUiBridge: ComposeUiBridge, + private val composePermissionsResultBridge: ComposePermissionsResultBridge ) : ActivityViewModel() { fun moveToNetworkPage() { @@ -46,4 +48,8 @@ class MainViewModel @Inject constructor( fun moveToMemoComposePage() { composeUiBridge.moveToMemoPage() } + + fun moveToPermissionsResultPage() { + composePermissionsResultBridge.moveToPage() + } } diff --git a/features/main/src/main/res/layout/activity_main.xml b/features/main/src/main/res/layout/activity_main.xml index a9fd8324..403fe7b5 100644 --- a/features/main/src/main/res/layout/activity_main.xml +++ b/features/main/src/main/res/layout/activity_main.xml @@ -63,6 +63,14 @@ android:onClick="@{()->vm.moveToMemoComposePage()}" android:text="Compose UI 메모 리스트 페이지" /> +