diff --git a/.github/workflows/develop_PR_builder.yml b/.github/workflows/develop_PR_builder.yml index f458ba660..99aceb160 100644 --- a/.github/workflows/develop_PR_builder.yml +++ b/.github/workflows/develop_PR_builder.yml @@ -38,7 +38,6 @@ jobs: - name: Add Local Properties env: - KAKAO_API_KEY: ${{ secrets.KAKAO_API_KEY }} HMH_DEV_BASE_URL: ${{ secrets.HMH_DEV_BASE_URL }} HMH_PROD_BASE_URL: ${{ secrets.HMH_PROD_BASE_URL }} AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c49cfb838..9feac4e75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,7 +29,6 @@ jobs: - name: Add Local Properties env: - KAKAO_API_KEY: ${{ secrets.KAKAO_API_KEY }} HMH_DEV_BASE_URL: ${{ secrets.HMH_DEV_BASE_URL }} HMH_PROD_BASE_URL: ${{ secrets.HMH_PROD_BASE_URL }} AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f9c36afab..20ba44059 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -73,20 +73,16 @@ dependencies { // Domain implementation(projects.domain.usagestats) implementation(projects.domain.userinfo) - implementation(projects.domain.login) implementation(projects.domain.challenge) implementation(projects.domain.onboarding) - implementation(projects.domain.point) implementation(projects.domain.lock) // Data implementation(projects.data.usagestats) implementation(projects.data.userinfo) - implementation(projects.data.login) implementation(projects.data.challenge) implementation(projects.data.device) implementation(projects.data.onboarding) - implementation(projects.data.point) implementation(projects.data.lock) implementation(projects.data.main) @@ -107,8 +103,6 @@ dependencies { implementation(libs.splash.screen) implementation(libs.lottie) - // kakao - implementation(libs.kakao.login) // Hilt Worker implementation(libs.androidx.hilt.common) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 9ce8d9180..13ed258aa 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -5,11 +5,6 @@ # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html -##---------------Begin: Kakao SDK ---------- --keep class com.kakao.sdk.**.model.* { ; } --keep class * extends com.google.gson.TypeAdapter -##---------------END: Kakao SDK ---------- - ##---------------Begin: Okio ---------- # Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. -dontwarn org.codehaus.mojo.animal_sniffer.* diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 97e7c1b35..a96454722 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,21 +46,6 @@ - - - - - - - - - - - diff --git a/app/src/main/java/com/hmh/hamyeonham/HMHApplication.kt b/app/src/main/java/com/hmh/hamyeonham/HMHApplication.kt index 6f58f2185..7b3f8d600 100644 --- a/app/src/main/java/com/hmh/hamyeonham/HMHApplication.kt +++ b/app/src/main/java/com/hmh/hamyeonham/HMHApplication.kt @@ -7,7 +7,6 @@ import com.amplitude.api.Amplitude import com.hmh.hamyeonham.core.notification.AppNotificationManager import com.hmh.hamyeonham.firebase.setFirebaseCrashlyticsEnabled import com.hmh.hamyeonham.hus.usagestats.HMHUsageStatsManager -import com.kakao.sdk.common.KakaoSdk import dagger.hilt.EntryPoint import dagger.hilt.EntryPoints import dagger.hilt.InstallIn @@ -35,7 +34,6 @@ class HMHApplication : Application(), Configuration.Provider { super.onCreate() setFirebaseCrashlyticsEnabled(!BuildConfig.DEBUG) setAmplitude() - KakaoSdk.init(this, BuildConfig.KAKAO_API_KEY) HMHUsageStatsManager.init(this) notificationManager.setupNotificationChannel() } diff --git a/app/src/main/java/com/hmh/hamyeonham/StartActivity.kt b/app/src/main/java/com/hmh/hamyeonham/StartActivity.kt index a61918f1d..641df6a12 100644 --- a/app/src/main/java/com/hmh/hamyeonham/StartActivity.kt +++ b/app/src/main/java/com/hmh/hamyeonham/StartActivity.kt @@ -4,18 +4,14 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import com.hmh.hamyeonham.common.dialog.OneButtonCommonDialog import com.hmh.hamyeonham.common.view.viewBinding import com.hmh.hamyeonham.databinding.ActivitySampleBinding -import com.hmh.hamyeonham.feature.login.LoginActivity +import com.hmh.hamyeonham.feature.main.MainActivity import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers @AndroidEntryPoint class StartActivity : AppCompatActivity() { private val binding by viewBinding(ActivitySampleBinding::inflate) - private val coroutineScope = CoroutineScope(Dispatchers.Main) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -27,22 +23,15 @@ class StartActivity : AppCompatActivity() { private fun initLottieSplash() { binding.splashLottieAppLogo.playAnimation() - OneButtonCommonDialog - .newInstance( - title = "서비스를 개선하고 있어요", - description = "서비스를 개선하고 있어요 더 나은 모습으로 만나요", - iconRes = null, - confirmButtonText = "확인", - ) - .setConfirmButtonClickListener { - finish() + binding.splashLottieAppLogo.addAnimatorUpdateListener { + if (it.animatedFraction == 1.0f) { + navigateToLogin() } - .showAllowingStateLoss(supportFragmentManager) - + } } private fun navigateToLogin() { - startActivity(Intent(this, LoginActivity::class.java)) + startActivity(Intent(this, MainActivity::class.java)) finish() } } diff --git a/app/src/main/java/com/hmh/hamyeonham/navigation/DefaultNavigationProvider.kt b/app/src/main/java/com/hmh/hamyeonham/navigation/DefaultNavigationProvider.kt index 15c7b5992..6d1090c8a 100644 --- a/app/src/main/java/com/hmh/hamyeonham/navigation/DefaultNavigationProvider.kt +++ b/app/src/main/java/com/hmh/hamyeonham/navigation/DefaultNavigationProvider.kt @@ -2,11 +2,9 @@ package com.hmh.hamyeonham.navigation import android.content.Context import android.content.Intent -import com.hmh.hamyeonham.challenge.point.PointActivity import com.hmh.hamyeonham.common.navigation.NavigationProvider import com.hmh.hamyeonham.common.permission.PermissionActivity import com.hmh.hamyeonham.feature.lock.LockActivity -import com.hmh.hamyeonham.feature.login.LoginActivity import com.hmh.hamyeonham.feature.main.MainActivity import com.hmh.hamyeonham.feature.onboarding.OnBoardingActivity import com.hmh.hamyeonham.feature.onboarding.OnBoardingStoryActivity @@ -25,10 +23,6 @@ class DefaultNavigationProvider @Inject constructor( return Intent(context, OnBoardingStoryActivity::class.java) } - override fun toLogin(): Intent { - return Intent(context, LoginActivity::class.java) - } - override fun toMain(): Intent { return Intent(context, MainActivity::class.java) } @@ -41,10 +35,6 @@ class DefaultNavigationProvider @Inject constructor( return Intent(context, StoreActivity::class.java) } - override fun toPoint(): Intent { - return Intent(context, PointActivity::class.java) - } - override fun toPermission(): Intent { return Intent(context, PermissionActivity::class.java) } diff --git a/app/src/main/res/layout/activity_sample.xml b/app/src/main/res/layout/activity_sample.xml index 3956b1f15..57bae3534 100644 --- a/app/src/main/res/layout/activity_sample.xml +++ b/app/src/main/res/layout/activity_sample.xml @@ -33,6 +33,6 @@ app:lottie_autoPlay="true" app:lottie_loop="false" app:lottie_rawRes="@raw/splash_logo_white" - app:lottie_speed="1" /> + app:lottie_speed="1.5" /> diff --git a/build-logic/convention/src/main/kotlin/com/hmh/hamyeonham/plugin/CommonConfigs.kt b/build-logic/convention/src/main/kotlin/com/hmh/hamyeonham/plugin/CommonConfigs.kt index 043182a98..73a8c7aaf 100644 --- a/build-logic/convention/src/main/kotlin/com/hmh/hamyeonham/plugin/CommonConfigs.kt +++ b/build-logic/convention/src/main/kotlin/com/hmh/hamyeonham/plugin/CommonConfigs.kt @@ -22,10 +22,6 @@ internal fun Project.configureAndroidCommonPlugin() { extensions.getByType().apply { defaultConfig { - val kakaoApiKey = properties["kakaoApiKey"] as? String ?: "" - manifestPlaceholders["kakaoApiKey"] = properties["kakaoApiKey"] as String - buildConfigField("String", "KAKAO_API_KEY", "\"${kakaoApiKey}\"") - val amplitudeApiKey = properties["amplitudeApiKey"] as? String ?: "" buildConfigField("String", "AMPLITUDE_API_KEY", "\"${amplitudeApiKey}\"") } diff --git a/core/common/src/main/java/com/hmh/hamyeonham/common/navigation/NavigationProvider.kt b/core/common/src/main/java/com/hmh/hamyeonham/common/navigation/NavigationProvider.kt index 4ec1d86d1..f1282a47f 100644 --- a/core/common/src/main/java/com/hmh/hamyeonham/common/navigation/NavigationProvider.kt +++ b/core/common/src/main/java/com/hmh/hamyeonham/common/navigation/NavigationProvider.kt @@ -10,10 +10,8 @@ interface NavigationProvider { fun toOnBoarding(): Intent fun toOnBoardingStory(): Intent - fun toLogin(): Intent fun toMain(): Intent fun toLock(packageName: String): Intent fun toStore(): Intent - fun toPoint(): Intent fun toPermission(): Intent } diff --git a/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionActivity.kt b/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionActivity.kt index 1dd6105e2..ee5e95254 100644 --- a/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionActivity.kt +++ b/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionActivity.kt @@ -1,14 +1,16 @@ package com.hmh.hamyeonham.common.permission -import android.app.usage.UsageStatsManager +import android.app.AppOpsManager import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Build import android.os.Bundle import android.provider.Settings import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.core.net.toUri import com.hmh.hamyeonham.common.context.hasNotificationPermission import com.hmh.hamyeonham.common.context.toast import com.hmh.hamyeonham.common.databinding.ActivityPermissionBinding @@ -115,27 +117,11 @@ class PermissionActivity : AppCompatActivity() { private fun requestUsageAccessPermission() { try { - val packageUri = Uri.parse("package:$packageName") + val packageUri = "package:$packageName".toUri() val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS, packageUri) usageStatsPermissionLauncher.launch(intent) } catch (e: Exception) { usageStatsPermissionLauncher.launch(Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)) } } - - private fun hasUsageStatsPermission(): Boolean { - val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as? UsageStatsManager - val time = System.currentTimeMillis() - val stats = usageStatsManager?.queryUsageStats( - UsageStatsManager.INTERVAL_DAILY, - time - 1000 * 60, - time, - ) - return !stats.isNullOrEmpty() - - } - - private fun hasOverlayPermission(): Boolean { - return Settings.canDrawOverlays(this) - } } \ No newline at end of file diff --git a/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionExt.kt b/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionExt.kt index 6d6c3f9e9..10983cf50 100644 --- a/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionExt.kt +++ b/core/common/src/main/java/com/hmh/hamyeonham/common/permission/PermissionExt.kt @@ -1,6 +1,7 @@ package com.hmh.hamyeonham.common.permission import android.Manifest +import android.app.AppOpsManager import android.app.usage.UsageStatsManager import android.content.Context import android.content.Intent @@ -38,14 +39,29 @@ fun AppCompatActivity.requestUsageAccessPermission() { } fun AppCompatActivity.hasUsageStatsPermission(): Boolean { - val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager - val time = System.currentTimeMillis() - val stats = usageStatsManager.queryUsageStats( - UsageStatsManager.INTERVAL_DAILY, - time - 1000 * 60, - time, - ) - return stats != null && stats.isNotEmpty() + val ops = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager + val mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ops.unsafeCheckOpNoThrow( + AppOpsManager.OPSTR_GET_USAGE_STATS, + android.os.Process.myUid(), + packageName + ) + } else { + ops.checkOpNoThrow( + AppOpsManager.OPSTR_GET_USAGE_STATS, + android.os.Process.myUid(), + packageName + ) + } + + return when (mode) { + AppOpsManager.MODE_ALLOWED -> true + AppOpsManager.MODE_DEFAULT, + AppOpsManager.MODE_IGNORED, + AppOpsManager.MODE_ERRORED -> false + + else -> false + } } fun AppCompatActivity.hasOverlayPermission(): Boolean { diff --git a/core/common/src/main/java/com/hmh/hamyeonham/common/qualifier/OAuth.kt b/core/common/src/main/java/com/hmh/hamyeonham/common/qualifier/OAuth.kt deleted file mode 100644 index 7d85fe04c..000000000 --- a/core/common/src/main/java/com/hmh/hamyeonham/common/qualifier/OAuth.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.hmh.hamyeonham.common.qualifier - -import javax.inject.Qualifier - -@Qualifier -@Retention(AnnotationRetention.BINARY) -annotation class Kakao diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/HMHRoomDatabase.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/HMHRoomDatabase.kt index 176471b3d..bf37865b0 100644 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/HMHRoomDatabase.kt +++ b/core/database/src/main/java/com/hmh/hamyeonham/core/database/HMHRoomDatabase.kt @@ -2,6 +2,8 @@ package com.hmh.hamyeonham.core.database import androidx.room.Database import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase import com.hmh.hamyeonham.core.database.dao.ChallengeDao import com.hmh.hamyeonham.core.database.dao.DeletedGoalsDao import com.hmh.hamyeonham.core.database.dao.LockDao @@ -26,9 +28,9 @@ import kotlinx.coroutines.launch DailyChallengeEntity::class, DeletedGoalWithUsageEntity::class, DeletedUsageEntity::class, - LockWithDateEntity::class + LockWithDateEntity::class, ], - version = 1, + version = 2, exportSchema = false ) abstract class HMHRoomDatabase : RoomDatabase() { @@ -47,6 +49,42 @@ abstract class HMHRoomDatabase : RoomDatabase() { deletedGoalsDao().deleteAll() lockDao().deleteAll() } + } + + companion object { + // 버전 1에서 버전 2로 마이그레이션 + val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + // UserAuth 테이블 생성 + database.execSQL( + """ + CREATE TABLE IF NOT EXISTS `user_auth` ( + `id` INTEGER NOT NULL, + `userId` INTEGER NOT NULL, + `providerType` TEXT NOT NULL, + `isLoggedIn` INTEGER NOT NULL, + `lastLoginTimestamp` INTEGER NOT NULL, + PRIMARY KEY(`id`) + ) + """ + ) + // UserProfile 테이블 생성 + database.execSQL( + """ + CREATE TABLE IF NOT EXISTS `user_profile` ( + `userId` INTEGER NOT NULL, + `nickname` TEXT, + `profileImageUrl` TEXT, + `email` TEXT, + `ageRange` TEXT, + `gender` TEXT, + `updatedAt` INTEGER NOT NULL, + PRIMARY KEY(`userId`) + ) + """ + ) + } + } } } diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DatabaseModule.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DatabaseModule.kt index a6c7e4006..6138d35d3 100644 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DatabaseModule.kt +++ b/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DatabaseModule.kt @@ -2,6 +2,7 @@ package com.hmh.hamyeonham.core.database.di import android.content.Context import androidx.room.Room +import com.hmh.hamyeonham.core.database.BuildConfig import com.hmh.hamyeonham.core.database.HMHRoomDatabase import dagger.Module import dagger.Provides @@ -17,9 +18,13 @@ object DatabaseModule { @Singleton fun providesHMHDatabase( @ApplicationContext context: Context, - ): HMHRoomDatabase = Room.databaseBuilder( - context, - HMHRoomDatabase::class.java, - "hmh-android-database", - ).build() + ): HMHRoomDatabase { + val builder = Room.databaseBuilder( + context, + HMHRoomDatabase::class.java, + "hmh-android-database" + ) + builder.addMigrations(HMHRoomDatabase.MIGRATION_1_2) + return builder.build() + } } diff --git a/core/designsystem/src/main/res/values/themes.xml b/core/designsystem/src/main/res/values/themes.xml index 513ac4064..de2756e27 100644 --- a/core/designsystem/src/main/res/values/themes.xml +++ b/core/designsystem/src/main/res/values/themes.xml @@ -1,4 +1,4 @@ - +