Skip to content
Merged
Show file tree
Hide file tree
Changes from 123 commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
0afb31a
chore: Rename and restructure Android CI workflow
parkji1on Sep 29, 2025
d398c53
fix: Fix indentation and formatting in android-ci.yml
parkji1on Sep 29, 2025
07fccec
chore: ci 속도 향상
parkji1on Sep 29, 2025
1183910
fix: 파일 경로 오류로 인한 삭제
parkji1on Sep 29, 2025
4406c0c
chore: apply commitlint + husky setup
DonjJin-github Sep 30, 2025
80e4ee7
#0 chore(chore): apply commitlint + husky setup
DonjJin-github Sep 30, 2025
cee7c8d
chore(setting): 직렬화 라이브러리 추가
parkji1on Oct 19, 2025
d6e70c9
chore(setting): 민감한 정보 암호화 라이브러리 추가
parkji1on Oct 19, 2025
5f001df
chore(ignore): 비밀키 추가
parkji1on Oct 19, 2025
2afbe7d
chore(setting): 비밀키 설정
parkji1on Oct 19, 2025
7bae13e
feat(network): OkHttp, Retrofit 설정 파일 생성
parkji1on Oct 19, 2025
3ff7e40
feat(util): 직렬와 라이브러리 사용 예시 및 날짜 직렬화 생성
parkji1on Oct 19, 2025
e4a0247
feat(sd): DataSource interface 생성
parkji1on Oct 19, 2025
cf3958c
feat(dto): Sd DataSource에 대한 DTO 생성
parkji1on Oct 19, 2025
b410851
feat(sd): SdDataSource 구현체 생성 및 APIService 생성
parkji1on Oct 19, 2025
4f0d8d3
feat(di): ApiService Hilt 등록
parkji1on Oct 19, 2025
12c4674
feat(model): 견적과 관련된 Data Class 생성
parkji1on Oct 19, 2025
22bc707
feat(repo): Repository interface 예시 생성
parkji1on Oct 19, 2025
7951c1a
feat(sd): Repository 구현
parkji1on Oct 19, 2025
9f20e18
feat(di): Sd DataSource, Repository 구현체 연결
parkji1on Oct 19, 2025
78743a6
feat(util): Quotation과 관련된 매퍼 생성
parkji1on Oct 19, 2025
7a71574
chore(setting): material icons 의존성 추가
parkji1on Oct 20, 2025
7cc6c88
style(setting): 파일 위치 변경 및 포멧팅
parkji1on Oct 20, 2025
6dbc5b5
feat(dto): ApiService의 request&response dto 생성
parkji1on Oct 20, 2025
597cb2d
feat(network): 공통 헤더 Interceptor 추가
parkji1on Oct 20, 2025
89fb225
feat(model): Model 변경
parkji1on Oct 20, 2025
021114e
feat(ui): 공통 BottomNavBar 생성
parkji1on Oct 20, 2025
3223fc2
feat(ui): 고객사 기초 화면 생성
parkji1on Oct 20, 2025
b54cfd8
feat(ui): 공급사 기초 화면 생성
parkji1on Oct 20, 2025
d71b408
feat(ui): 로그인 화면 및 메인 화면 생성
parkji1on Oct 20, 2025
1beff31
feat(ui): UI 화면 상태 정의
parkji1on Oct 20, 2025
8bedd4f
feat(permission): Permission 권한 요청 로직 생성
parkji1on Oct 21, 2025
f22b560
refact(permission): LocalContext, LocalActivity -> LocalView로 변경
parkji1on Oct 21, 2025
2c2a2f4
chore(build): Firebase 관련 의존성 추가 (#2)
parkji1on Nov 1, 2025
28e985b
chore(build): 의존성 추가 (#2)
parkji1on Nov 2, 2025
332fdb9
chore(build): Firebase 관련 Service Component 추가 (#2)
parkji1on Nov 2, 2025
210aa29
feat(model): 기기 정보 객체 추가 (#2)
parkji1on Nov 2, 2025
7dba8f2
feat(data): 기기 정보에 대한 DataSource 추가 (#2)
parkji1on Nov 2, 2025
3ba3b0e
feat(domain): 기기 정보에 대한 Repository 추가 및 설정 (#2)
parkji1on Nov 2, 2025
538bfd9
feat(di): Firebase 객체 관리 모듈 생성 (#2)
parkji1on Nov 2, 2025
6603369
feat(data): Firebaes관련 DataSource 생성 (#2)
parkji1on Nov 2, 2025
e33d595
feat(domain): FCM 관련 Repository 객체 생성 및 모듈 관리 (#2)
parkji1on Nov 2, 2025
21cf9ef
feat(util): Timber 객체 초기화 (#2)
parkji1on Nov 2, 2025
39f8d89
feat(alarm): Notification Channel 생성 (#2)
parkji1on Nov 2, 2025
354d712
chore(secret): baseURL 변경
parkji1on Nov 2, 2025
daf4b30
feat(dto): 공통 Response Dto 생성
parkji1on Nov 2, 2025
ddfa8e2
feat(di): NetworkModule 및 Retrofit 공통화 처리
parkji1on Nov 2, 2025
91bd47a
rename(): package 변경
parkji1on Nov 3, 2025
59f98a6
feat(git): package 정보를 위한 gitkeep
parkji1on Nov 3, 2025
ee50f46
remove: 불필요한 파일 삭제
parkji1on Nov 3, 2025
05ef55c
feat(domain): 알림을 위한 enum 객체 생성
parkji1on Nov 3, 2025
ac2220e
feat(data): HTTP API 요청 부분 생성
parkji1on Nov 3, 2025
28dac93
feat(data): SD 모듈 관련 DataSource - Repository 흐름 생성
parkji1on Nov 3, 2025
b9cf4ce
feat(data): FcmApi Request, Response 객체 수정
parkji1on Nov 3, 2025
a1855ca
feat(data): FCM API, Request, Response 객체 수정
parkji1on Nov 3, 2025
1addcc0
remove(api): 중복된 파일 삭제
parkji1on Nov 3, 2025
4c0426e
rename: 파일 이동 및 불필요한 코드 삭제
parkji1on Nov 3, 2025
ec45751
chore: 커밋 메시지 검증 도구 설정 추가 (#3)
Gumraze-git Nov 3, 2025
f22570b
feat(oauth): 로그인 및 oauth 리다이렉트 화면 추가 (#3)
Gumraze-git Nov 3, 2025
48f7707
feat(auth): 토큰 저장 인터페이스 구현 추가 (#3)
Gumraze-git Nov 3, 2025
ee175ff
feat(auth): 앱 모듈 및 세션 관리 로직 추가 (#4)
Gumraze-git Nov 3, 2025
abd2cfa
feat(ui): 기본 네비게이션 구성 및 홈/로그인 화면 추가 (#3)
Gumraze-git Nov 3, 2025
ff10b0e
feat(ui): 로그인 및 홈 화면에 로고 이미지 추가 (#3)
Gumraze-git Nov 3, 2025
4146e9f
feat(auth): oauth2 인증 관련 유틸 클래스 추가 (#3)
Gumraze-git Nov 3, 2025
7958e70
feat: OAuth2 로그인 웹뷰 화면 구현 (#3)
Gumraze-git Nov 3, 2025
9d1d6bd
feat: 토큰 교환 기능 추가 (#3)
Gumraze-git Nov 3, 2025
315adca
feat: 사용자 정보 조회 기능 추가 (#3)
Gumraze-git Nov 3, 2025
fe69030
feat: 홈 화면에 사용자 정보 표시 기능 추가 (#3)
Gumraze-git Nov 3, 2025
3700c9f
feat(domain): 사용자 정보 관련한 enum class 생성
parkji1on Nov 3, 2025
c90388d
feat(domain): 견적서 관련 enum class 생생
parkji1on Nov 3, 2025
80fa474
feat: oauth 인증 방식을 webview에서 cct로 변경 (#3)
Gumraze-git Nov 4, 2025
7fb5dda
chore(login): 로그인 클릭 시 로그 추가 (#3)
Gumraze-git Nov 4, 2025
9a7d20f
feat(model): 발주서에 관한 domain model 생성
parkji1on Nov 4, 2025
bf956dd
feat(model): 주문서에 대한 domain model 생성
parkji1on Nov 4, 2025
a5ccfec
chore(cct): cct 수행 로깅 추가 (#3)
Gumraze-git Nov 4, 2025
8b9526a
feat(model): 알림에 대한 domain model 정의
parkji1on Nov 4, 2025
3233aad
feat(model): 고객사 상태 타입 정의
parkji1on Nov 4, 2025
1440c57
feat(http): Retrofit에 필요한 API Service 정의
parkji1on Nov 4, 2025
b2266d2
feat: 인증 관련 엔드포인트 상수 추가 (#3)
Gumraze-git Nov 4, 2025
595951d
feat: 로그아웃 api 호출 기능 추가 (#3)
Gumraze-git Nov 4, 2025
029ac96
chore: 인증 엔드포인트를 프로덕션으로 고정 (33)
Gumraze-git Nov 4, 2025
bfa47a1
refac(endpoint): auth endpoint에서 정의된 엔드포인트 상수로 호출하도록 변경 (#3)
Gumraze-git Nov 4, 2025
9ceef16
feat(model): 공급사 관련 domain-model 정의
parkji1on Nov 4, 2025
4d6341c
remove: 불필요한 코드 제거
parkji1on Nov 4, 2025
e0ce650
refac(structure): 코드 구조 리팩터링 (#3)
Gumraze-git Nov 4, 2025
4acad91
refac: 로그인 성공 시 홈 화면으로 자동 리디렉션 (#3)
Gumraze-git Nov 4, 2025
5c7d4dd
chore: 불필요한 주석 제거 (#3)
Gumraze-git Nov 4, 2025
36b9085
refac: 사용자 정보 api 엔드포인트 수정 (#3)
Gumraze-git Nov 4, 2025
8ad47f4
feat: 보안 토큰 저장 기능 추가 (#3)
Gumraze-git Nov 4, 2025
9ce3f0a
refac(userinfo): api 응답 구조 변경에 따른 사용자 정보 파싱 로직 수정 (#3)
Gumraze-git Nov 4, 2025
1b021a5
feat(auth): 401 인증 만료 처리 로직 추가 (#3)
Gumraze-git Nov 4, 2025
33bac90
refac(auth): 메서드 및 네비게이션 관련 네이밍 수정 (#3)
Gumraze-git Nov 4, 2025
3853adc
feat: 메인 화면 및 하단 네비게이션 ui 추가 (#3)
Gumraze-git Nov 4, 2025
dbc3979
feat(profile): 프로필 화면 및 뷰모델 추가 (#3)
Gumraze-git Nov 4, 2025
3107d77
refac(error): 인가 에러를 공통 오류 패키지로 이동 및 구조 개선 (#3)
Gumraze-git Nov 4, 2025
a5ed955
feat(login): 로그인 화면 ui 수정 및 로딩 상태 추가 (#3)
Gumraze-git Nov 4, 2025
4912c15
Merge pull request #4 from AutoEver-4Ever/feat/#3-oAuthLoginFlow
parkji1on Nov 4, 2025
75bb997
Merge branch 'dev' into develop
parkji1on Nov 4, 2025
67abb3c
Merge pull request #5 from AutoEver-4Ever/develop
parkji1on Nov 4, 2025
10564fd
rename(data): QuotationListItem 이동
parkji1on Nov 4, 2025
8e5f43b
feat(user): 사용자 정보에 관한 data-domain 흐름
parkji1on Nov 4, 2025
2f9c753
feat(sd): 영업 관리에 관한 data-domain 흐름
parkji1on Nov 4, 2025
b697140
feat(mm): 재고 관리 관련 domain data 흐름
parkji1on Nov 4, 2025
543db22
feat(fcm): 재무 관리 관련 domain data 흐름
parkji1on Nov 4, 2025
4b166f6
feat(alarm): 알림 관리 관련 domain data 흐름
parkji1on Nov 4, 2025
0485137
feat(di): Local/Remote DataSource, Repository 연결 및 Api 객체 생성
parkji1on Nov 4, 2025
502f52f
feat(data): LocalDataSource 종류 추가
parkji1on Nov 4, 2025
7935028
feat(user): JWT를 통한 사용자 정보 요청
parkji1on Nov 4, 2025
7e80f26
fix: 수정
parkji1on Nov 4, 2025
64b00ad
feat(ui): UI 변동 사항 및 용어 변경
parkji1on Nov 4, 2025
4e73be6
fix(domain): 견적서 리스트 항목 id 타입 변경
parkji1on Nov 4, 2025
7669921
refac(di): FCM 관련 DI 항목 수정
parkji1on Nov 4, 2025
ce03a3b
fix(build): 빌드 오류 해결
parkji1on Nov 4, 2025
dc4ffa8
fix(data): baseUrl must end in / 에 대한 오류 해결
parkji1on Nov 4, 2025
9af34cf
feat(di): context에 대한 Annotation 추가
parkji1on Nov 4, 2025
c370724
chore(network): 특정 ip에 대한 http 통신 허용
parkji1on Nov 4, 2025
e30c5eb
feat(dto): DTO 기본값도 무조건 파싱하게 변경
parkji1on Nov 4, 2025
fc0fce0
chore(build): 의존성 추가
parkji1on Nov 5, 2025
b741678
feat(exception): 전역에서 사용가능한 Exception 정의
parkji1on Nov 5, 2025
66df475
feat(exception): 예외 발생시 보여줄 UI 정의
parkji1on Nov 5, 2025
b6995b7
rename(): 용어 재정의
parkji1on Nov 5, 2025
13e6c18
feat(alarm): FCM 알림 발생시 Notification 발생
parkji1on Nov 5, 2025
2d11599
Merge branch 'dev' into chore/#2-setting
parkji1on Nov 5, 2025
de52cd7
fix(): ktlint 수정
parkji1on Nov 5, 2025
96ea92c
fix(ui): LoginScreen 프로퍼티 수정
parkji1on Nov 5, 2025
01a1652
fix(): 오타 수정
parkji1on Nov 5, 2025
c5c9cef
fix(): ktlint 수정용
parkji1on Nov 5, 2025
f77cc2c
feat(): ktlint 수정용
parkji1on Nov 5, 2025
1289f85
fix(): ktlint 수정용
parkji1on Nov 5, 2025
aea33df
refac(): ktlint 수정
parkji1on Nov 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/android-ci.yml → .github/workflows/android-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ on:
push:
branches: [ "main", "develop" ] # 브랜치에 push될 때
pull_request:
branches: [ "main", "develop" ] # 브랜치로 pull request가 생성될 때
  workflow_dispatch: # Github Actions 수동으로 실행될 때
branches: [ "main", "develop" ] # 브랜치로 pull request가 생성될 때
workflow_dispatch: # Github Actions 수동으로 실행될 때

# 실행될 작업(Job) 목록
jobs:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ build/

# Local configuration file (sdk path, etc)
local.properties
secrets.properties

# Log/OS Files
*.log
Expand Down Expand Up @@ -417,3 +418,4 @@ obj/
!/gradle/wrapper/gradle-wrapper.jar

# End of https://www.toptal.com/developers/gitignore/api/macos,windows,android,androidstudio,kotlin,java,gradle,maven,intellij,git
/node_modules/
1 change: 1 addition & 0 deletions .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
npx --no -- commitlint --edit $1 --format ./scripts/commitlint-formatter-korean.js
3 changes: 3 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

39 changes: 37 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ plugins {
alias(libs.plugins.ksp)
alias(libs.plugins.hilt.android)
alias(libs.plugins.ktlint)
alias(libs.plugins.secrets.gradle.plugin)
alias(libs.plugins.google.services)
alias(libs.plugins.firebase.crashlytics)
alias(libs.plugins.firebase.perf)
}

android {
Expand All @@ -24,6 +28,11 @@ android {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

buildFeatures {
buildConfig = true
compose = true
}

buildTypes {
release {
isMinifyEnabled = false
Expand All @@ -37,8 +46,17 @@ android {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures {
compose = true

secrets {
// 기본 'local.properties' 대신 다른 파일 이름 지정
propertiesFileName = "secrets.properties"

// CI/CD 환경을 위한 기본값 파일 지정 (버전 관리에 포함 가능)
defaultPropertiesFileName = "secrets.defaults.properties"

// 특정 키를 무시하도록 정규식 추가 (기본적으로 "sdk.dir"은 무시됨)
ignoreList.add("keyToIgnore")
ignoreList.add("ignore*")
}
}

Expand All @@ -53,13 +71,18 @@ dependencies {
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.lifecycle.viewmodel.ktx) // ViewModel
implementation(libs.androidx.navigation.compose) // Navigation
implementation(libs.androidx.datastore.preferences) // DataStore Preferences
implementation(libs.androidx.room.runtime) // Room Runtime
ksp(libs.androidx.room.compiler) // Room Compiler
implementation(libs.androidx.room.ktx) // Room KTX

// Jetpack Compose dependencies
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.material.icons.extended) // TODO 배포시 해당 의존성 삭제하고 필요한 아이콘만 개별 추가
// Debug dependencies
debugImplementation(libs.androidx.compose.ui.tooling)
debugImplementation(libs.androidx.compose.ui.test.manifest)
Expand All @@ -69,11 +92,19 @@ dependencies {
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
// Firebase dependencies
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.perf)
implementation(libs.firebase.messaging)
implementation(libs.firebase.config)

// Retrofit dependencies
implementation(libs.retrofit)
implementation(libs.logging.interceptor)
implementation(libs.retrofit2.kotlinx.serialization.converter)
implementation(libs.kotlinx.serialization.json)
// Coroutines dependencies
implementation(libs.kotlinx.coroutines.core)
implementation(libs.kotlinx.coroutines.android)
Expand All @@ -86,6 +117,10 @@ dependencies {
implementation(libs.androidx.hilt.navigation.compose)
// Timber dependency for logging
implementation(libs.timber)
// Browser (Chrome Custom Tabs)
implementation(libs.androidx.browser)
// Security Crypto for EncryptedSharedPreferences
implementation(libs.androidx.security.crypto)
// // DataStore dependencies
// implementation("androidx.datastore:datastore-preferences:1.0.0")
// // Room dependencies
Expand Down
41 changes: 37 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,17 @@
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />-->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />-->

<application
android:name=".EverpApp"
android:name=".EverpApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/Theme.Everp">
<activity
android:name=".MainActivity"
Expand All @@ -38,6 +37,40 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!-- 크래시 발생 시 표시되는 에러 화면 -->
<activity
android:name=".ui.error.ErrorActivity"
android:exported="false"
android:launchMode="singleTask"
android:excludeFromRecents="true"
android:theme="@style/Theme.Everp" />

<service
android:name=".service.fcm.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />

<!-- OAuth2 Redirect 수신 (everp-aos://callback) -->
<activity
android:name="com.autoever.everp.ui.redirect.RedirectReceiverActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/Theme.Transparent">
<intent-filter android:label="oauth2-redirect">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="everp-aos" android:host="callback" />
</intent-filter>
</activity>
</application>

</manifest>
</manifest>
11 changes: 0 additions & 11 deletions app/src/main/java/com/autoever/everp/EverpApp.kt

This file was deleted.

60 changes: 60 additions & 0 deletions app/src/main/java/com/autoever/everp/EverpApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.autoever.everp

import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
import com.autoever.everp.common.exception.GlobalExceptionHandler
import dagger.hilt.android.HiltAndroidApp
import com.autoever.everp.service.fcm.MyFirebaseMessagingService
import timber.log.Timber
import javax.inject.Inject

@HiltAndroidApp
class EverpApplication : Application() {

@Inject
lateinit var globalExceptionHandler: GlobalExceptionHandler

override fun onCreate() {
super.onCreate()
initTimber()
initGlobalExceptionHandler()
createNotificationChannels()
}

/**
* 전역 예외 처리기 초기화
*
* 가장 먼저 초기화하여 앱 실행 중 발생하는 모든 예외를 잡을 수 있도록 함
*/
private fun initGlobalExceptionHandler() {
try {
globalExceptionHandler.initialize()
Timber.i("Global exception handler initialized")
} catch (e: Exception) {
// 초기화 실패 시에도 앱은 계속 실행
Timber.e(e, "Failed to initialize global exception handler")
}
}

private fun initTimber() {
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
}

private fun createNotificationChannels() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
MyFirebaseMessagingService.DEFAULT_CHANNEL_ID,
"일반 알림",
NotificationManager.IMPORTANCE_HIGH,
).apply {
description = "EvERP 기본 알림 채널"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
}
}
57 changes: 29 additions & 28 deletions app/src/main/java/com/autoever/everp/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,50 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.lifecycle.lifecycleScope
import com.autoever.everp.domain.repository.PushNotificationRepository
import com.autoever.everp.ui.MainScreen
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.autoever.everp.ui.theme.EverpTheme
import com.autoever.everp.ui.navigation.AppNavGraph
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

@Inject
lateinit var notificationRepository: PushNotificationRepository

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
getFcmToken()
setContent {
EverpTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding),
)
}
MainScreen()
// Surface(modifier = Modifier.fillMaxSize()) {
// AppNavGraph()
// }
}
}
}
}

@Composable
fun Greeting(
name: String,
modifier: Modifier = Modifier,
) {
Text(
text = "Hello $name!",
modifier = modifier,
)
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
EverpTheme {
Greeting("Android")
private fun getFcmToken() {
// Repository를 통해서만 FCM 토큰 접근
// MainActivity에서는 Firebase 객체에 직접 접근하지 않음
lifecycleScope.launch {
try {
val token = notificationRepository.getToken()
Timber.tag("FCM").i("FCM Token: $token")
// TODO: 서버에 토큰 전송 또는 로컬 저장 등 필요한 작업 수행
} catch (e: Exception) {
Timber.tag("FCM").e(e, "Fetching FCM token failed")
}
}
}
}
19 changes: 19 additions & 0 deletions app/src/main/java/com/autoever/everp/auth/api/AuthApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.autoever.everp.auth.api

import com.autoever.everp.auth.config.AuthConfig
import com.autoever.everp.auth.model.TokenResponse

/**
* 인증 서버 연동 API
* - 인가 코드 교환(Authorization Code + PKCE)
* - 로그아웃
*/
interface AuthApi {
suspend fun exchangeAuthCodeForToken(
config: AuthConfig,
code: String,
codeVerifier: String,
): TokenResponse

suspend fun logout(accessToken: String?): Boolean
}
Loading
Loading