diff --git a/app/src/main/java/com/sopt/now/config/BaseActivity.kt b/app/src/main/java/com/sopt/now/config/BaseActivity.kt new file mode 100644 index 0000000..d7150e8 --- /dev/null +++ b/app/src/main/java/com/sopt/now/config/BaseActivity.kt @@ -0,0 +1,21 @@ +package com.sopt.now.config + +import android.os.Bundle +import android.os.PersistableBundle +import android.view.LayoutInflater +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class BaseActivity(private val inflate: (LayoutInflater) -> B) : + AppCompatActivity() { + protected lateinit var binding: B + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = inflate(layoutInflater).apply { + setContentView(root) + } + } +} diff --git a/app/src/main/java/com/sopt/now/config/BaseFragment.kt b/app/src/main/java/com/sopt/now/config/BaseFragment.kt new file mode 100644 index 0000000..e459dc4 --- /dev/null +++ b/app/src/main/java/com/sopt/now/config/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.sopt.now.config + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class BaseFragment( + private val bind: (View) -> B, + @LayoutRes layoutResId: Int +) : Fragment(layoutResId) { + private var _binding: B? = null + protected val binding get() = requireNotNull(_binding) + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = super.onCreateView(inflater, container, savedInstanceState)?.let { bind(it) } + return binding.root + } + + override fun onDestroyView() { + _binding = null + super.onDestroyView() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/utils/BaseResponse.kt b/app/src/main/java/com/sopt/now/config/BaseResponse.kt similarity index 90% rename from app/src/main/java/com/sopt/now/utils/BaseResponse.kt rename to app/src/main/java/com/sopt/now/config/BaseResponse.kt index 2644e0f..e1bbab0 100644 --- a/app/src/main/java/com/sopt/now/utils/BaseResponse.kt +++ b/app/src/main/java/com/sopt/now/config/BaseResponse.kt @@ -1,4 +1,4 @@ -package com.sopt.now.utils +package com.sopt.now.config import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/sopt/now/utils/XAccessTokenInterceptor.kt b/app/src/main/java/com/sopt/now/config/XAccessTokenInterceptor.kt similarity index 95% rename from app/src/main/java/com/sopt/now/utils/XAccessTokenInterceptor.kt rename to app/src/main/java/com/sopt/now/config/XAccessTokenInterceptor.kt index a0949af..4c71db9 100644 --- a/app/src/main/java/com/sopt/now/utils/XAccessTokenInterceptor.kt +++ b/app/src/main/java/com/sopt/now/config/XAccessTokenInterceptor.kt @@ -1,4 +1,4 @@ -package com.sopt.now.utils +package com.sopt.now.config import com.sopt.now.ApplicationClass.SharedPreferences.sSharedPreferences import com.sopt.now.utils.Constants.Companion.MEMBER_ID diff --git a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt index 6bb8506..762d7ca 100644 --- a/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/now/data/AuthRepositoryImpl.kt @@ -4,7 +4,7 @@ import com.sopt.now.datasource.AuthService import com.sopt.now.model.login.RequestLoginDto import com.sopt.now.model.signup.RequestSignUpDto import com.sopt.now.repository.AuthRepository -import com.sopt.now.utils.BaseResponse +import com.sopt.now.config.BaseResponse import retrofit2.Response class AuthRepositoryImpl( diff --git a/app/src/main/java/com/sopt/now/data/MyPageRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/MyPageRepositoryImpl.kt index 4e742c8..b15454a 100644 --- a/app/src/main/java/com/sopt/now/data/MyPageRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/now/data/MyPageRepositoryImpl.kt @@ -3,7 +3,7 @@ package com.sopt.now.data import com.sopt.now.datasource.InfoService import com.sopt.now.model.info.UserInfo import com.sopt.now.repository.MyPageRepository -import com.sopt.now.utils.BaseResponse +import com.sopt.now.config.BaseResponse import retrofit2.Response class MyPageRepositoryImpl( diff --git a/app/src/main/java/com/sopt/now/datasource/AuthService.kt b/app/src/main/java/com/sopt/now/datasource/AuthService.kt index a044930..2a9f226 100644 --- a/app/src/main/java/com/sopt/now/datasource/AuthService.kt +++ b/app/src/main/java/com/sopt/now/datasource/AuthService.kt @@ -2,7 +2,7 @@ package com.sopt.now.datasource import com.sopt.now.model.login.RequestLoginDto import com.sopt.now.model.signup.RequestSignUpDto -import com.sopt.now.utils.BaseResponse +import com.sopt.now.config.BaseResponse import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST diff --git a/app/src/main/java/com/sopt/now/datasource/InfoService.kt b/app/src/main/java/com/sopt/now/datasource/InfoService.kt index d02d8cd..c3a70de 100644 --- a/app/src/main/java/com/sopt/now/datasource/InfoService.kt +++ b/app/src/main/java/com/sopt/now/datasource/InfoService.kt @@ -1,7 +1,7 @@ package com.sopt.now.datasource import com.sopt.now.model.info.UserInfo -import com.sopt.now.utils.BaseResponse +import com.sopt.now.config.BaseResponse import retrofit2.Response import retrofit2.http.GET diff --git a/app/src/main/java/com/sopt/now/presentation/auth/login/LoginActivity.kt b/app/src/main/java/com/sopt/now/presentation/auth/login/LoginActivity.kt index 6facd02..6dd7f5f 100644 --- a/app/src/main/java/com/sopt/now/presentation/auth/login/LoginActivity.kt +++ b/app/src/main/java/com/sopt/now/presentation/auth/login/LoginActivity.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import com.sopt.now.ApplicationClass.SharedPreferences.sSharedPreferences +import com.sopt.now.config.BaseActivity import com.sopt.now.databinding.ActivityLoginBinding import com.sopt.now.model.login.RequestLoginDto import com.sopt.now.presentation.auth.signup.SignupActivity @@ -19,15 +20,12 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @AndroidEntryPoint -class LoginActivity : AppCompatActivity() { - private lateinit var binding: ActivityLoginBinding +class LoginActivity : BaseActivity(ActivityLoginBinding::inflate) { private val loginViewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityLoginBinding.inflate(layoutInflater).apply { setContentView(root) } - with(binding) { btnSignup.setOnClickListener { navigateToSignup() } btnLogin.setOnClickListener { login() } diff --git a/app/src/main/java/com/sopt/now/presentation/auth/signup/SignupActivity.kt b/app/src/main/java/com/sopt/now/presentation/auth/signup/SignupActivity.kt index 37750ab..328e00d 100644 --- a/app/src/main/java/com/sopt/now/presentation/auth/signup/SignupActivity.kt +++ b/app/src/main/java/com/sopt/now/presentation/auth/signup/SignupActivity.kt @@ -6,6 +6,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import com.sopt.now.R +import com.sopt.now.config.BaseActivity import com.sopt.now.databinding.ActivitySignupBinding import com.sopt.now.model.signup.RequestSignUpDto import com.sopt.now.utils.UiState @@ -15,14 +16,12 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @AndroidEntryPoint -class SignupActivity : AppCompatActivity() { - private lateinit var binding: ActivitySignupBinding +class SignupActivity : BaseActivity(ActivitySignupBinding::inflate) { private val signUpViewModel: SignUpViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivitySignupBinding.inflate(layoutInflater).apply { setContentView(root) } binding.btnSignup.setOnClickListener { signUp() } observeSignUp() } diff --git a/app/src/main/java/com/sopt/now/presentation/main/home/HomeFragment.kt b/app/src/main/java/com/sopt/now/presentation/main/home/HomeFragment.kt index 14b395a..bbae018 100644 --- a/app/src/main/java/com/sopt/now/presentation/main/home/HomeFragment.kt +++ b/app/src/main/java/com/sopt/now/presentation/main/home/HomeFragment.kt @@ -6,22 +6,13 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import com.sopt.now.R +import com.sopt.now.config.BaseFragment import com.sopt.now.databinding.FragmentHomeBinding -class HomeFragment : Fragment() { - private var _binding: FragmentHomeBinding? = null - private val binding get() = requireNotNull(_binding) +class HomeFragment : BaseFragment(FragmentHomeBinding::bind, R.layout.fragment_home) { private val viewModel by viewModels() - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentHomeBinding.inflate(inflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -33,9 +24,4 @@ class HomeFragment : Fragment() { binding.rvFriend.adapter = friendAdapter friendAdapter.setFriendList(viewModel.mockFriendList) } - - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/sopt/now/presentation/main/mypage/MyPageFragment.kt b/app/src/main/java/com/sopt/now/presentation/main/mypage/MyPageFragment.kt index 2ae4093..2f66aef 100644 --- a/app/src/main/java/com/sopt/now/presentation/main/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/sopt/now/presentation/main/mypage/MyPageFragment.kt @@ -8,6 +8,8 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import com.sopt.now.R +import com.sopt.now.config.BaseFragment import com.sopt.now.databinding.FragmentMypageBinding import com.sopt.now.model.info.UserInfo import com.sopt.now.utils.UiState @@ -17,20 +19,9 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @AndroidEntryPoint -class MyPageFragment : Fragment() { - private var _binding: FragmentMypageBinding? = null - private val binding get() = requireNotNull(_binding) +class MyPageFragment : BaseFragment(FragmentMypageBinding::bind, R.layout.fragment_mypage) { private val myPageViewModel: MyPageViewModel by viewModels() - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentMypageBinding.inflate(inflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -42,11 +33,6 @@ class MyPageFragment : Fragment() { myPageViewModel.getUserInfo() } - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } - private fun observeUserInfo() { myPageViewModel.state.flowWithLifecycle(viewLifecycleOwner.lifecycle).onEach { state -> when (state) { @@ -66,4 +52,4 @@ class MyPageFragment : Fragment() { tvMainUserPhone.text = data.phone } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/sopt/now/presentation/main/search/SearchFragment.kt b/app/src/main/java/com/sopt/now/presentation/main/search/SearchFragment.kt index 81e5cc0..16e9754 100644 --- a/app/src/main/java/com/sopt/now/presentation/main/search/SearchFragment.kt +++ b/app/src/main/java/com/sopt/now/presentation/main/search/SearchFragment.kt @@ -5,27 +5,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import com.sopt.now.R +import com.sopt.now.config.BaseFragment import com.sopt.now.databinding.FragmentSearchBinding -class SearchFragment: Fragment() { - private var _binding: FragmentSearchBinding ?= null - private val binding get() = requireNotNull(_binding) - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentSearchBinding.inflate(inflater, container, false) - return binding.root - } - +class SearchFragment: BaseFragment(FragmentSearchBinding::bind, R.layout.fragment_search) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } - - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/sopt/now/repository/AuthRepository.kt b/app/src/main/java/com/sopt/now/repository/AuthRepository.kt index 1d85681..fcf93bb 100644 --- a/app/src/main/java/com/sopt/now/repository/AuthRepository.kt +++ b/app/src/main/java/com/sopt/now/repository/AuthRepository.kt @@ -2,7 +2,7 @@ package com.sopt.now.repository import com.sopt.now.model.login.RequestLoginDto import com.sopt.now.model.signup.RequestSignUpDto -import com.sopt.now.utils.BaseResponse +import com.sopt.now.config.BaseResponse import retrofit2.Response interface AuthRepository { diff --git a/app/src/main/java/com/sopt/now/repository/MyPageRepository.kt b/app/src/main/java/com/sopt/now/repository/MyPageRepository.kt index 7e40f9a..81d33e0 100644 --- a/app/src/main/java/com/sopt/now/repository/MyPageRepository.kt +++ b/app/src/main/java/com/sopt/now/repository/MyPageRepository.kt @@ -1,7 +1,7 @@ package com.sopt.now.repository import com.sopt.now.model.info.UserInfo -import com.sopt.now.utils.BaseResponse +import com.sopt.now.config.BaseResponse import retrofit2.Response interface MyPageRepository { diff --git a/app/src/main/java/com/sopt/now/utils/ApiFactory.kt b/app/src/main/java/com/sopt/now/utils/ApiFactory.kt index 11772dd..5b84daa 100644 --- a/app/src/main/java/com/sopt/now/utils/ApiFactory.kt +++ b/app/src/main/java/com/sopt/now/utils/ApiFactory.kt @@ -2,9 +2,9 @@ package com.sopt.now.utils import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.sopt.now.BuildConfig +import com.sopt.now.config.XAccessTokenInterceptor import com.sopt.now.datasource.AuthService import com.sopt.now.datasource.InfoService -import com.sopt.now.utils.ApiFactory.create import dagger.Module import dagger.Provides import dagger.hilt.InstallIn