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

fix: 추억 생성 및 수정 썸네일 사진 업로드 오류 수정 #535 #542

Merged
merged 20 commits into from
Nov 20, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
01e24e9
fix: 추억 생성 사진 업로드 버그 수정
hxeyexn Oct 30, 2024
fe9f38d
fix: 추억 수정 사진 업로드 버그 수정
hxeyexn Oct 30, 2024
a33ba04
refactor: ThumbnailUiModel 구현 및 적용
hxeyexn Oct 31, 2024
993e26d
refactor: 썸네일 사진용 BindingAdapters 수정
hxeyexn Oct 31, 2024
97e73b1
refactor: 추억 생성 사진 업로드 로직 변경
hxeyexn Nov 1, 2024
8ec98e1
refactor: 추억 수정 사진 업로드 로직 변경
hxeyexn Nov 1, 2024
1e86b27
style: MemoryUpdateViewModel 메서드 순서 변경
hxeyexn Nov 1, 2024
7172173
refactor: fetchThumbnail의 thumbnailUri 매개변수 이름 변경
hxeyexn Nov 1, 2024
9ccacec
Merge branch 'develop' into feature/#535_fix_upload_memory_thumbnail
hxeyexn Nov 7, 2024
0b9dff5
refactor: 사용하지 않는 ThumbnailUiModel 갱신 메서드 제거
hxeyexn Nov 7, 2024
d08dcca
refactor: 추억 썸네일 uri를 칭하는 typealias 이름 변경
hxeyexn Nov 12, 2024
499b185
refactor: thumbnailUrl 설정 메서드의 매개변수 타입 변경
hxeyexn Nov 12, 2024
863b9be
refactor: 추억 썸네일 uri 수정 메서드 이름 변경
hxeyexn Nov 12, 2024
7a1bebc
refactor: 새로운 uri인지 확인하는 로직을 메서드로 분리
hxeyexn Nov 12, 2024
27ecb45
refactor: ThumbnailUiModel 초기화 메서드 이름 변경
hxeyexn Nov 13, 2024
c0f5458
refactor: Thumbnail 삭제 메서드 이름 변경
hxeyexn Nov 13, 2024
382d063
refactor: uri 설정 메서드의 url 매개변수 제거
hxeyexn Nov 13, 2024
9e028d2
refactor: 추억 썸네일 사진 업로드 후 job을 반환하는 메서드명 변경
hxeyexn Nov 13, 2024
e35c751
Merge branch 'develop' into feature/#535_fix_upload_memory_thumbnail
hxeyexn Nov 19, 2024
fa613e6
refactor: 사진 업로드 작업 취소 시 isActive 상태 확인
hxeyexn Nov 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.on.staccato.presentation.bindingadapter

import android.net.Uri
import android.view.View
import android.view.ViewGroup
import android.widget.ScrollView
import androidx.databinding.BindingAdapter
import com.on.staccato.presentation.memorycreation.ThumbnailUiModel
import com.on.staccato.presentation.timeline.model.TimelineUiModel

@BindingAdapter("visibleOrGone")
Expand All @@ -24,26 +24,20 @@ fun ScrollView.setScrollToBottom(isScrollable: Boolean) {
}
}

@BindingAdapter(value = ["visibilityByEmptyThumbnailUri", "visibilityByEmptyThumbnailUrl"])
fun View.setThumbnailVisibility(
thumbnailUri: Uri?,
thumbnailUrl: String?,
) {
@BindingAdapter(value = ["visibilityByEmptyThumbnail"])
fun View.setThumbnailVisibility(thumbnail: ThumbnailUiModel) {
visibility =
if (thumbnailUri == null && thumbnailUrl == null) {
if (thumbnail.uri == null && thumbnail.url == null) {
View.VISIBLE
} else {
View.GONE
}
}

@BindingAdapter(value = ["loadingVisibilityByThumbnailUri", "visibilityByEmptyThumbnailUrl"])
fun View.setThumbnailLoadingVisibility(
thumbnailUri: Uri?,
thumbnailUrl: String?,
) {
@BindingAdapter(value = ["loadingVisibilityByThumbnail"])
fun View.setThumbnailLoadingVisibility(thumbnail: ThumbnailUiModel) {
visibility =
if (thumbnailUri != null && thumbnailUrl == null) {
if (thumbnail.uri != null && thumbnail.url == null) {
View.VISIBLE
} else {
View.GONE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,12 @@ class MemoryCreationActivity :

override fun onImageDeletionClicked() {
currentSnackBar?.dismiss()
viewModel.setThumbnailUri(null)
viewModel.setThumbnailUrl(null)
viewModel.deleteThumbnail()
}

override fun onUrisSelected(vararg uris: Uri) {
currentSnackBar?.dismiss()
viewModel.createThumbnailUrl(this, uris.first())
viewModel.setThumbnailUri(uris.first())
}

private fun buildDateRangePicker() =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.on.staccato.presentation.memorycreation

import android.net.Uri

data class ThumbnailUiModel(
val uri: Uri? = null,
val url: String? = null,
) {
fun updateUrl(newUrl: String?): ThumbnailUiModel = this.copy(url = newUrl)

fun isEqualUri(newUri: Uri?): Boolean = uri == newUri

fun delete() = this.copy(uri = null, url = null)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사소한 부분인데, delete는 컬렉션의 원소나 인스턴스 자체를 삭제하는 동작을 연상시킨다고 생각해요!
ThumbnailUiModeluri와 url 정보를 모두 null로 설정해 값을 비운다는 의미를 더 명확하게 나타내기 위해 clear라는 함수명은 어떠신가요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete 보다 clear라는 네이밍이 더 적합하겠네요! clear로 변경했습니다!

반영 커밋 : 27ecb45

}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추억 썸네일의 이미지 uri 와 url 을 가지고 있는 UiModel을 새로 만들어주신 덕분에 보일러 플레이트 코드가 많이 줄어들었네요! 무척 좋은 구현인 것 같습니다 😄

Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,16 @@ import com.on.staccato.presentation.common.MutableSingleLiveData
import com.on.staccato.presentation.common.SingleLiveData
import com.on.staccato.presentation.memorycreation.DateConverter.convertLongToLocalDate
import com.on.staccato.presentation.memorycreation.MemoryCreationError
import com.on.staccato.presentation.memorycreation.ThumbnailUiModel
import com.on.staccato.presentation.util.convertMemoryUriToFile
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import java.time.LocalDate
import javax.inject.Inject

private typealias URI = Uri
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추억 생성, 수정 ViewModel에서 Uri 에 대한 typealias를 지정하신 이유가 무엇인가요?? (순수 궁금증입니다!)

Copy link
Contributor Author

@hxeyexn hxeyexn Nov 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Map 자료형을 사용할 때 key와 value가 의미하는 것을 명시적으로 나타내기 위해 typealias를 자주 활용하는 편입니다.
mutableMapOf<String, String>()과 같이 선언하면 key와 value의 값이 의미하는 것을 추측하기 힘들어요.

위 코드도 그런 이유로 typealias를 지정해두었는데 네이밍을 고민하다가 마땅한 네이밍이 떠오르지 않아서 임시로 적어두고 나중에 바꾼다는 걸 까먹었네요..! ThumbnailUri라는 이름으로 변경했습니다!

반영 커밋 : d08dcca


@HiltViewModel
class MemoryCreationViewModel
@Inject
Expand All @@ -36,6 +40,7 @@ class MemoryCreationViewModel
) : ViewModel() {
val title = ObservableField<String>()
val description = ObservableField<String>()
val isPeriodActive = MutableLiveData<Boolean>(false)

private val _startDate = MutableLiveData<LocalDate?>(null)
val startDate: LiveData<LocalDate?> get() = _startDate
Expand All @@ -46,51 +51,34 @@ class MemoryCreationViewModel
private val _createdMemoryId = MutableLiveData<Long>()
val createdMemoryId: LiveData<Long> get() = _createdMemoryId

private val _thumbnailUri = MutableLiveData<Uri?>(null)
val thumbnailUri: LiveData<Uri?> get() = _thumbnailUri

private val _thumbnailUrl = MutableLiveData<String?>(null)
val thumbnailUrl: LiveData<String?> get() = _thumbnailUrl
private val _thumbnail = MutableLiveData<ThumbnailUiModel>(ThumbnailUiModel())
val thumbnail: LiveData<ThumbnailUiModel> get() = _thumbnail

private val _isPosting = MutableLiveData<Boolean>(false)
val isPosting: LiveData<Boolean> get() = _isPosting

private val _isPhotoPosting = MutableLiveData<Boolean>(false)
val isPhotoPosting: LiveData<Boolean> get() = _isPhotoPosting

val isPeriodActive = MutableLiveData<Boolean>(false)

private val _errorMessage = MutableLiveData<String>()
val errorMessage: LiveData<String> get() = _errorMessage

private val _error = MutableSingleLiveData<MemoryCreationError>()
val error: SingleLiveData<MemoryCreationError> get() = _error

private val thumbnailJobs = mutableMapOf<URI, Job>()

fun createThumbnailUrl(
context: Context,
thumbnailUri: Uri,
uri: Uri,
) {
_thumbnailUri.value = thumbnailUri
_isPhotoPosting.value = true
val thumbnailFile = convertMemoryUriToFile(context, thumbnailUri, name = MEMORY_FILE_NAME)
viewModelScope.launch {
val result: ResponseResult<ImageResponse> =
imageRepository.convertImageFileToUrl(thumbnailFile)
result.onSuccess(::setThumbnailUrl)
.onServerError(::handlePhotoError)
.onException { e, message ->
handlePhotoException(e, message, thumbnailUri)
}
}
}

fun setThumbnailUri(thumbnailUri: Uri?) {
_thumbnailUri.value = thumbnailUri
createThumbnail(uri)
registerThumbnailJob(context, uri)
}

fun setThumbnailUrl(imageResponse: ImageResponse?) {
_thumbnailUrl.value = imageResponse?.imageUrl
_isPhotoPosting.value = false
fun deleteThumbnail() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 함수명도 마찬가지로 clearThumbnail이 어떨까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반영했습니다!

반영 커밋 : c0f5458

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가로, 사진의 X 버튼이 눌렸을 때에도 리소스 관리를 위해 Job.cancel을 수행해야 한다는 생각이 드네요!
thumbnailJobs[_thumbnail.value?.uri]?.cancel() 로직을 deleteThumbnail() 내부로 옮기는 건 어떨까요?

Copy link
Contributor Author

@hxeyexn hxeyexn Nov 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추억 생성 및 수정 화면에서는 사진이 업로드 중일 때 X 버튼이 보여지지 않도록 구현되어 있습니다!
즉, 서버에 사진을 업로드하고 해당 사진의 URL을 서버에서 클라이언트로 전송하는 작업이 완료되어야 사용자가 X 버튼을 사용할 수 있습니다.

따라서 X 버튼이 사용자에게 보여진 시점에는 job이 마지막 상태인 Completed에 도달해 invokeOnCompletion에 의해 자원이 이미 해제된 상태이기 때문에 추가적으로 Job.cancel을 수행할 필요가 없다고 생각했습니다! 😊

Copy link
Member

@s6m1n s6m1n Nov 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하ㅋㅋ 제가 스타카토 생성/수정 화면이랑 헷갈렸네요! 좋습니다~

_thumbnail.value = thumbnail.value?.delete()
}

fun setMemoryPeriod(
Expand All @@ -114,13 +102,58 @@ class MemoryCreationViewModel
}
}

private fun createThumbnail(
uri: Uri?,
url: String? = null,
) {
val isEqualUri: Boolean? = _thumbnail.value?.isEqualUri(uri)
if (isEqualUri == false) {
thumbnailJobs[_thumbnail.value?.uri]?.cancel()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래 두 경우, Job.cancel()을 호출해도 코루틴이 이를 수신할 수 없어 즉시 취소되지 않습니다!

  • 코루틴에 suspend 포인트가 없는 경우
  • isActive를 확인하지 않는 경우

이렇게 내부적으로 취소될 수 없는 상태인 경우를 고려해 저는 Job.cancel()을 호출하기 전에 isActive로 수동으로 상태를 확인해주곤 하는데요!

            if (photoJobs[deletedPhoto.uri.toString()]?.isActive == true) {
                photoJobs[deletedPhoto.uri.toString()]?.cancel()
            }

Retrofit2 interface에서 지원하는 코루틴은 취소될 수 있는 코루틴일 것 같아 이 과정이 불필요한가? 싶기도 하네요 🤔
시간 되면 같이 '얕게 다이브' 해봐도 좋을 것 같아요!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 이 부분을 놓쳤네요!! 감사합니다~ 빙빙 짱!
isActive를 수동으로 상태를 확인하는 방법으로 변경했습니다!

반영 커밋 : fa613e6

Copy link
Contributor Author

@hxeyexn hxeyexn Nov 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retrofit2 interface에서 지원하는 코루틴은 취소될 수 있는 코루틴일 것 같아 이 과정이 불필요한가? 싶기도 하네요 🤔

이와 관련해서 Retrofit2의 내부 구현을 찾아 봤는 데 아직 이해가 잘 안 되네요 ㅠㅠ
빙티와 호두의 면접이 끝나고 난 후에 같이 '얕게 다이브' 해보면 좋겠네요!!

_thumbnail.value = ThumbnailUiModel(uri = uri, url = url)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

덧붙여서, private fun createThumbnail()의 url 매개 변수는 항상 null이 되겠네요.

        fun createThumbnailUrl(
            context: Context,
            uri: Uri,
        ) {
            _isPhotoPosting.value = true
            createThumbnail(uri) // uri만 넣어주고 있음. url은 항상 default인 null
            registerThumbnailJob(context, uri)
        }

그렇다면 url 매개변수를 제거하고 아래처럼 null을 직접 넣어주는 것이 더 명시적일 것 같아요~!

Suggested change
_thumbnail.value = ThumbnailUiModel(uri = uri, url = url)
_thumbnail.value = ThumbnailUiModel(uri = uri, url = null)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 그렇네요! 수정했습니다~

반영 커밋 : 382d063

}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

업로드하려는 Thumbnailuri가 동일한지 확인하여, 다른 uri인 경우에만 새로운 Thumbnail로 변경해주는 동작을 하는군요! 👍
메서드 이름을 바꾸면 내부 동작이 조금 더 잘 이해될 것 같아요.

저도 마땅히 생각나지는 않지만, checkEqualAndSetUri, 또는 단순히 새로운 Thumbnail로 바꾼다는setThumbnail 라는 네이밍은 어떤가요?

Copy link
Contributor

@Junyoung-WON Junyoung-WON Nov 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가로 기존 Uri와 다른 Uri인지 확인하는 코드를 아래처럼 메서드로 분리하면 코드가 좀 더 깔끔해질 것 같아요!

Suggested change
private fun createThumbnail(
uri: Uri?,
url: String? = null,
) {
val isEqualUri: Boolean? = _thumbnail.value?.isEqualUri(uri)
if (isEqualUri == false) {
thumbnailJobs[_thumbnail.value?.uri]?.cancel()
_thumbnail.value = ThumbnailUiModel(uri = uri, url = url)
}
}
private fun createThumbnail(
uri: Uri?,
url: String? = null,
) {
if (isDifferentUri(uri)) {
thumbnailJobs[_thumbnail.value?.uri]?.cancel()
_thumbnail.value = ThumbnailUiModel(uri = uri, url = url)
}
}
private fun isDifferentUri(uri: Uri?): Boolean = _thumbnail.value?.isEqualUri(uri) == false

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 호두의 의견에 동의합니다~

새로운 Thumbnail로 바꾼다는 setThumbnail 라는 네이밍은 어떤가요?

조금 더 구체적으로, Uri만 바꿔준다는 의미까지 포함해 fun setThumbnailUri()도 괜찮을 것 같아요!

Copy link
Contributor Author

@hxeyexn hxeyexn Nov 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

조금 더 구체적으로, Uri만 바꿔준다는 의미까지 포함해 fun setThumbnailUri()도 괜찮을 것 같아요!

해당 메서드는 Uri만 변경해주는 역할이라 빙티가 제안해주신 setThumbnailUri가 가장 명시적으로 다가오네요!
반영해두었습니다😊

반영 커밋 : 863b9be

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가로 기존 Uri와 다른 Uri인지 확인하는 코드를 아래처럼 메서드로 분리하면 코드가 좀 더 깔끔해질 것 같아요!

변수로 분리하는 것보다 메서드로 분리하는 게 더 깔끔하겠네요!

    private fun setThumbnailUri(
        uri: Uri?,
        url: String? = null,
    ) {
        if (isNewUri(uri)) {
          ...
        }
    }
    
    private fun isNewUri(uri: Uri?): Boolean = _thumbnail.value?.isEqualUri(uri) == false

매개변수로 들어온 Uri가 새로운 Uri일 때 uri를 설정한다는 것을 명시적으로 나타내기 위해 isNewUri라는 메서드명으로 분리했습니다!

반영 커밋 : 7a1bebc


private fun registerThumbnailJob(
context: Context,
uri: Uri,
) {
val job = fetchThumbnail(context, uri)
job.invokeOnCompletion {
thumbnailJobs.remove(uri)
}
thumbnailJobs[uri] = job
}

private fun fetchThumbnail(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추억 썸네일을 업로드하는 Job을 생성하고 반환해주는 메서드로 역할이 바뀌었으니, createJobFetchingThumbnail 와 같이 Job에 대한 메서드임을 나타내는 것도 좋을 것 같아요!
해나는 어떻게 생각하시나요??

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

호두가 제안해주신 이름은 "fetching thumbnail를 수행하는 job을 생성한다"라는 의미를 더 명확하게 전달한다는 점에서 저도 동의합니다!

더해서, 함수 명의 구조를 동사 + 목적어 형태로 하기 위해 createFetchingThumbnailJob도 좋을 것 같아요~

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

서버에서 데이터를 불러올 때 fetchXXX 형식을 사용하기로 해서 fetchThumbnail로 네이밍 했었습니다.
지금은 썸네일 사진 업로드 Job 객체를 반환하는 역할도 포함하고 있기 때문에, 단순히 데이터를 불러오는 작업만 수행한다고 볼 수 없겠네요!

createFetchingThumbnailJob로 변경했습니다!

반영 커밋 : 9e028d2

context: Context,
uri: Uri,
): Job {
val thumbnailFile = convertMemoryUriToFile(context, uri, name = MEMORY_FILE_NAME)
return viewModelScope.launch {
val result: ResponseResult<ImageResponse> =
imageRepository.convertImageFileToUrl(thumbnailFile)
result
.onSuccess(::setThumbnailUrl)
.onServerError(::handlePhotoError)
.onException { e, message ->
handlePhotoException(e, message, uri)
}
}
}

private fun setThumbnailUrl(imageResponse: ImageResponse?) {
val newUrl = imageResponse?.imageUrl
_thumbnail.value = _thumbnail.value?.updateUrl(newUrl)
_isPhotoPosting.value = false
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미지 삭제 버튼 클릭 시, Activity가 이미지 Urlnull 로 설정하기 위해서 ImageResponsenullable로 두었었지만,
지금은 ThumbnailUiModel의 도입과 함께 해당 메서드가 Activity에서 사용되지 않으므로, nullable로 둘 이유가 사라졌네요!

nullable을 지워도 될 것 같습니다 😃

Suggested change
private fun setThumbnailUrl(imageResponse: ImageResponse?) {
val newUrl = imageResponse?.imageUrl
_thumbnail.value = _thumbnail.value?.updateUrl(newUrl)
_isPhotoPosting.value = false
}
private fun setThumbnailUrl(imageResponse: ImageResponse) {
val newUrl = imageResponse.imageUrl
_thumbnail.value = _thumbnail.value?.updateUrl(newUrl)
_isPhotoPosting.value = false
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ThumbnailUiModel 구현 후 이를 적용하는 과정에서 매개변수의 타입 변경을 놓쳤었는데, ImageResponse를 nullable로 둔 이유를 호두가 저에게 질문해 줘서 해당 부분을 짚고 넘어갈 수 있었습니다. 감사합니다!

반영 커밋 : 499b185

private fun setCreatedMemoryId(memoryCreationResponse: MemoryCreationResponse) {
_createdMemoryId.value = memoryCreationResponse.memoryId
}

private fun makeNewMemory() =
NewMemory(
memoryThumbnailUrl = thumbnailUrl.value,
memoryThumbnailUrl = _thumbnail.value?.url,
memoryTitle = title.get() ?: throw IllegalArgumentException(),
startAt = getDateByPeriodSetting(startDate),
endAt = getDateByPeriodSetting(endDate),
Expand All @@ -145,9 +178,11 @@ class MemoryCreationViewModel
private fun handlePhotoException(
e: Throwable,
message: String,
thumbnailUri: Uri,
uri: Uri,
) {
_error.setValue(MemoryCreationError.Thumbnail(message, thumbnailUri))
if (thumbnailJobs[uri]?.isActive == true) {
_error.setValue(MemoryCreationError.Thumbnail(message, uri))
}
}

private fun handleCreateServerError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,11 @@ class MemoryUpdateActivity :

override fun onPhotoDeletionClicked() {
currentSnackBar?.dismiss()
viewModel.setThumbnailUri(null)
viewModel.setThumbnailUrl(null)
viewModel.deleteThumbnail()
}

override fun onUrisSelected(vararg uris: Uri) {
currentSnackBar?.dismiss()
viewModel.setThumbnailUri(uris.first())
viewModel.createThumbnailUrl(this, uris.first())
}

Expand Down
Loading
Loading