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 + 찾아유 유기동물 관심의 시작,