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 메모 리스트 페이지" /> +