Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 회원가입 닉네임 sharedpreference #59

Merged
merged 10 commits into from
Jul 20, 2023
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.sopt.geonppang.data.datasource.local

import android.content.Context
import android.content.SharedPreferences
import androidx.core.content.edit
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
import com.sopt.geonppang.BuildConfig
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class GPDataStore @Inject constructor(@ApplicationContext context: Context) {
private val masterKey = MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()

private val dataStore: SharedPreferences =
if (BuildConfig.DEBUG) context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE)
else EncryptedSharedPreferences.create(
context,
FILE_NAME,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

var userNickname: String
set(value) = dataStore.edit { putString(NICKNAME, value) }
get() = dataStore.getString(NICKNAME, "") ?: ""

companion object {
const val FILE_NAME = "GunppangSharedPreferences"
const val NICKNAME = "nickname"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ data class ResponseBestReview(
val isVegan: Boolean,
val reviewCount: Int,
val reviewText: String,
val secondMaxRecommendKeyword: String,
val secondMaxRecommendKeyword: String?,
val secondNearStation: String,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ data class BestReview(
val bakeryName: String,
val reviewText: String,
val firstReviewChip: String,
val secondReviewChip: String,
val secondReviewChip: String?,
val bookmarkCount: Int,
val bakeryImage: String,
val reviewCount: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ class FilterActivity : BindingActivity<ActivityFilterBinding>(R.layout.activity_

maxPage = intent.getIntExtra(MAX_PAGE, -1)
binding.tvFilterPageNumber.text = setPageText(maxPage - 2, maxPage)

viewModel.setUserNickName()
}

private fun addListeners() {
Expand All @@ -57,7 +59,7 @@ class FilterActivity : BindingActivity<ActivityFilterBinding>(R.layout.activity_
if (viewModel.previousActivityName.value == FilterInfoType.HOME.activityName) {
startActivity(Intent(this, MainActivity::class.java))
} else if (viewModel.previousActivityName.value == FilterInfoType.ONBOARDING.activityName) {
startActivity(Intent(this, WelcomeActivity::class.java))
moveToWelcomActivity()
} else {
val intent = Intent(this, MainActivity::class.java)
intent.putExtra(MYPAGE_FRAGMENT, MYPAGE_FRAGMENT)
Expand Down Expand Up @@ -89,6 +91,12 @@ class FilterActivity : BindingActivity<ActivityFilterBinding>(R.layout.activity_
}
}

private fun moveToWelcomActivity() {
val intent = Intent(this, WelcomeActivity::class.java)
intent.putExtra(NICKNAME, viewModel.nickName.value)
startActivity(intent)
}

private fun setPreviousActivity() {
val filterInfoType = intent.getStringExtra(FILTER_INFO)
filterInfoType?.let { filterInfoType ->
Expand All @@ -103,6 +111,7 @@ class FilterActivity : BindingActivity<ActivityFilterBinding>(R.layout.activity_
companion object {
const val FILTER_INFO = "filterInfo"
const val MYPAGE_FRAGMENT = "MyPageFragment"
const val NICKNAME = "nickName"
const val MAX_PAGE = "maxPage"
const val PAGE_FORMAT = "%d/%d"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.geonppang.data.datasource.local.GPDataStore
import com.sopt.geonppang.data.model.request.RequestFilter
import com.sopt.geonppang.domain.model.SelectedFilter
import com.sopt.geonppang.domain.repository.FilterRepository
Expand All @@ -20,7 +21,8 @@ import javax.inject.Inject

@HiltViewModel
class FilterViewModel @Inject constructor(
private val filterRepository: FilterRepository
private val filterRepository: FilterRepository,
private val gpDataStore: GPDataStore
) : ViewModel() {
private val _selectedFilterState = MutableStateFlow<UiState<SelectedFilter>>(UiState.Loading)
val selectedFilterState get() = _selectedFilterState.asStateFlow()
Expand All @@ -31,6 +33,9 @@ class FilterViewModel @Inject constructor(
private val _mainPurpose: MutableLiveData<MainPurposeType?> = MutableLiveData()
val mainPurpose: LiveData<MainPurposeType?> = _mainPurpose

private val _nickName: MutableLiveData<String> = MutableLiveData()
val nickName: LiveData<String> = _nickName

fun setMainPurpose(mainPurposeType: MainPurposeType) {
_mainPurpose.value = mainPurposeType
}
Expand Down Expand Up @@ -82,6 +87,10 @@ class FilterViewModel @Inject constructor(
_previousActivityName.value = filterInfoTypeName
}

fun setUserNickName() {
_nickName.value = gpDataStore.userNickname
}

fun setUserFilter() {
viewModelScope.launch {
_mainPurpose.value?.let {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,24 @@ class WelcomeActivity : BindingActivity<ActivityWelcomeBinding>(R.layout.activit
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

initLayout()
addListeners()
}

private fun initLayout() {
val nickName = intent.getStringExtra(NICKNAME)
binding.tvStartWelcomeTitle.text = this.getString(R.string.welcome_to_geonppang, nickName)
}

private fun addListeners() {
binding.btnWelcome.setOnClickListener {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
}

companion object {
const val NICKNAME = "nickName"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>(R.layout.fragment_home

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.viewModel = viewModel
binding.lifecycleOwner = this

initLayout()
addListeners()
Expand All @@ -39,6 +41,8 @@ class HomeFragment : BindingFragment<FragmentHomeBinding>(R.layout.fragment_home

bestReviewAdapter = BestReviewAdapter(::moveToDetail)
binding.rvHomeBestReviewList.adapter = bestReviewAdapter

viewModel.setUserNickName()
}

private fun addListeners() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.sopt.geonppang.presentation.home

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.geonppang.data.datasource.local.GPDataStore
import com.sopt.geonppang.domain.model.BestBakery
import com.sopt.geonppang.domain.model.BestReview
import com.sopt.geonppang.domain.repository.HomeRepository
Expand All @@ -14,6 +15,7 @@ import javax.inject.Inject

@HiltViewModel
class HomeViewModel @Inject constructor(
private val gpDataStore: GPDataStore,
private val homeRepository: HomeRepository,
) : ViewModel() {
private var _bestBakeryListState = MutableStateFlow<UiState<List<BestBakery>>>(UiState.Loading)
Expand All @@ -22,11 +24,18 @@ class HomeViewModel @Inject constructor(
private var _bestReviewListState = MutableStateFlow<UiState<List<BestReview>>>(UiState.Loading)
val bestReviewListState get() = _bestReviewListState.asStateFlow()

private val _nickName = MutableStateFlow<String?>(null)
val nickName get() = _nickName.asStateFlow()

init {
fetchBestBakeryList()
fetchBestReviewList()
}

fun setUserNickName() {
_nickName.value = gpDataStore.userNickname
}

private fun fetchBestBakeryList() {
viewModelScope.launch {
homeRepository.fetchBestBakery()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class MyPageFragment : BindingFragment<FragmentMyPageBinding>(R.layout.fragment_

private fun initLayout() {
viewModel.fetchMypageInfo()
viewModel.setUserNickName()
}

private fun addListeners() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.sopt.geonppang.presentation.mypage

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.geonppang.data.datasource.local.GPDataStore
import com.sopt.geonppang.domain.model.Bakery
import com.sopt.geonppang.domain.model.MyReview
import com.sopt.geonppang.domain.model.Profile
Expand All @@ -16,6 +17,7 @@ import javax.inject.Inject

@HiltViewModel
class MyPageViewModel @Inject constructor(
private val gpDataStore: GPDataStore,
private val mypageRepository: MypageRepository,
) : ViewModel() {
private var _mypageInfoState = MutableStateFlow<Profile?>(null)
Expand All @@ -35,11 +37,18 @@ class MyPageViewModel @Inject constructor(
private var _myBookmarkCount = MutableStateFlow<Int?>(null)
val myBookmarkCount get() = _myBookmarkCount.asStateFlow()

private val _nickName = MutableStateFlow<String?>(null)
val nickName get() = _nickName.asStateFlow()

init {
fetchMypageReviewList()
fetchMypageBookmarkList()
}

fun setUserNickName() {
_nickName.value = gpDataStore.userNickname
}

fun fetchMypageInfo() {
viewModelScope.launch {
mypageRepository.fetchMypageInfo()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import androidx.fragment.app.viewModels
import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.DialogBottomSignupEmailBinding
import com.sopt.geonppang.util.binding.BindingBottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SignUpEmailBottomSheetDialog :
BindingBottomSheetDialogFragment<DialogBottomSignupEmailBinding>(
R.layout.dialog_bottom_signup_email
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class SignUpNicknameActivity :
intent.putExtra(FILTER_INFO, FilterInfoType.ONBOARDING.activityName)
intent.putExtra(MAX_PAGE, FilterInfoType.ONBOARDING.maxPage)
startActivity(intent)
viewModel.saveUserNickname()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import androidx.fragment.app.viewModels
import com.sopt.geonppang.R
import com.sopt.geonppang.databinding.DialogBottomSignupNicknameBinding
import com.sopt.geonppang.util.binding.BindingBottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SignUpNicknameBottomSheetDialog :
BindingBottomSheetDialogFragment<DialogBottomSignupNicknameBinding>(
R.layout.dialog_bottom_signup_nickname
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.map
import com.sopt.geonppang.data.datasource.local.GPDataStore
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
class SignUpViewModel @Inject constructor() : ViewModel() {
class SignUpViewModel @Inject constructor(private val gpDataStore: GPDataStore) : ViewModel() {
val email = MutableLiveData("")
val password = MutableLiveData("")
val password_check = MutableLiveData("")
Expand Down Expand Up @@ -66,9 +67,15 @@ class SignUpViewModel @Inject constructor() : ViewModel() {
return isValidNickname.value == true
}

fun saveUserNickname() {
nickname.value?.let { nickName ->
gpDataStore.userNickname = nickName
}
}

companion object {
const val EMAIL_PATTERN = "^[a-zA-Z0-9+-\\_.]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+\$"
const val NICKNAME_PATTERN = "^[-ㅎ가-힣0-9a-zA-Z]{1,10}$"
const val NICKNAME_PATTERN = "^[\\sㄱ-ㅎ가-힣0-9a-zA-Z]{1,10}\$"
const val PASSWORD_PATTERN = "^[A-Za-z0-9]{8,25}$"
}
}
6 changes: 4 additions & 2 deletions app/src/main/res/layout/activity_signup_email.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
android:layout_marginBottom="16dp"
android:background="@null"
android:hint="@string/email_hint"
android:inputType="text"
android:inputType="textEmailAddress"
android:paddingVertical="5dp"
android:text="@={viewModel.email}"
android:textAppearance="@style/TextAppearance.Headline"
Expand Down Expand Up @@ -129,6 +129,7 @@
app:layout_constraintEnd_toEndOf="@id/gl_end"
app:layout_constraintStart_toStartOf="@id/gl_start"
app:layout_constraintTop_toBottomOf="@id/linear_email"
app:rippleColor="@color/white"
app:strokeColor="@{viewModel.isValidEmail() == true ? @color/main_2 : @color/gray_300}" />

<com.google.android.material.button.MaterialButton
Expand All @@ -145,7 +146,8 @@
android:textColor="@{viewModel.isValidEmail() == true ? @color/white : @color/gray_400}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/gl_end"
app:layout_constraintStart_toStartOf="@id/gl_start" />
app:layout_constraintStart_toStartOf="@id/gl_start"
app:rippleColor="@color/main_3 " />

</androidx.constraintlayout.widget.ConstraintLayout>

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/layout/activity_welcome.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="112dp"
android:text="건빵화이팅님\n건빵에 오신 걸 환영해요!"
android:textAppearance="@style/TextAppearance.Title1"
android:textColor="@color/gray_700"
app:layout_constraintStart_toStartOf="@id/gl_start"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
tools:text="건빵화이팅님\n건빵에 오신 걸 환영해요!" />

<ImageView
android:id="@+id/iv_welcome"
Expand Down
9 changes: 6 additions & 3 deletions app/src/main/res/layout/fragment_home.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

<data>

<variable
name="viewModel"
type="com.sopt.geonppang.presentation.home.HomeViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
Expand All @@ -30,7 +33,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:text="바이블님\n건빵에 오신걸 환영해요!"
android:text="@{@string/home_title(viewModel.nickName)}"
android:textAppearance="@style/TextAppearance.Title1"
app:layout_constraintStart_toStartOf="@id/gl_start"
app:layout_constraintTop_toTopOf="parent"
Expand Down Expand Up @@ -92,7 +95,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing24"
android:layout_marginTop="22dp"
android:text="@string/home_best_title1"
android:text="@{@string/home_best_title1(viewModel.nickName)}"
android:textAppearance="@style/TextAppearance.Title2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
Expand Down Expand Up @@ -127,7 +130,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing24"
android:layout_marginTop="28dp"
android:text="@string/home_best_title1"
android:text="@{@string/home_best_title1(viewModel.nickName)}"
android:textAppearance="@style/TextAppearance.Title2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rv_home_best_bakery_list"
Expand Down
Loading
Loading