From 7b6f9b4959826926e61c806d896ed4ecb7bc7852 Mon Sep 17 00:00:00 2001
From: Sieun Ju <33802191+sieunju@users.noreply.github.com>
Date: Wed, 3 Apr 2024 22:00:36 +0900
Subject: [PATCH 1/5] =?UTF-8?q?feat:=20Compose=20=EA=B6=8C=ED=95=9C=20?=
=?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B0=A9=EC=8B=9D=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle.kts | 1 +
buildSrc/src/main/java/Dependencies.kt | 2 +-
.../compose_permissions_result/.gitignore | 1 +
.../build.gradle.kts | 57 ++++++++++++++
.../consumer-rules.pro | 0
.../proguard-rules.pro | 21 ++++++
.../ExampleInstrumentedTest.kt | 24 ++++++
.../src/main/AndroidManifest.xml | 13 ++++
.../ComposePermissionsResultActivity.kt | 15 ++++
.../di/FeatureModule.kt | 26 +++++++
.../ComposePermissionsResultBridgeImpl.kt | 22 ++++++
.../screen/PermissionScreen.kt | 75 +++++++++++++++++++
.../screen/PermissionViewModel.kt | 17 +++++
.../src/main/res/values/strings.xml | 1 +
.../ExampleUnitTest.kt | 17 +++++
.../.gitignore | 1 +
.../build.gradle.kts | 15 ++++
.../consumer-rules.pro | 0
.../proguard-rules.pro | 21 ++++++
.../src/main/AndroidManifest.xml | 4 +
.../ComposePermissionsResultBridge.kt | 10 +++
features/main/build.gradle.kts | 1 +
.../java/com/features/main/MainViewModel.kt | 8 +-
.../src/main/res/layout/activity_main.xml | 8 ++
settings.gradle.kts | 2 +
25 files changed, 360 insertions(+), 2 deletions(-)
create mode 100644 features/compose_permissions_result/.gitignore
create mode 100644 features/compose_permissions_result/build.gradle.kts
create mode 100644 features/compose_permissions_result/consumer-rules.pro
create mode 100644 features/compose_permissions_result/proguard-rules.pro
create mode 100644 features/compose_permissions_result/src/androidTest/java/com/hmju/compose_permissions_result/ExampleInstrumentedTest.kt
create mode 100644 features/compose_permissions_result/src/main/AndroidManifest.xml
create mode 100644 features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/ComposePermissionsResultActivity.kt
create mode 100644 features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/di/FeatureModule.kt
create mode 100644 features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/impl/ComposePermissionsResultBridgeImpl.kt
create mode 100644 features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionScreen.kt
create mode 100644 features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionViewModel.kt
create mode 100644 features/compose_permissions_result/src/main/res/values/strings.xml
create mode 100644 features/compose_permissions_result/src/test/java/com/hmju/compose_permissions_result/ExampleUnitTest.kt
create mode 100644 features/compose_permissions_result_bridge/.gitignore
create mode 100644 features/compose_permissions_result_bridge/build.gradle.kts
create mode 100644 features/compose_permissions_result_bridge/consumer-rules.pro
create mode 100644 features/compose_permissions_result_bridge/proguard-rules.pro
create mode 100644 features/compose_permissions_result_bridge/src/main/AndroidManifest.xml
create mode 100644 features/compose_permissions_result_bridge/src/main/java/com/hmju/compose_permissions_result_bridge/ComposePermissionsResultBridge.kt
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..f8dc986a 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"
}
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..683765ab
--- /dev/null
+++ b/features/compose_permissions_result/build.gradle.kts
@@ -0,0 +1,57 @@
+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)
+
+ /**
+ * 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..78f3627a
--- /dev/null
+++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionScreen.kt
@@ -0,0 +1,75 @@
+package com.hmju.compose_permissions_result.screen
+
+import android.Manifest
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+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.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.hilt.navigation.compose.hiltViewModel
+import com.hmju.core.compose.TilTheme
+import timber.log.Timber
+
+/**
+ * Description :
+ *
+ * Created by juhongmin on 4/3/24
+ */
+@Preview
+@Composable
+fun PermissionScreen(
+ viewModel: PermissionViewModel = hiltViewModel()
+) {
+ val launcher = rememberLauncherForActivityResult(
+ ActivityResultContracts.RequestMultiplePermissions()
+ ) { result ->
+ Timber.d("Result ${result}")
+ }
+
+ val permissions = arrayOf(
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA
+ )
+
+ Column(
+ modifier = Modifier.fillMaxSize()
+ ) {
+ Text(
+ text = "Compose 권한 팝업 입니다.",
+ style = TilTheme.text.h3,
+ color = TilTheme.color.white,
+ textAlign = TextAlign.Center,
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(50.dp)
+ .background(TilTheme.color.blue)
+ )
+
+ Text(
+ text = "권한 버튼 클릭",
+ style = TilTheme.text.h3,
+ color = TilTheme.color.white,
+ textAlign = TextAlign.Center,
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(50.dp)
+ .background(TilTheme.color.blue)
+ .clickable {
+ launcher.launch(permissions)
+ }
+ )
+ }
+}
\ 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..cd4b4201
--- /dev/null
+++ b/features/compose_permissions_result/src/main/java/com/hmju/compose_permissions_result/screen/PermissionViewModel.kt
@@ -0,0 +1,17 @@
+package com.hmju.compose_permissions_result.screen
+
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+/**
+ * Description :
+ *
+ * Created by juhongmin on 4/3/24
+ */
+@HiltViewModel
+class PermissionViewModel @Inject constructor(
+
+) : ViewModel() {
+
+}
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 메모 리스트 페이지" />
+
+
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 62a73e54..2ceeddda 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -40,3 +40,5 @@ include(":features:base_mvvm_lifecycle")
include(":features:base_mvvm_lifecycle_bridge")
include(":features:base_mvvm_bottom_sheet")
include(":features:base_mvvm_bottom_sheet_bridge")
+include(":features:compose_permissions_result")
+include(":features:compose_permissions_result_bridge")
From 94a2831f0f84d7d5a5b12e2a5436ab9befe2d4a3 Mon Sep 17 00:00:00 2001
From: Sieun Ju <33802191+sieunju@users.noreply.github.com>
Date: Wed, 3 Apr 2024 22:01:06 +0900
Subject: [PATCH 2/5] =?UTF-8?q?feat:=20Compose=20=EA=B6=8C=ED=95=9C=20?=
=?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B0=A9=EC=8B=9D=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../hmju/compose_permissions_result/screen/PermissionScreen.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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
index 78f3627a..08b4c73f 100644
--- 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
@@ -66,7 +66,7 @@ fun PermissionScreen(
modifier = Modifier
.fillMaxWidth()
.height(50.dp)
- .background(TilTheme.color.blue)
+ .background(TilTheme.color.purple)
.clickable {
launcher.launch(permissions)
}
From ab42b3fcf72a20928344bfae46e87c43fefe4f7d Mon Sep 17 00:00:00 2001
From: Sieun Ju <33802191+sieunju@users.noreply.github.com>
Date: Thu, 4 Apr 2024 22:44:57 +0900
Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EA=B6=8C=ED=95=9C=20=EC=83=81?=
=?UTF-8?q?=ED=83=9C=20Lifecycle=20=EC=97=90=20=EB=94=B0=EB=9D=BC=EC=84=9C?=
=?UTF-8?q?=20=EA=B3=84=EC=86=8D=ED=95=B4=EC=84=9C=20=ED=99=95=EC=9D=B8?=
=?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=201=EC=B0=A8=20?=
=?UTF-8?q?=EB=B0=98=EC=98=81=20-=20=EC=A2=80=20=EC=A0=95=EB=A6=AC?=
=?UTF-8?q?=EB=90=9C=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EC=B2=98=EB=A6=AC?=
=?UTF-8?q?=ED=95=A0=20=EC=98=88=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../build.gradle.kts | 1 +
.../screen/PermissionScreen.kt | 178 ++++++++++++++----
2 files changed, 147 insertions(+), 32 deletions(-)
diff --git a/features/compose_permissions_result/build.gradle.kts b/features/compose_permissions_result/build.gradle.kts
index 683765ab..9ff5a3bd 100644
--- a/features/compose_permissions_result/build.gradle.kts
+++ b/features/compose_permissions_result/build.gradle.kts
@@ -43,6 +43,7 @@ dependencies {
implementation(Compose.tracing)
implementation(Compose.activity)
implementation(Glide.compose)
+ // implementation("com.google.accompanist:accompanist-permissions:0.23.1")
/**
* Timber
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
index 08b4c73f..73124442 100644
--- 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
@@ -1,24 +1,45 @@
package com.hmju.compose_permissions_result.screen
import android.Manifest
+import android.app.Activity
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.net.Uri
+import android.provider.Settings
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
+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.material3.Scaffold
+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.material3.TopAppBar
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import androidx.core.content.ContextCompat
import androidx.hilt.navigation.compose.hiltViewModel
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
import com.hmju.core.compose.TilTheme
import timber.log.Timber
@@ -32,44 +53,137 @@ import timber.log.Timber
fun PermissionScreen(
viewModel: PermissionViewModel = hiltViewModel()
) {
- val launcher = rememberLauncherForActivityResult(
- ActivityResultContracts.RequestMultiplePermissions()
- ) { result ->
- Timber.d("Result ${result}")
+ val context = LocalContext.current
+ val lifecycleOwner = LocalLifecycleOwner.current
+ val lifecycleState = remember(lifecycleOwner) {
+ mutableStateOf(Lifecycle.Event.ON_CREATE)
}
-
val permissions = arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA
)
+ DisposableEffect(Unit) {
+ val observer = LifecycleEventObserver { _, event ->
+ lifecycleState.value = event
+ }
+ lifecycleOwner.lifecycle.addObserver(observer)
+ onDispose {
+ lifecycleOwner.lifecycle.removeObserver(observer)
+ }
+ }
+ val launcher = rememberLauncherForActivityResult(
+ ActivityResultContracts.RequestMultiplePermissions()
+ ) { result ->
+ var isAllGrated = true
+ for ((_, value) in result) {
+ if (!value) {
+ isAllGrated = false
+ break
+ }
+ }
+ Timber.d("모든 권한 허용 $isAllGrated")
+ if (!isAllGrated) {
+ 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)
+ }
+ }
+ }
- Column(
- modifier = Modifier.fillMaxSize()
- ) {
- Text(
- text = "Compose 권한 팝업 입니다.",
- style = TilTheme.text.h3,
- color = TilTheme.color.white,
- textAlign = TextAlign.Center,
- modifier = Modifier
- .fillMaxWidth()
- .height(50.dp)
- .background(TilTheme.color.blue)
- )
+ 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
+ )
+ }
- Text(
- text = "권한 버튼 클릭",
- style = TilTheme.text.h3,
- color = TilTheme.color.white,
- textAlign = TextAlign.Center,
- modifier = Modifier
- .fillMaxWidth()
- .height(50.dp)
- .background(TilTheme.color.purple)
- .clickable {
- launcher.launch(permissions)
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .verticalScroll(scrollState),
+ verticalArrangement = Arrangement.Center
+ ) {
+ Box(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(TilTheme.color.purple)
+ .wrapContentHeight()
+ .clickable { launcher.launch(permissions) },
+ contentAlignment = Alignment.Center
+ ) {
+ Text(
+ text = "권한 버튼 클릭",
+ style = TilTheme.text.h3,
+ color = TilTheme.color.white,
+ textAlign = TextAlign.Center,
+ modifier = Modifier
+ .wrapContentSize()
+ .padding(top = 50.dp, bottom = 50.dp)
+ )
+ }
+ Box(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(TilTheme.color.purple)
+ .wrapContentHeight(),
+ contentAlignment = Alignment.Center
+ ) {
+ val state = lifecycleState.value
+ val msg = if (state == Lifecycle.Event.ON_RESUME) {
+ var isAllGrated = true
+ for (element in permissions) {
+ if (ContextCompat.checkSelfPermission(
+ context,
+ element
+ ) == PackageManager.PERMISSION_DENIED
+ ) {
+ isAllGrated = false
+ break
+ }
+ }
+ if (isAllGrated) {
+ "모든 권한 허용"
+ } 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)
+ )
+ }
}
- )
+ }
+ }
}
}
\ No newline at end of file
From bdeeebad9b971f6774b9897d5a015dc6123da4bc Mon Sep 17 00:00:00 2001
From: Sieun Ju <33802191+sieunju@users.noreply.github.com>
Date: Fri, 5 Apr 2024 01:12:36 +0900
Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=EA=B6=8C=ED=95=9C=20=EC=83=81?=
=?UTF-8?q?=ED=83=9C=20Lifecycle=20=EC=97=90=20=EB=94=B0=EB=9D=BC=EC=84=9C?=
=?UTF-8?q?=20=EA=B3=84=EC=86=8D=ED=95=B4=EC=84=9C=20=EC=98=B5=EC=A0=80?=
=?UTF-8?q?=EB=B9=99=20=ED=95=A0=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=9C=A0?=
=?UTF-8?q?=ED=8B=B8=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20-=20Permi?=
=?UTF-8?q?ssionProvider=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
buildSrc/src/main/java/Dependencies.kt | 1 +
core/build.gradle.kts | 1 +
.../core/compose/ComposeLifecycleState.kt | 26 ++++++++
.../core/compose/RememberLifecycleState.kt | 36 +++++++++++
.../core/permission/PermissionProvider.kt | 14 +++++
.../core/permission/di/PermissionModule.kt | 22 +++++++
.../permission/impl/PermissionProviderImpl.kt | 60 ++++++++++++++++++
.../screen/PermissionScreen.kt | 63 +++----------------
.../screen/PermissionViewModel.kt | 13 +++-
9 files changed, 181 insertions(+), 55 deletions(-)
create mode 100644 core/src/main/java/com/hmju/core/compose/ComposeLifecycleState.kt
create mode 100644 core/src/main/java/com/hmju/core/compose/RememberLifecycleState.kt
create mode 100644 core/src/main/java/com/hmju/core/permission/PermissionProvider.kt
create mode 100644 core/src/main/java/com/hmju/core/permission/di/PermissionModule.kt
create mode 100644 core/src/main/java/com/hmju/core/permission/impl/PermissionProviderImpl.kt
diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt
index f8dc986a..1f389bcd 100644
--- a/buildSrc/src/main/java/Dependencies.kt
+++ b/buildSrc/src/main/java/Dependencies.kt
@@ -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/RememberLifecycleState.kt b/core/src/main/java/com/hmju/core/compose/RememberLifecycleState.kt
new file mode 100644
index 00000000..1021ce91
--- /dev/null
+++ b/core/src/main/java/com/hmju/core/compose/RememberLifecycleState.kt
@@ -0,0 +1,36 @@
+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
+
+/**
+ * Description :
+ *
+ * Created by juhongmin on 4/5/24
+ */
+
+@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
+}
\ No newline at end of file
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/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
index 73124442..b2d0ab48 100644
--- 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
@@ -1,11 +1,6 @@
package com.hmju.compose_permissions_result.screen
import android.Manifest
-import android.app.Activity
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.net.Uri
-import android.provider.Settings
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
@@ -26,9 +21,9 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
@@ -36,12 +31,10 @@ import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import androidx.core.content.ContextCompat
import androidx.hilt.navigation.compose.hiltViewModel
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleEventObserver
+import com.hmju.core.compose.ComposeLifecycleState
import com.hmju.core.compose.TilTheme
-import timber.log.Timber
+import com.hmju.core.compose.rememberLifecycleUpdatedState
/**
* Description :
@@ -53,45 +46,18 @@ import timber.log.Timber
fun PermissionScreen(
viewModel: PermissionViewModel = hiltViewModel()
) {
- val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current
- val lifecycleState = remember(lifecycleOwner) {
- mutableStateOf(Lifecycle.Event.ON_CREATE)
- }
+ val lifecycleState = rememberLifecycleUpdatedState(lifecycleOwner)
val permissions = arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA
)
- DisposableEffect(Unit) {
- val observer = LifecycleEventObserver { _, event ->
- lifecycleState.value = event
- }
- lifecycleOwner.lifecycle.addObserver(observer)
- onDispose {
- lifecycleOwner.lifecycle.removeObserver(observer)
- }
- }
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { result ->
- var isAllGrated = true
- for ((_, value) in result) {
- if (!value) {
- isAllGrated = false
- break
- }
- }
- Timber.d("모든 권한 허용 $isAllGrated")
- if (!isAllGrated) {
- 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)
- }
+ if (!viewModel.isAllGrated(result)) {
+ viewModel.moveToSetting()
}
}
@@ -152,19 +118,8 @@ fun PermissionScreen(
contentAlignment = Alignment.Center
) {
val state = lifecycleState.value
- val msg = if (state == Lifecycle.Event.ON_RESUME) {
- var isAllGrated = true
- for (element in permissions) {
- if (ContextCompat.checkSelfPermission(
- context,
- element
- ) == PackageManager.PERMISSION_DENIED
- ) {
- isAllGrated = false
- break
- }
- }
- if (isAllGrated) {
+ val msg = if (state == ComposeLifecycleState.ON_RESUME) {
+ if (viewModel.isAllGrated(permissions.toList())) {
"모든 권한 허용"
} else {
"모든 권한 거부된 상태 입니다."
@@ -173,7 +128,7 @@ fun PermissionScreen(
"권한 체크중"
}
Text(
- text = "${msg}",
+ text = msg,
style = TilTheme.text.h3,
color = TilTheme.color.white,
textAlign = TextAlign.Center,
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
index cd4b4201..baed5b8f 100644
--- 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
@@ -1,6 +1,7 @@
package com.hmju.compose_permissions_result.screen
import androidx.lifecycle.ViewModel
+import com.hmju.core.permission.PermissionProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@@ -11,7 +12,17 @@ import javax.inject.Inject
*/
@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()
+ }
}
From ada5e6ee499bcccbd0d090fa0eb6e16ff26dfa1f Mon Sep 17 00:00:00 2001
From: Sieun Ju <33802191+sieunju@users.noreply.github.com>
Date: Sat, 6 Apr 2024 15:25:13 +0900
Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EA=B6=8C=ED=95=9C=20=EC=83=81?=
=?UTF-8?q?=ED=83=9C=20Lifecycle=20=EC=97=90=20=EB=94=B0=EB=9D=BC=EC=84=9C?=
=?UTF-8?q?=20=EA=B3=84=EC=86=8D=ED=95=B4=EC=84=9C=20=EC=98=B5=EC=A0=80?=
=?UTF-8?q?=EB=B9=99=20=ED=95=A0=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=9C=A0?=
=?UTF-8?q?=ED=8B=B8=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20-=20Permi?=
=?UTF-8?q?ssionProvider=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...ememberLifecycleState.kt => Extensions.kt} | 13 ++++---
.../screen/PermissionScreen.kt | 39 +++----------------
.../screen/PermissionViewModel.kt | 9 +++++
3 files changed, 22 insertions(+), 39 deletions(-)
rename core/src/main/java/com/hmju/core/compose/{RememberLifecycleState.kt => Extensions.kt} (86%)
diff --git a/core/src/main/java/com/hmju/core/compose/RememberLifecycleState.kt b/core/src/main/java/com/hmju/core/compose/Extensions.kt
similarity index 86%
rename from core/src/main/java/com/hmju/core/compose/RememberLifecycleState.kt
rename to core/src/main/java/com/hmju/core/compose/Extensions.kt
index 1021ce91..39c8691c 100644
--- a/core/src/main/java/com/hmju/core/compose/RememberLifecycleState.kt
+++ b/core/src/main/java/com/hmju/core/compose/Extensions.kt
@@ -9,14 +9,15 @@ import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import com.hmju.core.compose.ComposeLifecycleState.Companion.from
+
/**
- * Description :
- *
- * Created by juhongmin on 4/5/24
+ * Compose 전용 Lifecycle Update 처리하는 함수
+ * @param lifecycleOwner Android LifecycleOwner
*/
-
@Composable
-fun rememberLifecycleUpdatedState(lifecycleOwner: LifecycleOwner): MutableState {
+fun rememberLifecycleUpdatedState(
+ lifecycleOwner: LifecycleOwner
+): MutableState {
val currentState = remember(lifecycleOwner) { mutableStateOf(ComposeLifecycleState.UN_KNOWN) }
DisposableEffect(Unit) {
val observer = LifecycleEventObserver { _, event ->
@@ -33,4 +34,4 @@ fun rememberLifecycleUpdatedState(lifecycleOwner: LifecycleOwner): MutableState<
}
}
return currentState
-}
\ No newline at end of file
+}
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
index b2d0ab48..703b1bec 100644
--- 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
@@ -1,10 +1,8 @@
package com.hmju.compose_permissions_result.screen
-import android.Manifest
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -20,16 +18,11 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.text.style.TextAlign
-import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.hmju.core.compose.ComposeLifecycleState
@@ -41,18 +34,13 @@ import com.hmju.core.compose.rememberLifecycleUpdatedState
*
* Created by juhongmin on 4/3/24
*/
-@Preview
+// @Preview
@Composable
fun PermissionScreen(
viewModel: PermissionViewModel = hiltViewModel()
) {
val lifecycleOwner = LocalLifecycleOwner.current
val lifecycleState = rememberLifecycleUpdatedState(lifecycleOwner)
- val permissions = arrayOf(
- Manifest.permission.ACCESS_COARSE_LOCATION,
- Manifest.permission.ACCESS_FINE_LOCATION,
- Manifest.permission.CAMERA
- )
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { result ->
@@ -92,24 +80,6 @@ fun PermissionScreen(
.verticalScroll(scrollState),
verticalArrangement = Arrangement.Center
) {
- Box(
- modifier = Modifier
- .fillMaxWidth()
- .background(TilTheme.color.purple)
- .wrapContentHeight()
- .clickable { launcher.launch(permissions) },
- contentAlignment = Alignment.Center
- ) {
- Text(
- text = "권한 버튼 클릭",
- style = TilTheme.text.h3,
- color = TilTheme.color.white,
- textAlign = TextAlign.Center,
- modifier = Modifier
- .wrapContentSize()
- .padding(top = 50.dp, bottom = 50.dp)
- )
- }
Box(
modifier = Modifier
.fillMaxWidth()
@@ -119,7 +89,7 @@ fun PermissionScreen(
) {
val state = lifecycleState.value
val msg = if (state == ComposeLifecycleState.ON_RESUME) {
- if (viewModel.isAllGrated(permissions.toList())) {
+ if (viewModel.isAllGrated(viewModel.getPermissionList().toList())) {
"모든 권한 허용"
} else {
"모든 권한 거부된 상태 입니다."
@@ -141,4 +111,7 @@ fun PermissionScreen(
}
}
}
+ 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
index baed5b8f..c51e60c6 100644
--- 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
@@ -1,5 +1,6 @@
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
@@ -25,4 +26,12 @@ class PermissionViewModel @Inject constructor(
fun moveToSetting() {
provider.moveToSetting()
}
+
+ fun getPermissionList() : Array {
+ return arrayOf(
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.CAMERA
+ )
+ }
}