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 08f844047..20ba44059 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -73,7 +73,6 @@ 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.lock) @@ -81,7 +80,6 @@ dependencies { // 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) @@ -105,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 781f24b9a..641df6a12 100644 --- a/app/src/main/java/com/hmh/hamyeonham/StartActivity.kt +++ b/app/src/main/java/com/hmh/hamyeonham/StartActivity.kt @@ -6,7 +6,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen 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 @AndroidEntryPoint @@ -31,7 +31,7 @@ class StartActivity : AppCompatActivity() { } 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 84aa868a3..6d1090c8a 100644 --- a/app/src/main/java/com/hmh/hamyeonham/navigation/DefaultNavigationProvider.kt +++ b/app/src/main/java/com/hmh/hamyeonham/navigation/DefaultNavigationProvider.kt @@ -5,7 +5,6 @@ import android.content.Intent 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 @@ -24,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) } 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 3b0180bd1..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,7 +10,6 @@ interface NavigationProvider { fun toOnBoarding(): Intent fun toOnBoardingStory(): Intent - fun toLogin(): Intent fun toMain(): Intent fun toLock(packageName: String): Intent fun toStore(): 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 dd294e3c5..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 @@ -9,10 +9,6 @@ import com.hmh.hamyeonham.core.database.dao.DeletedGoalsDao import com.hmh.hamyeonham.core.database.dao.LockDao import com.hmh.hamyeonham.core.database.dao.UsageGoalsDao import com.hmh.hamyeonham.core.database.dao.UsageTotalGoalDao -import com.hmh.hamyeonham.core.database.dao.UserAuthDao -import com.hmh.hamyeonham.core.database.dao.UserProfileDao -import com.hmh.hamyeonham.core.database.entity.UserAuth -import com.hmh.hamyeonham.core.database.entity.UserProfile import com.hmh.hamyeonham.core.database.model.DailyChallengeEntity import com.hmh.hamyeonham.core.database.model.DeletedGoalWithUsageEntity import com.hmh.hamyeonham.core.database.model.DeletedUsageEntity @@ -33,8 +29,6 @@ import kotlinx.coroutines.launch DeletedGoalWithUsageEntity::class, DeletedUsageEntity::class, LockWithDateEntity::class, - UserAuth::class, - UserProfile::class ], version = 2, exportSchema = false @@ -45,8 +39,6 @@ abstract class HMHRoomDatabase : RoomDatabase() { abstract fun challengeDao(): ChallengeDao abstract fun deletedGoalsDao(): DeletedGoalsDao abstract fun lockDao(): LockDao - abstract fun userAuthDao(): UserAuthDao - abstract fun userProfileDao(): UserProfileDao @OptIn(DelicateCoroutinesApi::class) fun deleteAll() { @@ -56,11 +48,9 @@ abstract class HMHRoomDatabase : RoomDatabase() { challengeDao().deleteAll() deletedGoalsDao().deleteAll() lockDao().deleteAll() - userAuthDao().clearUserAuth() - userProfileDao().clearUserProfile() } } - + companion object { // 버전 1에서 버전 2로 마이그레이션 val MIGRATION_1_2 = object : Migration(1, 2) { @@ -78,7 +68,7 @@ abstract class HMHRoomDatabase : RoomDatabase() { ) """ ) - + // UserProfile 테이블 생성 database.execSQL( """ diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/dao/UserAuthDao.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/dao/UserAuthDao.kt deleted file mode 100644 index ea540f51e..000000000 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/dao/UserAuthDao.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.hmh.hamyeonham.core.database.dao - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import com.hmh.hamyeonham.core.database.entity.UserAuth -import kotlinx.coroutines.flow.Flow - -@Dao -interface UserAuthDao { - @Query("SELECT * FROM user_auth WHERE id = 1") - suspend fun getUserAuth(): UserAuth? - - @Query("SELECT * FROM user_auth WHERE id = 1") - fun observeUserAuth(): Flow - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertOrUpdateUserAuth(userAuth: UserAuth) - - @Query("UPDATE user_auth SET isLoggedIn = :isLoggedIn WHERE id = 1") - suspend fun updateLoginStatus(isLoggedIn: Boolean) - - @Query("DELETE FROM user_auth") - suspend fun clearUserAuth() -} \ No newline at end of file diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/dao/UserProfileDao.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/dao/UserProfileDao.kt deleted file mode 100644 index 24f4c3777..000000000 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/dao/UserProfileDao.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.hmh.hamyeonham.core.database.dao - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import com.hmh.hamyeonham.core.database.entity.UserProfile -import kotlinx.coroutines.flow.Flow - -@Dao -interface UserProfileDao { - @Query("SELECT * FROM user_profile WHERE userId = :userId") - suspend fun getUserProfile(userId: Long): UserProfile? - - @Query("SELECT * FROM user_profile WHERE userId = :userId") - fun observeUserProfile(userId: Long): Flow - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertOrUpdateUserProfile(userProfile: UserProfile) - - @Query("DELETE FROM user_profile") - suspend fun clearUserProfile() -} \ No newline at end of file diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DaoModule.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DaoModule.kt index 430855157..40bf7e28b 100644 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DaoModule.kt +++ b/core/database/src/main/java/com/hmh/hamyeonham/core/database/di/DaoModule.kt @@ -39,16 +39,4 @@ object DaoModule { fun providesLockDao( database: HMHRoomDatabase, ) = database.lockDao() - - @Provides - @Singleton - fun providesUserAuthDao( - database: HMHRoomDatabase, - ) = database.userAuthDao() - - @Provides - @Singleton - fun providesUserProfileDao( - database: HMHRoomDatabase, - ) = database.userProfileDao() } diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/entity/UserAuth.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/entity/UserAuth.kt deleted file mode 100644 index 12394e269..000000000 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/entity/UserAuth.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.hmh.hamyeonham.core.database.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey - -/** - * 사용자 인증 정보를 저장하는 엔티티 - * 토큰은 SDK에서 관리하므로 저장하지 않음 - */ -@Entity(tableName = "user_auth") -data class UserAuth( - @PrimaryKey - val id: Int = 1, // 항상 같은 ID 사용 (싱글 인스턴스) - val userId: Long = -1, - val providerType: String = "", // "KAKAO", "GOOGLE" 등 AuthProvider의 name - val isLoggedIn: Boolean = false, - val lastLoginTimestamp: Long = 0 -) \ No newline at end of file diff --git a/core/database/src/main/java/com/hmh/hamyeonham/core/database/entity/UserProfile.kt b/core/database/src/main/java/com/hmh/hamyeonham/core/database/entity/UserProfile.kt deleted file mode 100644 index 6771b3d93..000000000 --- a/core/database/src/main/java/com/hmh/hamyeonham/core/database/entity/UserProfile.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.hmh.hamyeonham.core.database.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey - -/** - * 사용자 프로필 정보를 저장하는 엔티티 - */ -@Entity(tableName = "user_profile") -data class UserProfile( - @PrimaryKey - val userId: Long, - val nickname: String? = null, - val profileImageUrl: String? = null, - val email: String? = null, - val ageRange: String? = null, - val gender: String? = null, - val updatedAt: Long = System.currentTimeMillis() -) \ No newline at end of file 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 @@ - +