Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
5c00e14
[chore] #72 권한 항목 문구 변경
Ojongseok Jan 29, 2026
953954d
[chore] #72 서비스 정보 관련 상수 정의
Ojongseok Jan 29, 2026
48c2eac
[feat] #72 서비스 정보 및 지원 섹션 선택 시 외부 브라우저로 URL 이동
Ojongseok Jan 29, 2026
42ef3b7
[chore] #72 기기 권한 내 저장소 권한 제거
Ojongseok Jan 29, 2026
33cf598
[chore] #72 pretendard 폰트 교체
Ojongseok Jan 29, 2026
bd11120
[chore] #72 알림 권한 사용 선언 추가
Ojongseok Jan 29, 2026
df9c52c
[feat] #72 CameraPermissionManager.kt 생성
Ojongseok Jan 29, 2026
7aa03fe
[feat] #72 권한 여부에 따른 권한 요청 로직 구성
Ojongseok Jan 29, 2026
b1076c7
[feat] #72 다이어로그 usePlatformDefaultWidth = false 디자인 시스템 내 공통 속성으로 변경
Ojongseok Jan 29, 2026
9afb135
[chore] #72 개인정보 처리방침 URL 변경
Ojongseok Jan 29, 2026
6dc6333
[build] #72 OssLicenses 라이브러리 의존성 설정
Ojongseok Jan 29, 2026
f3cb76e
[feat] #72 오픈소스 라이선스 Activity 이동 설정
Ojongseok Jan 29, 2026
6bda6fd
[feat] #72 appVersion 조회 로직 route로 이동
Ojongseok Jan 30, 2026
0a6fd4a
[fix] #72 권한 설정 로직 수정
Ojongseok Jan 30, 2026
7da4cf3
[fix] #72 권한 확인 로직 수정
Ojongseok Jan 30, 2026
e3b330d
[feat] #71 사용자 정보 조회 API 연동
Ojongseok Jan 30, 2026
03a1782
[design] #71 기본 프로필 이미지 리소스 추가
Ojongseok Jan 30, 2026
57976ef
[chore] #71 ApiService -> AuthService 클래스명 변경
Ojongseok Jan 30, 2026
4d60422
[feat] #71 마이페이지 메인화면 API 연결
Ojongseok Jan 30, 2026
f2665ce
[feat] #71 사용자 정보 갱신 API 로직 작성
Ojongseok Jan 30, 2026
a9a3a25
[chore] #71 불필요한 파일 제거
Ojongseok Jan 30, 2026
7645a92
[chore] #71 UseCase 내 generateFileName() 메소드 ContentTypeUtil로 분리
Ojongseok Jan 30, 2026
f377d0b
[feat] #71 RootNavKey 전환 이후 이전 백스택, topLevelStack 제거하는 로직 추가
Ojongseok Jan 30, 2026
6cacde5
[chore] #71 카카오 로그인 API URL 변경 /KAKAO
Ojongseok Jan 30, 2026
e4cd13b
[feat] #71 MainScreen 이동 시점 변경
Ojongseok Jan 30, 2026
ef698f2
[chore] #71 불필요한 로그 제거
Ojongseok Jan 30, 2026
24b08d6
[feat] #71 회원탈퇴 및 로그아웃 로직 구현
Ojongseok Jan 30, 2026
2f6adf8
[feat] #71 로그인 상태 확인 로직 수정
Ojongseok Jan 30, 2026
929fff8
[feat] #71 Ktor BearerToken 캐싱 제거 구문 추가
Ojongseok Jan 30, 2026
12feac7
[chore] #71 불필요한 DataStore 키 제거
Ojongseok Jan 30, 2026
b2e26e3
[feat] #71 기본 프로필 설정 로직 구성
Ojongseok Jan 30, 2026
2324373
[chore] #71 카카오 로그인 API URL 변경
Ojongseok Jan 31, 2026
29d6b79
[chore] #71 RootNavigationState NavigationModule 내 @Provides 정의
Ojongseok Jan 31, 2026
3f942a1
[feat] #71 닉네임 변경 API 연결
Ojongseok Jan 31, 2026
d5e5081
[feat] #71 프로필 이미지 변경 API 인터페이스 작성
Ojongseok Jan 31, 2026
e8cad09
[feat] #72 ProfileScreen 일부 컴포넌트 분리
Ojongseok Jan 31, 2026
76ca6f3
[feat] #72 프로필 이미지 업로드 UseCase 정의
Ojongseok Jan 31, 2026
c449f8d
[fix] #71 RefreshToken 만료 후 캐싱된 AccessToken 조회하는 현상 수정
Ojongseok Jan 31, 2026
1cdab13
[chore] #71 logout(), signOut() 메소드 블럭 수정
Ojongseok Jan 31, 2026
531b1d0
[chore] #71 User -> UserInfo로 data class명 변경
Ojongseok Feb 1, 2026
b6f8923
Merge branch 'feat/#72-service-info-permission' of https://github.com…
Ojongseok Feb 1, 2026
7b3a87f
[chore] #71 Pull #72
Ojongseok Feb 1, 2026
f752830
[feat] #71 프로필 편집 상태에 따른 화면 전환 및 API 연결
Ojongseok Feb 1, 2026
58c712c
[feat] #71 계정 설정 / 프로필 편집 화면 분리
Ojongseok Feb 1, 2026
47b42ff
[feat] #71 프로필 이미지 설정 로직 수정
Ojongseok Feb 1, 2026
a5f7758
[feat] #71 AccessToken, RefreshToken 저장 여부 확인 로직 수정
Ojongseok Feb 1, 2026
19c25ac
[feat] #71 AccessToken, RefreshToken 저장 여부 확인 로직 수정
Ojongseok Feb 1, 2026
822e95e
[feat] #71 프로필 이미지 컴포넌트 분리
Ojongseok Feb 1, 2026
a577940
[chore] #71 SelectedProfileImage 경로 변경
Ojongseok Feb 1, 2026
8103599
[feat] #71 HttpClient 내 토큰 캐시를 제거하기 위해 AuthCacheManager 생성
Ojongseok Feb 1, 2026
987d99f
[build] #71 OssLicenses 플러그인 버전 상향
Ojongseok Feb 2, 2026
7ccc115
[chore] #71 OssLicenses EdgeToEdge 커스텀 테마 적용
Ojongseok Feb 2, 2026
2a7cf3f
Merge branch 'develop' of https://github.com/YAPP-Github/27th-App-Tea…
Ojongseok Feb 2, 2026
d09ac7d
[fix] #71 업로드 티켓 발급 요청 repository 메소드 변경
Ojongseok Feb 2, 2026
b96f6e3
[fix] #71 프로필 이미지 변경 시 Intent로 전달하는 부분 ByteArray -> Uri로 변경
Ojongseok Feb 2, 2026
5d81aab
[docs] #71 외부 라이브러리에 대한 난독화 예외 구문 추가
Ojongseok Feb 2, 2026
9e27eb4
[chore] #71 릴리즈 모드 빌드 시 signingConfig 및 키 설정
Ojongseok Feb 2, 2026
c863271
[feat] #71 'Neki에 문의하기' 외부링크 연결 url 변경
Ojongseok Feb 4, 2026
22c31b7
Merge branch 'develop' of https://github.com/YAPP-Github/27th-App-Tea…
Ojongseok Feb 4, 2026
74b8418
[fix] #71 닉네임 변경 시 글자수 제한 12자로 변경
Ojongseok Feb 4, 2026
b84fa8c
[chore] #71 Mypage 모듈 내 컴포넌트 internal 키워드 추가
Ojongseok Feb 4, 2026
38112ba
[fix] #71 uri 형변환 null체크 추가
Ojongseok Feb 4, 2026
10b1a12
[fix] #71 프로필 이미지 변경 후 이미지 캐싱 로직 추가
Ojongseok Feb 4, 2026
6bf56e0
[build] #71 detekt 룰 적용
Ojongseok Feb 4, 2026
425fcd5
[fix] #79 알림 권한 확인 로직 버전별 분기 추가
Ojongseok Feb 5, 2026
63d97d2
[fix] #79 AuthService @Inject 어노테이션 추가 및 NetworkModule 선언부 제거
Ojongseok Feb 5, 2026
3c969f4
[fix] #79 UploadMultiplePhotoUseCase 내부 generateFileName() 메소드 제거
Ojongseok Feb 5, 2026
4defc55
[fix] #79 회원탈퇴 관련 네이밍 변경(signout -> withdraw)
Ojongseok Feb 5, 2026
e83a514
[fix] #79 앱버전 조회 시 Intent 통해 조회하도록 변경
Ojongseok Feb 5, 2026
1e664d8
[fix] #79 Contract의 init을 의미하는 Intent 및 함수명 통일
Ojongseok Feb 5, 2026
3101431
[build] #79 feature:mypage:impl 카카오 의존성 추가
Ojongseok Feb 6, 2026
da1f47f
[fix] #79 카카오 계정 관리 클래스 분리 및 인증 로직 수정
Ojongseok Feb 6, 2026
53e3f99
[chore] #79 MypageViewModel의 fetchInitialData() 실패 시 로그 추가
Ojongseok Feb 6, 2026
d0f2a1e
[fix] #79 프로필 이미지 변경 후 이미지 로드되기 전 깜빡이며 뒤로가는 현상 수정
Ojongseok Feb 6, 2026
d07c84d
[fix] #79 이미지 프리로딩 Effect 네이밍 수정
Ojongseok Feb 6, 2026
602bb8d
[fix] #79 프로필 이미지/닉네임 동시 변경 시 뒤로가기 로직 수정
Ojongseok Feb 6, 2026
b6062cb
캐싱된 JWT 토큰 제거 시점 수정
Ojongseok Feb 6, 2026
4d594ae
[chore] #79 HttpClient 순환참조 구조 수정
Ojongseok Feb 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import kotlin.apply
plugins {
alias(libs.plugins.neki.android.application)
alias(libs.plugins.neki.android.application.compose)
alias(libs.plugins.oss.licenses)
}

val localPropertiesFile = project.rootProject.file("local.properties")
Expand All @@ -28,6 +29,26 @@ android {
properties["KAKAO_NATIVE_APP_KEY"].toString()
)
}

signingConfigs {
create("release") {
storeFile = rootProject.file("neki_key_store.jks")
storePassword = properties["STORE_PASSWORD"].toString()
keyAlias = properties["KEY_ALIAS"].toString()
keyPassword = properties["KEY_PASSWORD"].toString()
}
}
Comment thread
Ojongseok marked this conversation as resolved.
buildTypes {
getByName("release") {
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
}
}

}

dependencies {
Expand Down
202 changes: 188 additions & 14 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,191 @@
# 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
# Keep line number information for debugging stack traces.
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile

# ========================
# Project Classes
# ========================
-keep class com.neki.android.** { *; }
-keepclassmembers class com.neki.android.** { *; }

# ========================
# Kotlin
# ========================
-keep class kotlin.Metadata { *; }
-keepattributes RuntimeVisibleAnnotations
-keepattributes *Annotation*

# Kotlin Coroutines
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembers class kotlinx.coroutines.** {
volatile <fields>;
}
-keepclassmembernames class kotlinx.** {
volatile <fields>;
}

# ========================
# Ktor
# ========================
-keep class io.ktor.** { *; }
-keepclassmembers class io.ktor.** { *; }
-dontwarn io.ktor.**

# ========================
# kotlinx.serialization
# ========================
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt

-keepclassmembers @kotlinx.serialization.Serializable class ** {
*** Companion;
}
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1>$Companion {
kotlinx.serialization.KSerializer serializer(...);
}
-if @kotlinx.serialization.Serializable class ** {
static **$* *;
}
-keepclassmembers class <2>$<3> {
kotlinx.serialization.KSerializer serializer(...);
}
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
-keepclassmembers class * {
@kotlinx.serialization.SerialName <fields>;
}
-keep,includedescriptorclasses class com.neki.android.**$$serializer { *; }
-keepclassmembers class com.neki.android.** {
*** Companion;
}

# ========================
# Kakao SDK
# ========================
-keep class com.kakao.sdk.** { *; }
-keepclassmembers class com.kakao.sdk.** { *; }
-dontwarn com.kakao.sdk.**

# Kakao SDK enums (TokenNotFound 등)
-keepclassmembers enum com.kakao.sdk.** {
public static **[] values();
public static ** valueOf(java.lang.String);
<fields>;
}

# ========================
# Hilt / Dagger
# ========================
-keep class dagger.** { *; }
-keep class javax.inject.** { *; }
-keep class * extends dagger.hilt.android.internal.managers.ComponentSupplier { *; }
-keep class * extends dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper { *; }
-keepclassmembers class * {
@dagger.hilt.* <fields>;
@dagger.hilt.* <methods>;
@javax.inject.* <fields>;
@javax.inject.* <methods>;
}
-dontwarn dagger.internal.codegen.**
-dontwarn dagger.hilt.internal.**

# ========================
# Android / Jetpack
# ========================
# Lifecycle
-keep class androidx.lifecycle.** { *; }
-keepclassmembers class * implements androidx.lifecycle.LifecycleObserver {
<init>(...);
}

# Navigation
-keep class androidx.navigation.** { *; }

# Compose
-keep class androidx.compose.** { *; }
-dontwarn androidx.compose.**

# DataStore
-keep class androidx.datastore.** { *; }
-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite {
<fields>;
}

# Paging
-keep class androidx.paging.** { *; }

# ========================
# Enums (General)
# ========================
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
<fields>;
}

# ========================
# Timber
# ========================
-dontwarn org.jetbrains.annotations.**

# ========================
# OSS Licenses
# ========================
-keep class com.google.android.gms.oss.licenses.** { *; }

# ========================
# Coil
# ========================
-keep class coil3.** { *; }
-dontwarn coil3.**

# ========================
# Naver Maps
# ========================
-keep class com.naver.maps.** { *; }
-dontwarn com.naver.maps.**

# ========================
# OkHttp (used by Coil)
# ========================
-dontwarn okhttp3.**
-dontwarn okio.**
-keep class okhttp3.** { *; }
-keep class okio.** { *; }

# ========================
# ML Kit Barcode
# ========================
-keep class com.google.mlkit.** { *; }
-dontwarn com.google.mlkit.**

# ========================
# Play Services
# ========================
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**

# ========================
# CameraX
# ========================
-keep class androidx.camera.** { *; }
-dontwarn androidx.camera.**

# ========================
# Missing class warnings suppression
# ========================
-dontwarn java.lang.invoke.StringConcatFactory
-dontwarn org.slf4j.**
-dontwarn org.bouncycastle.**
-dontwarn org.conscrypt.**
-dontwarn org.openjsse.**
8 changes: 7 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<uses-feature android:name="android.hardware.camera" />

Expand Down Expand Up @@ -40,7 +41,12 @@
</intent-filter>
</activity>


<activity
android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity"
android:theme="@style/OssLicenses.Theme.OptOutEdgeToEdgeEnforcement" />
<activity
android:name="com.google.android.gms.oss.licenses.OssLicensesActivity"
android:theme="@style/OssLicenses.Theme.OptOutEdgeToEdgeEnforcement" />
</application>

<queries>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.neki.android.app.navigation.di

import com.neki.android.app.navigation.keys.START_NAV_KEY
import com.neki.android.app.navigation.keys.START_ROOT_NAV_KEY
import com.neki.android.app.navigation.keys.TOP_LEVEL_NAV_KEYS
import com.neki.android.core.navigation.NavigationState
import com.neki.android.core.navigation.root.RootNavigationState
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -21,4 +23,12 @@ internal object NavigationModule {
topLevelKeys = TOP_LEVEL_NAV_KEYS.toSet(),
)
}

@Provides
@ActivityRetainedScoped
fun providesRootNavigationState(): RootNavigationState {
return RootNavigationState(
startKey = START_ROOT_NAV_KEY,
)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.neki.android.app.navigation.keys

import com.neki.android.app.navigation.TopLevelNavItem
import com.neki.android.core.navigation.root.RootNavKey
import com.neki.android.feature.archive.api.ArchiveNavKey

internal val START_ROOT_NAV_KEY = RootNavKey.Login
internal val START_NAV_KEY = ArchiveNavKey.Archive
internal val TOP_LEVEL_NAV_KEYS = TopLevelNavItem.entries.map { it.navKey }
6 changes: 5 additions & 1 deletion app/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">

<style name="Theme.Neki" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>

<style name="OssLicenses.Theme.OptOutEdgeToEdgeEnforcement" parent="Theme.AppCompat">
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,6 @@ internal fun Project.configureAndroid(
jvmTarget = BuildConst.JDK_VERSION.toString()
}

buildTypes {
getByName("release") {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android.txt"),
"proguard-rules.pro",
)
}
}

dependencies {
add("detektPlugins", libs.findLibrary("detekt.formatting").get())
}
Expand Down
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ plugins {
alias(libs.plugins.ksp) apply false
alias(libs.plugins.hilt) apply false
alias(libs.plugins.detekt) apply false
alias(libs.plugins.oss.licenses) apply false
}

subprojects {
Expand All @@ -24,4 +25,4 @@ subprojects {
toolVersion = rootProject.libs.versions.detekt.get()
config.setFrom(files("$rootDir/detekt-config.yml"))
}
}
}
2 changes: 1 addition & 1 deletion core/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ android {

dependencies {
api(libs.timber)
api(libs.kakao.user)
implementation(libs.androidx.security.crypto)
implementation(libs.androidx.core.ktx)

}
Loading