Skip to content

Commit

Permalink
feat(PublicSharePassword): Add logic to submit password
Browse files Browse the repository at this point in the history
  • Loading branch information
FabianDevel committed Sep 16, 2024
1 parent 4a7f8a9 commit f04400c
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,8 @@ class PublicShareActivity : AppCompatActivity() {
}

fun getMainButton() = binding.mainPublicShareButton

companion object {
const val PUBLIC_SHARE_TAG = "publicShare"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class PublicShareListFragment : FileListFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

if (publicShareViewModel.isPasswordNeeded) {
if (publicShareViewModel.isPasswordNeeded && !publicShareViewModel.hasBeenAuthenticated) {
safeNavigate(PublicShareListFragmentDirections.actionPublicShareListFragmentToPublicSharePasswordFragment())
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,80 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.infomaniak.drive.R
import com.infomaniak.drive.data.api.ErrorCode
import com.infomaniak.drive.databinding.FragmentPublicSharePasswordBinding
import com.infomaniak.lib.core.utils.safeBinding
import com.infomaniak.drive.ui.publicShare.PublicShareActivity.Companion.PUBLIC_SHARE_TAG
import com.infomaniak.lib.core.api.ApiController
import com.infomaniak.lib.core.models.ApiError
import com.infomaniak.lib.core.utils.*
import com.infomaniak.lib.core.utils.SnackbarUtils.showSnackbar

class PublicSharePasswordFragment : Fragment() {

private var binding: FragmentPublicSharePasswordBinding by safeBinding()
private val publicShareViewModel: PublicShareViewModel by activityViewModels()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return FragmentPublicSharePasswordBinding.inflate(inflater, container, false).also { binding = it }.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(binding) {
super.onViewCreated(view, savedInstanceState)

setupValidationButton()

publicSharePasswordEditText.addTextChangedListener { publicSharePasswordLayout.error = null }
}

private fun setupValidationButton() = with(binding.passwordValidateButton) {
initProgress(viewLifecycleOwner)
setOnClickListener {
if (isFieldBlank()) return@setOnClickListener

showProgressCatching()
val password = binding.publicSharePasswordEditText.text?.trim().toString()
publicShareViewModel.submitPublicSharePassword(password).observe(viewLifecycleOwner) { isAuthorized ->
if (isAuthorized == true) {
publicShareViewModel.hasBeenAuthenticated = true
publicShareViewModel.initPublicShare(::onInitSuccess, ::onInitError)
} else {
hideProgressCatching(R.string.buttonValid)
binding.publicSharePasswordEditText.text = null
binding.publicSharePasswordLayout.error = getString(R.string.wrongPdfPassword)
}
}
}
}

private fun onInitSuccess(fileId: Int?) {
binding.passwordValidateButton.hideProgressCatching(R.string.buttonValid)
safeNavigate(
PublicSharePasswordFragmentDirections.actionPublicSharePasswordFragmentToPublicShareListFragment(
fileId = fileId ?: -1,
)
)
}

private fun onInitError(error: ApiError?) = with(binding) {
passwordValidateButton.hideProgressCatching(R.string.buttonValid)
when {
error?.exception is ApiController.NetworkException -> {
showSnackbar(R.string.errorNetwork, anchor = passwordValidateButton)
}
error?.code == ErrorCode.PASSWORD_NOT_VALID -> {
showSnackbar(R.string.wrongPdfPassword, anchor = passwordValidateButton)
}
else -> SentryLog.e(PUBLIC_SHARE_TAG, "downloadSharedFile: ${error?.code}")
}
}

private fun isFieldBlank(): Boolean {
return binding.publicSharePasswordEditText.text.isNullOrBlank().also { isBlank ->
if (isBlank) binding.publicSharePasswordLayout.error = getString(R.string.allEmptyInputError)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,7 @@ package com.infomaniak.drive.ui.publicShare
import android.content.Context
import android.content.Intent
import androidx.core.content.FileProvider
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.*
import com.infomaniak.drive.R
import com.infomaniak.drive.data.api.ApiRepository
import com.infomaniak.drive.data.api.CursorApiResponse
Expand All @@ -37,6 +34,8 @@ import com.infomaniak.drive.utils.Utils.openWith
import com.infomaniak.drive.utils.printPdf
import com.infomaniak.drive.utils.saveToKDrive
import com.infomaniak.drive.utils.shareFile
import com.infomaniak.lib.core.models.ApiError
import com.infomaniak.lib.core.models.ApiResponseStatus
import com.infomaniak.lib.core.utils.SentryLog
import com.infomaniak.lib.core.utils.SingleLiveEvent
import kotlinx.coroutines.*
Expand All @@ -48,6 +47,7 @@ class PublicShareViewModel(val savedStateHandle: SavedStateHandle) : ViewModel()
var fileClicked: File? = null
val downloadProgressLiveData = MutableLiveData(0)
val buildArchiveResult = SingleLiveEvent<Pair<Int?, ArchiveUUID?>>()
var hasBeenAuthenticated = false

val driveId: Int
inline get() = savedStateHandle[PublicShareActivityArgs::driveId.name] ?: ROOT_SHARED_FILE_ID
Expand All @@ -64,6 +64,20 @@ class PublicShareViewModel(val savedStateHandle: SavedStateHandle) : ViewModel()
private var getPublicShareFilesJob: Job = Job()
private var currentCursor: String? = null

fun initPublicShare(onSuccess: (Int?) -> Unit, onError: (ApiError?) -> Unit) = viewModelScope.launch(Dispatchers.IO) {
val apiResponse = ApiRepository.getPublicShareInfo(driveId, publicShareUuid)
Dispatchers.Main {
when (apiResponse.result) {
ApiResponseStatus.SUCCESS -> apiResponse.data?.let { onSuccess(it.fileId) } ?: onError(null)
else -> onError(apiResponse.error)
}
}
}

fun submitPublicSharePassword(password: String) = liveData(Dispatchers.IO) {
emit(ApiRepository.submitPublicSharePassword(driveId, publicShareUuid, password).data)
}

fun downloadPublicShareRootFile() = viewModelScope.launch(Dispatchers.IO) {
val file = if (fileId == ROOT_SHARED_FILE_ID) {
rootSharedFile.value
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/layout/fragment_public_share_password.xml
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@
style="@style/ButtonInfomaniak"
android:layout_width="0dp"
android:layout_marginBottom="@dimen/marginStandardMedium"
android:enabled="false"
android:text="@string/buttonValid"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/end"
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/res/navigation/public_share_navigation.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@
<fragment
android:id="@+id/publicSharePasswordFragment"
android:name="com.infomaniak.drive.ui.publicShare.PublicSharePasswordFragment"
tools:layout="@layout/fragment_public_share_password" />
tools:layout="@layout/fragment_public_share_password">
<action
android:id="@+id/action_publicSharePasswordFragment_to_publicShareListFragment"
app:destination="@id/publicShareListFragment" />
</fragment>

<fragment
android:id="@+id/publicShareListFragment"
Expand Down

0 comments on commit f04400c

Please sign in to comment.