3486: Rename stuff

This commit is contained in:
Lakoja 2023-08-22 15:52:09 +02:00
parent 84915e6af5
commit f09f464667
2 changed files with 36 additions and 40 deletions

View File

@ -100,6 +100,14 @@ class EditProfileActivity : BaseActivity(), Injectable {
} }
} }
private val currentProfileData
get() = ProfileData(
displayName = binding.displayNameEditText.text.toString(),
note = binding.noteEditText.text.toString(),
locked = binding.lockedCheckBox.isChecked,
fields = accountFieldEditAdapter.getFieldData()
)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -206,35 +214,25 @@ class EditProfileActivity : BaseActivity(), Injectable {
} }
val onBackCallback = object : OnBackPressedCallback(enabled = true) { val onBackCallback = object : OnBackPressedCallback(enabled = true) {
override fun handleOnBackPressed() = checkForPotentialUnsavedChanges() override fun handleOnBackPressed() {
} if (viewModel.hasUnsavedChanges(currentProfileData)) {
onBackPressedDispatcher.addCallback(this, onBackCallback)
}
fun checkForPotentialUnsavedChanges() {
if (hasUnsavedChanges()) {
showUnsavedChangesDialog() showUnsavedChangesDialog()
} else { } else {
finish() finish()
} }
} }
}
onBackPressedDispatcher.addCallback(this, onBackCallback)
}
override fun onStop() { override fun onStop() {
super.onStop() super.onStop()
if (!isFinishing) { if (!isFinishing) {
viewModel.updateProfile(profileData) viewModel.updateProfile(currentProfileData)
} }
} }
private val profileData
get() = ProfileData(
displayName = binding.displayNameEditText.text.toString(),
note = binding.noteEditText.text.toString(),
locked = binding.lockedCheckBox.isChecked,
fields = accountFieldEditAdapter.getFieldData()
)
private fun observeImage( private fun observeImage(
liveData: LiveData<Uri>, liveData: LiveData<Uri>,
imageView: ImageView, imageView: ImageView,
@ -308,7 +306,7 @@ class EditProfileActivity : BaseActivity(), Injectable {
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
private fun save() = viewModel.save(profileData) private fun save() = viewModel.save(currentProfileData)
private fun onSaveFailure(msg: String?) { private fun onSaveFailure(msg: String?) {
val errorMsg = msg ?: getString(R.string.error_media_upload_sending) val errorMsg = msg ?: getString(R.string.error_media_upload_sending)
@ -328,8 +326,6 @@ class EditProfileActivity : BaseActivity(), Injectable {
} }
} }
private fun hasUnsavedChanges() = viewModel.hasUnsavedChanges(profileData)
private suspend fun launchAlertDialog() = AlertDialog.Builder(this) private suspend fun launchAlertDialog() = AlertDialog.Builder(this)
.setTitle(getString(R.string.title_edit_profile_save_changes_prompt)) .setTitle(getString(R.string.title_edit_profile_save_changes_prompt))
.setMessage(getString(R.string.message_edit_profile_save_changes_prompt)) .setMessage(getString(R.string.message_edit_profile_save_changes_prompt))

View File

@ -76,7 +76,7 @@ class EditProfileViewModel @Inject constructor(
val instanceData: Flow<InstanceInfo> = instanceInfoRepo::getInstanceInfo.asFlow() val instanceData: Flow<InstanceInfo> = instanceInfoRepo::getInstanceInfo.asFlow()
.shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1) .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
private var oldProfileData: Account? = null private var apiProfileAccount: Account? = null
fun obtainProfile() = viewModelScope.launch { fun obtainProfile() = viewModelScope.launch {
if (profileData.value == null || profileData.value is Error) { if (profileData.value == null || profileData.value is Error) {
@ -84,7 +84,7 @@ class EditProfileViewModel @Inject constructor(
mastodonApi.accountVerifyCredentials().fold( mastodonApi.accountVerifyCredentials().fold(
{ profile -> { profile ->
oldProfileData = profile apiProfileAccount = profile
profileData.postValue(Success(profile)) profileData.postValue(Success(profile))
}, },
{ {
@ -113,21 +113,21 @@ class EditProfileViewModel @Inject constructor(
saveData.value = Loading() saveData.value = Loading()
val encoded = encodeChangedProfileFields(newProfileData) val diff = getProfileDiff(apiProfileAccount, newProfileData)
if (encoded.allFieldsAreNull()) { if (diff.hasNoChanges()) {
// if nothing has changed, there is no need to make a network request // if nothing has changed, there is no need to make an api call
saveData.postValue(Success()) saveData.postValue(Success())
return return
} }
viewModelScope.launch { viewModelScope.launch {
mastodonApi.accountUpdateCredentials( mastodonApi.accountUpdateCredentials(
encoded.displayName, encoded.note, encoded.locked, encoded.avatar, encoded.header, diff.displayName, diff.note, diff.locked, diff.avatar, diff.header,
encoded.field1?.first, encoded.field1?.second, encoded.field2?.first, encoded.field2?.second, encoded.field3?.first, encoded.field3?.second, encoded.field4?.first, encoded.field4?.second diff.field1?.first, diff.field1?.second, diff.field2?.first, diff.field2?.second, diff.field3?.first, diff.field3?.second, diff.field4?.first, diff.field4?.second
).fold( ).fold(
{ newProfileData -> { newAccountData ->
saveData.postValue(Success()) saveData.postValue(Success())
eventHub.dispatch(ProfileEditedEvent(newProfileData)) eventHub.dispatch(ProfileEditedEvent(newAccountData))
}, },
{ throwable -> { throwable ->
saveData.postValue(Error(errorMessage = throwable.getServerErrorMessage())) saveData.postValue(Error(errorMessage = throwable.getServerErrorMessage()))
@ -151,25 +151,25 @@ class EditProfileViewModel @Inject constructor(
} }
internal fun hasUnsavedChanges(newProfileData: ProfileData): Boolean { internal fun hasUnsavedChanges(newProfileData: ProfileData): Boolean {
val encoded = encodeChangedProfileFields(newProfileData) val diff = getProfileDiff(apiProfileAccount, newProfileData)
// If all fields are null, there are no changes. // If all fields are null, there are no changes.
return !encoded.allFieldsAreNull() return !diff.hasNoChanges()
} }
private fun encodeChangedProfileFields(newProfileData: ProfileData): EncodedProfileData { private fun getProfileDiff(oldProfileAccount: Account?, newProfileData: ProfileData): DiffProfileData {
val displayName = if (oldProfileData?.displayName == newProfileData.displayName) { val displayName = if (oldProfileAccount?.displayName == newProfileData.displayName) {
null null
} else { } else {
newProfileData.displayName.toRequestBody(MultipartBody.FORM) newProfileData.displayName.toRequestBody(MultipartBody.FORM)
} }
val note = if (oldProfileData?.source?.note == newProfileData.note) { val note = if (oldProfileAccount?.source?.note == newProfileData.note) {
null null
} else { } else {
newProfileData.note.toRequestBody(MultipartBody.FORM) newProfileData.note.toRequestBody(MultipartBody.FORM)
} }
val locked = if (oldProfileData?.locked == newProfileData.locked) { val locked = if (oldProfileAccount?.locked == newProfileData.locked) {
null null
} else { } else {
newProfileData.locked.toString().toRequestBody(MultipartBody.FORM) newProfileData.locked.toString().toRequestBody(MultipartBody.FORM)
@ -190,13 +190,13 @@ class EditProfileViewModel @Inject constructor(
} }
// when one field changed, all have to be sent or they unchanged ones would get overridden // when one field changed, all have to be sent or they unchanged ones would get overridden
val fieldsUnchanged = oldProfileData?.source?.fields == newProfileData.fields val fieldsUnchanged = oldProfileAccount?.source?.fields == newProfileData.fields
val field1 = calculateFieldToUpdate(newProfileData.fields.getOrNull(0), fieldsUnchanged) val field1 = calculateFieldToUpdate(newProfileData.fields.getOrNull(0), fieldsUnchanged)
val field2 = calculateFieldToUpdate(newProfileData.fields.getOrNull(1), fieldsUnchanged) val field2 = calculateFieldToUpdate(newProfileData.fields.getOrNull(1), fieldsUnchanged)
val field3 = calculateFieldToUpdate(newProfileData.fields.getOrNull(2), fieldsUnchanged) val field3 = calculateFieldToUpdate(newProfileData.fields.getOrNull(2), fieldsUnchanged)
val field4 = calculateFieldToUpdate(newProfileData.fields.getOrNull(3), fieldsUnchanged) val field4 = calculateFieldToUpdate(newProfileData.fields.getOrNull(3), fieldsUnchanged)
return EncodedProfileData( return DiffProfileData(
displayName, note, locked, field1, field2, field3, field4, header, avatar displayName, note, locked, field1, field2, field3, field4, header, avatar
) )
} }
@ -215,7 +215,7 @@ class EditProfileViewModel @Inject constructor(
return File(application.cacheDir, filename) return File(application.cacheDir, filename)
} }
private data class EncodedProfileData( private data class DiffProfileData(
val displayName: RequestBody?, val displayName: RequestBody?,
val note: RequestBody?, val note: RequestBody?,
val locked: RequestBody?, val locked: RequestBody?,
@ -226,7 +226,7 @@ class EditProfileViewModel @Inject constructor(
val header: MultipartBody.Part?, val header: MultipartBody.Part?,
val avatar: MultipartBody.Part? val avatar: MultipartBody.Part?
) { ) {
fun allFieldsAreNull() = displayName == null && note == null && locked == null && fun hasNoChanges() = displayName == null && note == null && locked == null &&
avatar == null && header == null && field1 == null && field2 == null && avatar == null && header == null && field1 == null && field2 == null &&
field3 == null && field4 == null field3 == null && field4 == null
} }