diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 76f37af5..15965b16 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -24,8 +24,8 @@ android {
applicationId = "com.kuit.findu"
minSdk = 28
targetSdk = 35
- versionCode = 5
- versionName = "1.0.4"
+ versionCode = 12
+ versionName = "1.0.11"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "GPT_KEY", properties["GPT_KEY"].toString())
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index edba50f6..4f09ee84 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,8 @@
+
diff --git a/app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt b/app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt
new file mode 100644
index 00000000..63d2f5b9
--- /dev/null
+++ b/app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt
@@ -0,0 +1,34 @@
+package com.kuit.findu.data.dataremote.util
+
+import android.content.Context
+import android.content.Intent
+import com.kuit.findu.data.datalocal.datasource.TokenLocalDataSource
+import com.kuit.findu.presentation.ui.login.LoginActivity
+import dagger.hilt.android.qualifiers.ApplicationContext
+import okhttp3.Interceptor
+import okhttp3.Response
+import javax.inject.Inject
+
+class AuthAuthenticator @Inject constructor(
+ private val tokenLocalDataSource: TokenLocalDataSource,
+ @ApplicationContext private val context: Context
+) : Interceptor {
+ override fun intercept(chain: Interceptor.Chain): Response {
+ val request = chain.request()
+ val response = chain.proceed(request)
+
+ // 401 Unauthorized 에러 감지
+ if (response.code == 401) {
+ // 토큰 삭제
+ tokenLocalDataSource.clearToken()
+
+ // 로그인 화면으로 이동
+ val intent = Intent(context, LoginActivity::class.java).apply {
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ }
+ context.startActivity(intent)
+ }
+
+ return response
+ }
+}
diff --git a/app/src/main/java/com/kuit/findu/data/dataremote/util/Exceptions.kt b/app/src/main/java/com/kuit/findu/data/dataremote/util/Exceptions.kt
new file mode 100644
index 00000000..1483eda3
--- /dev/null
+++ b/app/src/main/java/com/kuit/findu/data/dataremote/util/Exceptions.kt
@@ -0,0 +1,3 @@
+package com.kuit.findu.data.dataremote.util
+
+class AuthenticationException: Exception()
\ No newline at end of file
diff --git a/app/src/main/java/com/kuit/findu/di/NetworkModule.kt b/app/src/main/java/com/kuit/findu/di/NetworkModule.kt
index 034b54f6..daf0b3d9 100644
--- a/app/src/main/java/com/kuit/findu/di/NetworkModule.kt
+++ b/app/src/main/java/com/kuit/findu/di/NetworkModule.kt
@@ -6,6 +6,7 @@ import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFact
import com.kuit.findu.BuildConfig
import com.kuit.findu.BuildConfig.DEBUG
import com.kuit.findu.data.datalocal.datasource.TokenLocalDataSource
+import com.kuit.findu.data.dataremote.util.AuthAuthenticator
import com.kuit.findu.data.dataremote.util.AuthInterceptor
import com.kuit.findu.data.dataremote.util.ErrorTrackingInterceptor
import dagger.Module
@@ -42,15 +43,17 @@ object NetworkModule {
fun providesOkHttpClient(
loggingInterceptor: HttpLoggingInterceptor,
authInterceptor: AuthInterceptor,
+ authAuthenticator: AuthAuthenticator,
errorTrackingInterceptor: ErrorTrackingInterceptor,
): OkHttpClient =
OkHttpClient.Builder().apply {
connectTimeout(10, TimeUnit.SECONDS)
writeTimeout(10, TimeUnit.SECONDS)
readTimeout(10, TimeUnit.SECONDS)
+ addInterceptor(authInterceptor)
if (DEBUG) addInterceptor(loggingInterceptor)
else addInterceptor(errorTrackingInterceptor)
- addInterceptor(authInterceptor)
+ addInterceptor(authAuthenticator)
}.build()
@Provides
@@ -69,6 +72,15 @@ object NetworkModule {
return AuthInterceptor(tokenLocalDataSource, context)
}
+ @Provides
+ @Singleton
+ fun provideAuthAuthenticator(
+ tokenLocalDataSource: TokenLocalDataSource,
+ @ApplicationContext context: Context,
+ ): AuthAuthenticator {
+ return AuthAuthenticator(tokenLocalDataSource, context)
+ }
+
@Provides
@Singleton
fun provideErrorTrackingInterceptor(
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/home/HomeFragment.kt b/app/src/main/java/com/kuit/findu/presentation/ui/home/HomeFragment.kt
index a5f2d68a..09fc114f 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/home/HomeFragment.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/home/HomeFragment.kt
@@ -24,6 +24,7 @@ import com.kuit.findu.presentation.ui.home.composeview.HomeScreen
import com.kuit.findu.presentation.ui.home.viewmodel.HomeUiEffect
import com.kuit.findu.presentation.ui.home.viewmodel.HomeUiEvent
import com.kuit.findu.presentation.ui.home.viewmodel.HomeViewModel
+import com.kuit.findu.presentation.ui.login.LoginActivity
import com.kuit.findu.presentation.util.permission.LocationPermissionManager.hasLocationPermission
import dagger.hilt.android.AndroidEntryPoint
@@ -89,11 +90,13 @@ class HomeFragment : Fragment() {
is HomeUiEffect.NavigateToFindReport -> {
navigateToFindReport()
}
+
is HomeUiEffect.NavigateToLostReport -> {
navigateToLostReport()
}
is HomeUiEffect.Dial -> call120()
+ is HomeUiEffect.NavigateToLogin -> startLoginActivity()
}
}
}
@@ -173,6 +176,11 @@ class HomeFragment : Fragment() {
)
}
+ private fun startLoginActivity() {
+ val intent = Intent(requireContext(), LoginActivity::class.java)
+ startActivity(intent)
+ requireActivity().finish()
+ }
private fun navigateToProtectDetail(id: String, tag: String, name: String) {
when (tag) {
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt b/app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
index 47c5f3c9..ce7d67dc 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
@@ -1,7 +1,9 @@
package com.kuit.findu.presentation.ui.home.viewmodel
+import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
+import com.kuit.findu.data.dataremote.util.AuthenticationException
import com.kuit.findu.domain.model.HomeData
import com.kuit.findu.domain.model.ProtectAnimal
import com.kuit.findu.domain.model.ReportAnimal
@@ -78,6 +80,7 @@ sealed class HomeUiEffect {
data class ShowToast(val message: String) : HomeUiEffect()
data object Dial : HomeUiEffect()
+ data object NavigateToLogin : HomeUiEffect()
}
@HiltViewModel
@@ -140,6 +143,11 @@ class HomeViewModel @Inject constructor(
}
},
onFailure = { error ->
+ Log.e("HomeViewModel", "loadHomeData: $error")
+ if(error.message?.contains("401") == true) {
+ _uiEffect.send(HomeUiEffect.NavigateToLogin)
+ return@fold
+ }
_uiState.update {
it.copy(
loadState = LoadState.Error,
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt b/app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt
index 32caac6c..b3ea8688 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt
@@ -28,7 +28,7 @@ import com.kuit.findu.ui.theme.FindUTheme
fun LoginScreen(
kakaoLoginButtonClicked: () -> Unit,
withoutSignUpButtonClicked: () -> Unit,
- modifier: Modifier = Modifier
+ modifier: Modifier = Modifier,
) {
Column(
modifier = modifier
@@ -66,12 +66,13 @@ fun LoginScreen(
tint = Color.Unspecified,
)
Spacer(modifier = Modifier.height(53.dp))
- Icon(
- painter = painterResource(R.drawable.img_kakao_login),
- contentDescription = null,
- modifier = Modifier.noRippleClickable(kakaoLoginButtonClicked),
- tint = Color.Unspecified
- )
+// Icon(
+// painter = painterResource(R.drawable.img_kakao_login),
+// contentDescription = null,
+// modifier = Modifier.noRippleClickable(),
+// tint = Color.Unspecified
+// )
+ Spacer(modifier = Modifier.height(50.dp))
Spacer(modifier = Modifier.height(15.dp))
Text(
text = stringResource(R.string.login_without_signup),
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt b/app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt
index decd0d2a..5db589ab 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt
@@ -186,7 +186,14 @@ class MyFragment : Fragment() {
// clMyAlarmSetting.setOnClickListener {
// myViewModel.toggleAlarmSetting()
// }
- binding.clMyAlarmSetting.isEnabled = false
+// binding.clMyAlarmSetting.isEnabled = false
+
+ clMyGotoLogin.setOnClickListener {
+ with(requireActivity()) {
+ startActivity(Intent(requireContext(), LoginActivity::class.java))
+ finish()
+ }
+ }
setupVersion()
}
@@ -250,6 +257,14 @@ class MyFragment : Fragment() {
.load(type.drawableRes)
.into(binding.ivMyIllust)
}
+
+ if(it.nickname == "게스트") {
+ binding.ivMyEditPen.visibility = View.GONE
+ binding.clMyWithdrawal.visibility = View.GONE
+ binding.clMyLogout.visibility = View.GONE
+ } else {
+ binding.clMyGotoLogin.visibility = View.GONE
+ }
}
}
}
@@ -284,9 +299,9 @@ class MyFragment : Fragment() {
}
launch {
myViewModel.alarmEnabled.collect { enabled ->
- binding.ivMyAlarmIcon.setImageResource(
- if (enabled) R.drawable.img_my_alarm_on else R.drawable.img_my_alarm_off
- )
+// binding.ivMyAlarmIcon.setImageResource(
+// if (enabled) R.drawable.img_my_alarm_on else R.drawable.img_my_alarm_off
+// )
}
}
}
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt b/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt
index 4e99c236..e8e81a2f 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt
@@ -56,6 +56,7 @@ class SearchDisappearDetailFragment : Fragment() {
binding.mapView.getMapAsync { nMap ->
naverMap = nMap
+ naverMap?.uiSettings?.isLogoClickEnabled = false
pendingLocation?.let { location ->
setupMap(location.latitude, location.longitude)
}
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt b/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt
index dcf9ed54..4390ef68 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt
@@ -57,6 +57,7 @@ class SearchProtectingDetailFragment : Fragment() {
binding.mapView.getMapAsync { nMap ->
naverMap = nMap
+ naverMap?.uiSettings?.isLogoClickEnabled = false
pendingLocation?.let { location ->
setupMap(location.latitude, location.longitude)
}
diff --git a/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt b/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt
index 4123c400..08f77d81 100644
--- a/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt
+++ b/app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt
@@ -54,6 +54,7 @@ class SearchWitnessDetailFragment : Fragment() {
binding.mapView.onCreate(savedInstanceState)
binding.mapView.getMapAsync { nMap ->
naverMap = nMap
+ naverMap?.uiSettings?.isLogoClickEnabled = false
pendingLocation?.let { location ->
setupMap(location.latitude, location.longitude)
}
diff --git a/app/src/main/res/layout/dialog_my_profile_image.xml b/app/src/main/res/layout/dialog_my_profile_image.xml
index 0bffe275..6229e7c1 100644
--- a/app/src/main/res/layout/dialog_my_profile_image.xml
+++ b/app/src/main/res/layout/dialog_my_profile_image.xml
@@ -4,7 +4,8 @@
android:layout_width="320dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_my_dialog"
- android:padding="20dp">
+ android:paddingHorizontal="24dp"
+ android:paddingVertical="20dp">
@@ -265,32 +266,32 @@
android:textAppearance="@style/TextAppearance.FindU.Body2_SB_14"
android:textColor="@color/gray4" />
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:orientation="horizontal"
+ android:visibility="gone">
@@ -53,10 +53,10 @@
android:id="@+id/vp_search_detail_img"
android:layout_width="match_parent"
android:layout_height="303dp"
- android:paddingStart="20dp"
android:layout_marginTop="11dp"
- android:paddingEnd="20dp"
android:nestedScrollingEnabled="false"
+ android:paddingStart="20dp"
+ android:paddingEnd="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -382,7 +382,8 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:visibility="gone">
- FindU
+ 찾아유
유기동물 관심의 시작,