diff --git a/holder/build.gradle b/holder/build.gradle index e3ca5fd23..6a6c08827 100644 --- a/holder/build.gradle +++ b/holder/build.gradle @@ -180,7 +180,6 @@ dependencies { implementation project(":introduction") implementation project(":api") implementation project(':mobilecore') - implementation project(":qrscanner") implementation project(":modules:luhncheck") implementation project(":modules:qrgenerator") implementation project(":modules:openidconnect") diff --git a/holder/src/main/AndroidManifest.xml b/holder/src/main/AndroidManifest.xml index da889f0e9..4ed7144b5 100644 --- a/holder/src/main/AndroidManifest.xml +++ b/holder/src/main/AndroidManifest.xml @@ -3,11 +3,6 @@ xmlns:tools="http://schemas.android.com/tools"> - - - { - // Trigger custom dispatcher in destination - requireActivity().onBackPressedDispatcher.onBackPressed() - return@setNavigationOnClickListener - } } NavigationUI.navigateUp(navController, null) diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataExportUseCase.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataExportUseCase.kt deleted file mode 100644 index 0a11fbe33..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataExportUseCase.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import nl.rijksoverheid.ctr.api.json.Base64JsonAdapter -import nl.rijksoverheid.ctr.persistence.database.HolderDatabase - -interface DataExportUseCase { - suspend fun export(): List -} - -class DataExportUseCaseImpl( - private val holderDatabase: HolderDatabase, - private val moshi: Moshi, - private val stringDataZipper: StringDataZipper -) : DataExportUseCase { - override suspend fun export(): List { - val eventsGroups = holderDatabase.eventGroupDao().getAll().filter { !it.draft } - val eventGroupParcels = eventsGroups.map { - EventGroupParcel( - jsonData = it.jsonData - ) - } - val parameterizedType = - Types.newParameterizedType(List::class.java, EventGroupParcel::class.java) - val adapter: JsonAdapter> = moshi.adapter(parameterizedType) - val json = adapter.toJson(eventGroupParcels) - - val compressed = stringDataZipper.zip(json) - - val base64JsonAdapter = Base64JsonAdapter() - val base64 = base64JsonAdapter.toBase64(compressed) - - val compChunks = base64.chunked(maxPackageSize) - - val migrationParcelAdapter = moshi.adapter(MigrationParcel::class.java) - return compChunks.map { - val parcel = MigrationParcel( - index = compChunks.indexOf(it), - numberOfPackages = compChunks.size, - payload = it, - version = version - ) - base64JsonAdapter.toBase64(migrationParcelAdapter.toJson(parcel).toByteArray()) - } - } - - companion object { - const val version = "CC1" - const val maxPackageSize = 800 - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationImportUseCase.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationImportUseCase.kt deleted file mode 100644 index def49d31d..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationImportUseCase.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import nl.rijksoverheid.ctr.api.json.Base64JsonAdapter - -interface DataMigrationImportUseCase { - suspend fun import(content: String): MigrationParcel? - suspend fun merge(migrationParcels: List): List -} - -class DataMigrationImportUseCaseImpl( - private val moshi: Moshi, - private val stringDataZipper: StringDataZipper -) : DataMigrationImportUseCase { - - private val base64JsonAdapter = Base64JsonAdapter() - - override suspend fun import(content: String): MigrationParcel? { - val decodedContent = base64JsonAdapter.fromBase64(content) - - val migrationParcelAdapter = moshi.adapter(MigrationParcel::class.java) - - return migrationParcelAdapter.fromJson(String(decodedContent)) - } - - override suspend fun merge(migrationParcels: List): List { - val mergedMigrationParcel = - migrationParcels.sortedBy { it.index }.map { base64JsonAdapter.fromBase64(it.payload) } - .reduce { acc, bytes -> acc + bytes } - - val uncompressed = stringDataZipper.unzip(mergedMigrationParcel) - - val parameterizedType = - Types.newParameterizedType(List::class.java, EventGroupParcel::class.java) - val adapter: JsonAdapter> = moshi.adapter(parameterizedType) - - val eventGroupParcels = adapter.fromJson(uncompressed) - - return eventGroupParcels ?: emptyList() - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationInstructionsFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationInstructionsFragment.kt deleted file mode 100644 index 6daab3efd..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationInstructionsFragment.kt +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import android.annotation.SuppressLint -import android.content.Context -import android.content.pm.ActivityInfo -import android.hardware.camera2.CameraAccessException -import android.hardware.camera2.CameraManager -import android.os.Bundle -import android.view.View -import android.view.WindowManager -import android.widget.ScrollView -import androidx.activity.OnBackPressedCallback -import androidx.fragment.app.Fragment -import androidx.navigation.Navigation -import androidx.navigation.fragment.navArgs -import androidx.viewpager2.widget.ViewPager2 -import nl.rijksoverheid.ctr.design.fragments.ErrorResultFragment -import nl.rijksoverheid.ctr.holder.BuildConfig -import nl.rijksoverheid.ctr.holder.HolderMainActivityViewModel -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.introduction.databinding.FragmentOnboardingBinding -import nl.rijksoverheid.ctr.introduction.onboarding.OnboardingPagerAdapter -import nl.rijksoverheid.ctr.persistence.PersistenceManager -import nl.rijksoverheid.ctr.shared.ext.findNavControllerSafety -import nl.rijksoverheid.ctr.shared.ext.navigateSafety -import nl.rijksoverheid.ctr.shared.livedata.EventObserver -import nl.rijksoverheid.ctr.shared.models.ErrorResultFragmentData -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.sharedViewModel - -class DataMigrationInstructionsFragment : Fragment(R.layout.fragment_onboarding) { - - private var _binding: FragmentOnboardingBinding? = null - private val binding get() = _binding!! - - private val args: DataMigrationInstructionsFragmentArgs by navArgs() - private val persistenceManager: PersistenceManager by inject() - - private val holderMainActivityViewModel: HolderMainActivityViewModel by sharedViewModel() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (BuildConfig.FLAVOR.lowercase().contains("prod")) { - requireActivity().window.setFlags( - WindowManager.LayoutParams.FLAG_SECURE, - WindowManager.LayoutParams.FLAG_SECURE - ) - } - - increaseBrightness() - } - - @SuppressLint("SourceLockedOrientationActivity") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - - _binding = FragmentOnboardingBinding.bind(view) - - val adapter = - OnboardingPagerAdapter( - childFragmentManager, - lifecycle, - args.instructionItems.toList() - ) - - binding.indicators.initIndicator(3) - initViewPager(adapter, savedInstanceState?.getInt(indicatorPositionKey)) - - setBackPressListener() - setBindings(adapter) - - holderMainActivityViewModel.navigateLiveData.observe(viewLifecycleOwner, EventObserver { - findNavControllerSafety()?.navigate(it) - }) - - holderMainActivityViewModel.navigateWithBundleLiveData.observe( - viewLifecycleOwner, - EventObserver { - navigateSafety(it.first, it.second) - }) - } - - private fun setBindings( - adapter: OnboardingPagerAdapter - ) { - binding.button.setOnClickListener { - val currentItem = binding.viewPager.currentItem - if (currentItem == adapter.itemCount - 1) { - if (args.destination is DataMigrationOnboardingItem.ScanQrCode) { - openScanner() - } else { - persistenceManager.setShowMigrationDialog(true) - navigateSafety(args.destination.navigationActionId) - } - } else { - binding.viewPager.currentItem = currentItem + 1 - } - } - } - - private fun openScanner() { - try { - val cameraManager = - requireActivity().getSystemService(Context.CAMERA_SERVICE) as CameraManager - if (cameraManager.cameraIdList.isNotEmpty()) { - Navigation.findNavController(requireActivity(), R.id.main_nav_host_fragment) - .navigate(R.id.action_data_migration_scan_qr) - } else { - showNoCameraError() - } - } catch (exception: CameraAccessException) { - showNoCameraError() - } - } - - private fun showNoCameraError() { - navigateSafety( - R.id.action_error_result, - ErrorResultFragment.getBundle( - ErrorResultFragmentData( - title = getString(R.string.add_paper_proof_no_camera_error_header), - description = getString(R.string.add_paper_proof_no_camera_error_description), - buttonTitle = getString(R.string.back_to_overview), - buttonAction = ErrorResultFragmentData.ButtonAction.Destination(R.id.action_my_overview) - ) - ) - ) - } - - private fun setBackPressListener() { - requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : - OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - val currentItem = binding.viewPager.currentItem - if (currentItem == 0) { - findNavControllerSafety()?.popBackStack() - } else { - binding.viewPager.currentItem = binding.viewPager.currentItem - 1 - } - } - }) - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - _binding?.let { - outState.putInt(indicatorPositionKey, it.viewPager.currentItem) - } - } - - private fun initViewPager( - adapter: OnboardingPagerAdapter, - startingItem: Int? = null - ) { - binding.viewPager.offscreenPageLimit = 2 - binding.viewPager.adapter = adapter - binding.viewPager.registerOnPageChangeCallback(object : - ViewPager2.OnPageChangeCallback() { - @SuppressLint("StringFormatInvalid") - override fun onPageSelected(position: Int) { - super.onPageSelected(position) - - binding.button.text = if (position == 2) { - getString(R.string.holder_startMigration_onboarding_doneButton) - } else { - getString(R.string.holder_startMigration_onboarding_nextButton) - } - - binding.indicators.updateSelected(position) - - binding.indicators.contentDescription = getString( - nl.rijksoverheid.ctr.introduction.R.string.onboarding_page_indicator_label, - (position + 1).toString(), - adapter.itemCount.toString() - ) - - // Apply bottom elevation if the view inside the viewpager is scrollable - val scrollView = - childFragmentManager.fragments[position]?.view?.findViewById(nl.rijksoverheid.ctr.introduction.R.id.scroll) - if (scrollView?.canScrollVertically(1) == true) { - binding.bottom.cardElevation = - resources.getDimensionPixelSize(nl.rijksoverheid.ctr.introduction.R.dimen.scroll_view_button_elevation) - .toFloat() - } else { - binding.bottom.cardElevation = 0f - } - - if (args.instructionItems[position].clazz == DataMigrationShowQrCodeFragment::class.java) { - increaseBrightness() - } else { - resetBrightness() - } - } - }) - startingItem?.let { binding.viewPager.currentItem = it } - } - - fun increaseBrightness() { - val params = requireActivity().window.attributes - params?.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL - requireActivity().window.attributes = params - } - - private fun resetBrightness() { - val params = requireActivity().window.attributes - params?.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE - requireActivity().window.attributes = params - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - - resetBrightness() - - requireActivity().requestedOrientation = - ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED - } - - companion object { - private const val indicatorPositionKey = "indicator_position_key" - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationOnboardingItem.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationOnboardingItem.kt deleted file mode 100644 index e8d194b21..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationOnboardingItem.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import android.os.Parcelable -import androidx.annotation.IdRes -import androidx.annotation.StringRes -import kotlinx.parcelize.Parcelize -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.introduction.onboarding.models.OnboardingItem - -sealed class DataMigrationOnboardingItem( - @StringRes val title: Int, - @StringRes val descriptionResource: Int, - @IdRes val navigationActionId: Int -) : OnboardingItem( - titleResource = title, - description = descriptionResource -) { - @Parcelize - object ShowQrCode : DataMigrationOnboardingItem( - title = R.string.holder_startMigration_toOtherDevice_onboarding_step3_title, - descriptionResource = R.string.holder_startMigration_toOtherDevice_onboarding_step3_title, - navigationActionId = R.id.action_my_overview - ), Parcelable - - @Parcelize - object ScanQrCode : DataMigrationOnboardingItem( - title = R.string.holder_startMigration_toThisDevice_onboarding_step3_title, - descriptionResource = R.string.holder_startMigration_toThisDevice_onboarding_step3_title, - navigationActionId = R.id.action_data_migration_scan_qr - ), Parcelable -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationPayloadUseCase.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationPayloadUseCase.kt deleted file mode 100644 index aa372670b..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationPayloadUseCase.kt +++ /dev/null @@ -1,40 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import android.util.Base64 -import com.squareup.moshi.Moshi -import nl.rijksoverheid.ctr.holder.get_events.models.RemoteProtocol -import nl.rijksoverheid.ctr.holder.paper_proof.usecases.GetEventsFromPaperProofQrUseCase -import nl.rijksoverheid.ctr.holder.your_events.utils.SignedResponse -import org.json.JSONObject - -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -interface DataMigrationPayloadUseCase { - fun parsePayload(jsonData: ByteArray): RemoteProtocol? -} - -class DataMigrationPayloadUseCaseImpl( - private val moshi: Moshi, - private val getEventsFromPaperProofQrUseCase: GetEventsFromPaperProofQrUseCase -) : DataMigrationPayloadUseCase { - override fun parsePayload(jsonData: ByteArray): RemoteProtocol? { - val json = JSONObject(jsonData.decodeToString()) - - return if (json.has("credential")) { - // dcc - getEventsFromPaperProofQrUseCase.get(json.getString("credential")) - } else { - // non dcc - val payload = moshi.adapter(SignedResponse::class.java) - .fromJson(String(jsonData))?.payload - val decodedPayload = String(Base64.decode(payload, Base64.DEFAULT)) - return moshi.adapter(RemoteProtocol::class.java).fromJson(decodedPayload) - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrFragment.kt deleted file mode 100644 index 020b7c95a..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrFragment.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import android.os.Bundle -import android.view.View -import androidx.core.view.isVisible -import nl.rijksoverheid.ctr.design.fragments.ErrorResultFragment -import nl.rijksoverheid.ctr.holder.HolderMainActivityViewModel -import nl.rijksoverheid.ctr.holder.HolderMainFragment -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.models.HolderFlow -import nl.rijksoverheid.ctr.qrscanner.QrCodeScannerFragment -import nl.rijksoverheid.ctr.shared.ext.findNavControllerSafety -import nl.rijksoverheid.ctr.shared.factories.ErrorCodeStringFactory -import nl.rijksoverheid.ctr.shared.livedata.EventObserver -import nl.rijksoverheid.ctr.shared.models.ErrorResultFragmentData -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.sharedViewModel -import org.koin.androidx.viewmodel.ext.android.viewModel - -class DataMigrationScanQrFragment : QrCodeScannerFragment() { - - private val holderMainActivityViewModel: HolderMainActivityViewModel by sharedViewModel() - - private val viewModel: DataMigrationScanQrViewModel by viewModel() - - private val errorCodeStringFactory: ErrorCodeStringFactory by inject() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - viewModel.scanFinishedLiveData.observe(viewLifecycleOwner, EventObserver { - findNavControllerSafety()?.popBackStack() - - when (it) { - is DataMigrationScanQrState.Error -> holderMainActivityViewModel.navigateWithBundle( - DataMigrationInstructionsFragmentDirections.actionErrorResult().actionId, - ErrorResultFragment.getBundle( - ErrorResultFragmentData( - title = getString(R.string.error_something_went_wrong_title), - description = getString( - R.string.holder_migration_errorcode_message, - errorCodeStringFactory.get( - HolderFlow.Migration, - listOf(it.errorResult) - ) - ), - buttonTitle = getString(R.string.general_toMyOverview), - buttonAction = ErrorResultFragmentData.ButtonAction.Destination( - R.id.action_my_overview - ) - ) - ) - ) - is DataMigrationScanQrState.Success -> holderMainActivityViewModel.navigate( - navDirections = DataMigrationInstructionsFragmentDirections.actionYourEvents( - type = it.type, - toolbarTitle = "", - flow = HolderFlow.Migration - ) - ) - } - }) - - viewModel.progressBarLiveData.observe(viewLifecycleOwner) { - binding.progressBar.isVisible = true - binding.progressBar.progress = it.calculateProgressPercentage() - } - - (parentFragment?.parentFragment as? HolderMainFragment)?.getToolbar()?.isVisible = false - - binding.extraContentMessage.postDelayed({ - if (isAdded) { - val defaultMessage = getString(R.string.holder_startMigration_toThisDevice_onboarding_step3_messageKeepPointing) - val extraMessage = getString(R.string.holder_startMigration_toThisDevice_onboarding_step3_messageKeepPointing_longer) - val message = "$defaultMessage $extraMessage" - binding.extraContentMessage.animate().setDuration(150).alpha(0f).withEndAction { - binding.extraContentMessage.text = message - binding.extraContentMessage.animate().setDuration(150).alpha(1f) - } - } - }, 10000) - } - - override fun onDestroyView() { - super.onDestroyView() - - (parentFragment?.parentFragment as? HolderMainFragment)?.getToolbar()?.isVisible = true - } - - override fun onQrScanned(content: String) { - binding.extraContentTitle.text = - getString(R.string.holder_startMigration_toThisDevice_onboarding_step3_titleScanning) - binding.extraContentMessage.text = - getString(R.string.holder_startMigration_toThisDevice_onboarding_step3_messageKeepPointing) - viewModel.onQrScanned(content) - } - - override fun getCopy(): Copy { - return Copy( - title = getString(R.string.add_paper_proof_qr_scanner_title), - message = "", - extraContent = Copy.ExtraContent( - header = getString(R.string.holder_startMigration_onboarding_step, "3"), - title = getString(R.string.holder_startMigration_toThisDevice_onboarding_step3_title), - message = getString(R.string.holder_startMigration_toThisDevice_onboarding_step3_message) - ) - ) - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrViewModel.kt deleted file mode 100644 index c441d8b30..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrViewModel.kt +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ -package nl.rijksoverheid.ctr.holder.data_migration - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch -import nl.rijksoverheid.ctr.holder.get_events.models.EventProvider -import nl.rijksoverheid.ctr.holder.get_events.models.RemoteProtocol -import nl.rijksoverheid.ctr.holder.get_events.usecases.ConfigProvidersUseCase -import nl.rijksoverheid.ctr.holder.get_events.usecases.EventProvidersResult -import nl.rijksoverheid.ctr.holder.models.HolderStep -import nl.rijksoverheid.ctr.holder.your_events.YourEventsFragmentType -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationDecodingErrorException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationInvalidNumberOfPackagesException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationInvalidVersionException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationOtherException -import nl.rijksoverheid.ctr.shared.exceptions.NoProvidersException -import nl.rijksoverheid.ctr.shared.livedata.Event -import nl.rijksoverheid.ctr.shared.models.AppErrorResult - -data class ProgressBarState(val progress: Int, val max: Int) { - fun calculateProgressPercentage(): Int { - return ((progress.toFloat() / max.toFloat()) * 100).toInt() - } -} - -sealed class DataMigrationScanQrState { - data class Success(val type: YourEventsFragmentType.RemoteProtocol3Type) : - DataMigrationScanQrState() - - data class Error(val errorResult: AppErrorResult) : DataMigrationScanQrState() -} - -abstract class DataMigrationScanQrViewModel : ViewModel() { - val progressBarLiveData: LiveData = MutableLiveData() - val scanFinishedLiveData: LiveData> = - MutableLiveData() - - abstract fun onQrScanned(content: String) -} - -class DataMigrationScanQrViewModelImpl( - private val dataMigrationImportUseCase: DataMigrationImportUseCase, - private val dataMigrationPayloadUseCase: DataMigrationPayloadUseCase, - private val configProvidersUseCase: ConfigProvidersUseCase -) : DataMigrationScanQrViewModel() { - - private val scannedChunks = mutableListOf() - private val scannedQRs = mutableListOf() - - private fun scanFinished(state: DataMigrationScanQrState) { - (scanFinishedLiveData as MutableLiveData).postValue(Event(state)) - } - - private fun scanFinishedWithError(exception: Exception) { - scanFinished( - DataMigrationScanQrState.Error( - AppErrorResult( - HolderStep.DataMigrationImport, - exception - ) - ) - ) - } - - override fun onQrScanned(content: String) { - if (scannedQRs.contains(content)) { - return - } - scannedQRs.add(content) - viewModelScope.launch { - val migrationParcel = try { - dataMigrationImportUseCase.import(content) - } catch (exception: Exception) { - scanFinishedWithError(DataMigrationDecodingErrorException()) - return@launch - } - - when { - migrationParcel == null -> { - scanFinishedWithError(DataMigrationOtherException()) - } - migrationParcel.version != DataExportUseCaseImpl.version -> { - scanFinishedWithError(DataMigrationInvalidVersionException()) - } - else -> { - next(migrationParcel) - } - } - } - } - - private suspend fun next(migrationParcel: MigrationParcel) { - when { - scannedChunks.size >= migrationParcel.numberOfPackages -> { - scanFinishedWithError(DataMigrationInvalidNumberOfPackagesException()) - } - else -> { - updateProgress(migrationParcel) - } - } - } - - private suspend fun updateProgress(migrationParcel: MigrationParcel) { - val currentState = progressBarLiveData.value - val currentProgress = currentState?.progress ?: 0 - if (!scannedChunks.map { it.payload }.contains(migrationParcel.payload)) { - scannedChunks.add(migrationParcel) - (progressBarLiveData as MutableLiveData).postValue( - ProgressBarState( - progress = currentProgress + 1, - max = migrationParcel.numberOfPackages - ) - ) - if (scannedChunks.size == migrationParcel.numberOfPackages) { - scanFinished() - } - } - } - - private suspend fun scanFinished() { - val eventGroupParcels = try { - dataMigrationImportUseCase.merge(scannedChunks) - } catch (exception: Exception) { - scanFinishedWithError(DataMigrationDecodingErrorException()) - return - } - val remoteEventsMap = eventGroupParcels.mapNotNull { - val remoteProtocol = - dataMigrationPayloadUseCase.parsePayload(it.jsonData) - - if (remoteProtocol != null) { - mapOf(remoteProtocol to it.jsonData) - } else { - null - } - } - .fold(mapOf()) { protocol, byteArray -> protocol + byteArray } - - val eventProvidersResult = configProvidersUseCase.eventProviders() - - if (eventProvidersResult is EventProvidersResult.Success) { - scanFinished( - state = DataMigrationScanQrState.Success( - type = YourEventsFragmentType.RemoteProtocol3Type( - remoteEvents = remoteEventsMap, - eventProviders = eventProvidersResult.eventProviders.map { - EventProvider( - it.providerIdentifier, - it.name - ) - } - ) - ) - ) - } else { - scanFinishedWithError(NoProvidersException.Migration) - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeFragment.kt deleted file mode 100644 index ca75fe2d8..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeFragment.kt +++ /dev/null @@ -1,71 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import android.os.Bundle -import android.view.View -import nl.rijksoverheid.ctr.holder.BaseFragment -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.databinding.FragmentDataMigrationShowQrBinding -import nl.rijksoverheid.ctr.holder.models.HolderFlow -import nl.rijksoverheid.ctr.shared.models.ErrorResultFragmentData -import nl.rijksoverheid.ctr.shared.models.Flow -import org.koin.androidx.viewmodel.ext.android.viewModel - -class DataMigrationShowQrCodeFragment : BaseFragment(R.layout.fragment_data_migration_show_qr) { - - private val viewModel: DataMigrationShowQrCodeViewModel by viewModel() - - override fun onButtonClickWithRetryAction() { - // no-op - } - - override fun getFlow(): Flow { - return HolderFlow.Migration - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val binding = FragmentDataMigrationShowQrBinding.bind(view) - binding.step.text = getString(R.string.holder_startMigration_onboarding_step, "3") - - viewModel.qrCodesLiveData.observe(viewLifecycleOwner) { - when (it) { - is DataMigrationShowQrViewState.ShowError -> { - presentError( - data = ErrorResultFragmentData( - title = getString(R.string.error_something_went_wrong_title), - description = getString( - R.string.holder_migration_errorcode_message, - errorCodeStringFactory.get(getFlow(), it.errorResults) - ), - buttonTitle = getString(R.string.general_toMyOverview), - buttonAction = ErrorResultFragmentData.ButtonAction.Destination(R.id.action_my_overview) - ) - ) - } - is DataMigrationShowQrViewState.ShowQrs -> { - val bitmaps = it.bitmaps - val firstBitmap = bitmaps.firstOrNull() ?: return@observe - binding.dataMigrationQrCodes.setImageBitmap(firstBitmap) - if (bitmaps.size > 1) { - var nextIndex = 1 - val runnable = object : Runnable { - override fun run() { - if (!isAdded) return - binding.dataMigrationQrCodes.setImageBitmap(bitmaps[nextIndex]) - nextIndex++ - if (nextIndex == bitmaps.size) { - nextIndex = 0 - } - binding.dataMigrationQrCodes.postDelayed(this, 200) - } - } - binding.dataMigrationQrCodes.postDelayed(runnable, 200) - } - } - } - } - - viewModel.generateQrCodes(resources.displayMetrics.widthPixels) - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeViewModel.kt deleted file mode 100644 index 471881d2d..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeViewModel.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel -import java.io.IOException -import kotlinx.coroutines.launch -import nl.rijksoverheid.ctr.holder.models.HolderStep -import nl.rijksoverheid.ctr.holder.qrcodes.models.QrCodeFragmentData -import nl.rijksoverheid.ctr.holder.qrcodes.usecases.QrCodeUseCase -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationCompressionException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationOtherException -import nl.rijksoverheid.ctr.shared.models.AppErrorResult - -abstract class DataMigrationShowQrCodeViewModel : ViewModel() { - val qrCodesLiveData: LiveData = MutableLiveData() - - abstract fun generateQrCodes(size: Int) -} - -class DataMigrationShowQrCodeViewModelImpl( - private val dataExportUseCase: DataExportUseCase, - private val qrCodeUseCase: QrCodeUseCase -) : DataMigrationShowQrCodeViewModel() { - override fun generateQrCodes(size: Int) { - viewModelScope.launch { - try { - val qrCodes = dataExportUseCase.export() - val bitmaps = qrCodes.map { - qrCodeUseCase.qrCode( - it.toByteArray(), - QrCodeFragmentData.ShouldDisclose.DoNotDisclose, - size, - size, - ErrorCorrectionLevel.M - ) - } - (qrCodesLiveData as MutableLiveData).postValue( - DataMigrationShowQrViewState.ShowQrs( - bitmaps - ) - ) - } catch (exception: Exception) { - val errorResult = AppErrorResult( - e = if (exception is IOException) { - DataMigrationCompressionException() - } else { - DataMigrationOtherException() - }, - step = HolderStep.DataMigrationExport - ) - (qrCodesLiveData as MutableLiveData).postValue( - DataMigrationShowQrViewState.ShowError( - errorResults = listOf(errorResult) - ) - ) - } - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrViewState.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrViewState.kt deleted file mode 100644 index c64807598..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrViewState.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import android.graphics.Bitmap -import nl.rijksoverheid.ctr.shared.models.ErrorResult - -sealed class DataMigrationShowQrViewState { - data class ShowQrs(val bitmaps: List) : DataMigrationShowQrViewState() - data class ShowError(val errorResults: List) : DataMigrationShowQrViewState() -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationStartFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationStartFragment.kt deleted file mode 100644 index e60d096aa..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationStartFragment.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.databinding.FragmentDataMigrationStartTransferringBinding -import nl.rijksoverheid.ctr.shared.ext.navigateSafety -import nl.rijksoverheid.ctr.shared.livedata.EventObserver -import org.koin.androidx.viewmodel.ext.android.viewModel - -class DataMigrationStartFragment : Fragment(R.layout.fragment_data_migration_start_transferring) { - - private val viewModel: DataMigrationStartViewModel by viewModel() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val binding = FragmentDataMigrationStartTransferringBinding.bind(view) - - viewModel.canTransferData.observe(viewLifecycleOwner, EventObserver { - binding.bottom.setButtonClick { - if (it) { - navigateSafety(DataMigrationStartFragmentDirections.actionDataTransferOptions()) - } else { - navigateSafety( - DataMigrationTransferOptionsFragmentDirections.actionDataMigrationInstructions( - instructionItems = transferInOnboardingItems, - destination = DataMigrationOnboardingItem.ScanQrCode - ) - ) - } - } - }) - - viewModel.canTransfer() - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationStartViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationStartViewModel.kt deleted file mode 100644 index 4579d365c..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationStartViewModel.kt +++ /dev/null @@ -1,24 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch -import nl.rijksoverheid.ctr.shared.livedata.Event - -abstract class DataMigrationStartViewModel : ViewModel() { - val canTransferData: LiveData> = MutableLiveData() - - abstract fun canTransfer() -} - -class DataMigrationStartViewModelImpl( - private val dataMigrationUseCase: DataMigrationUseCase -) : DataMigrationStartViewModel() { - override fun canTransfer() { - viewModelScope.launch { - (canTransferData as MutableLiveData).postValue(Event(dataMigrationUseCase.canTransferData())) - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationTransferOptionsFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationTransferOptionsFragment.kt deleted file mode 100644 index 9c84f06ac..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationTransferOptionsFragment.kt +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - */ - -package nl.rijksoverheid.ctr.holder.data_migration - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.databinding.FragmentDataMigrationTransferOptionsBinding -import nl.rijksoverheid.ctr.introduction.onboarding.models.OnboardingItem -import nl.rijksoverheid.ctr.shared.ext.navigateSafety - -val transferOutOnboardingItems = arrayOf( - OnboardingItem( - imageResource = R.drawable.illustration_data_migration_instructions_step_1, - titleResource = R.string.holder_startMigration_toOtherDevice_onboarding_step1_title, - description = R.string.holder_startMigration_toOtherDevice_onboarding_step1_message, - position = 1 - ), - OnboardingItem( - imageResource = R.drawable.illustration_data_migration_instructions_step_2, - titleResource = R.string.holder_startMigration_toOtherDevice_onboarding_step2_title, - description = R.string.holder_startMigration_toOtherDevice_onboarding_step2_message, - position = 2 - ), - OnboardingItem( - clazz = DataMigrationShowQrCodeFragment::class.java, - titleResource = R.string.holder_startMigration_toOtherDevice_onboarding_step3_title, - description = R.string.holder_startMigration_toOtherDevice_onboarding_step3_title, - position = 3 - ) -) - -val transferInOnboardingItems = arrayOf( - OnboardingItem( - imageResource = R.drawable.illustration_data_migration_instructions_step_1, - titleResource = R.string.holder_startMigration_toThisDevice_onboarding_step1_title, - description = R.string.holder_startMigration_toThisDevice_onboarding_step1_message, - position = 1 - ), - OnboardingItem( - imageResource = R.drawable.illustration_data_migration_instructions_step_2, - titleResource = R.string.holder_startMigration_toThisDevice_onboarding_step2_title, - description = R.string.holder_startMigration_toThisDevice_onboarding_step2_message, - position = 2 - ) -) - -class DataMigrationTransferOptionsFragment : Fragment(R.layout.fragment_data_migration_transfer_options) { - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val binding = FragmentDataMigrationTransferOptionsBinding.bind(view) - - binding.transferOutButton.transferOptionsButtonTitle.text = getString(R.string.holder_startMigration_option_toOtherDevice_title) - binding.transferOutButton.transferOptionsButtonIcon.setImageResource(R.drawable.illustration_data_migration_transfer_out) - binding.transferInButton.transferOptionsButtonTitle.text = getString(R.string.holder_startMigration_option_toThisDevice_title) - binding.transferInButton.transferOptionsButtonIcon.setImageResource(R.drawable.illustration_data_migration_transfer_in) - - binding.transferOutButton.root.setOnClickListener { - navigateSafety( - DataMigrationTransferOptionsFragmentDirections.actionDataMigrationInstructions( - instructionItems = transferOutOnboardingItems, - destination = DataMigrationOnboardingItem.ShowQrCode - ) - ) - } - - binding.transferInButton.root.setOnClickListener { - navigateSafety( - DataMigrationTransferOptionsFragmentDirections.actionDataMigrationInstructions( - instructionItems = transferInOnboardingItems, - destination = DataMigrationOnboardingItem.ScanQrCode - ) - ) - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationUseCase.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationUseCase.kt deleted file mode 100644 index 010ea70e1..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationUseCase.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - */ -package nl.rijksoverheid.ctr.holder.data_migration - -import nl.rijksoverheid.ctr.persistence.database.HolderDatabase - -interface DataMigrationUseCase { - suspend fun canTransferData(): Boolean -} - -class DataMigrationUseCaseImpl( - private val holderDatabase: HolderDatabase -) : DataMigrationUseCase { - - override suspend fun canTransferData(): Boolean { - val events = holderDatabase.eventGroupDao().getAll().filter { !it.draft } - return events.isNotEmpty() - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/EventGroupParcel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/EventGroupParcel.kt deleted file mode 100644 index 628dfcdb4..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/EventGroupParcel.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -@JsonClass(generateAdapter = true) -data class EventGroupParcel( - @Json(name = "d") val jsonData: ByteArray -) diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/MigrationParcel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/MigrationParcel.kt deleted file mode 100644 index 915ac8680..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/MigrationParcel.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -@JsonClass(generateAdapter = true) -data class MigrationParcel( - @Json(name = "i") val index: Int, - @Json(name = "n") val numberOfPackages: Int, - @Json(name = "p") val payload: String, - @Json(name = "v") val version: String -) diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/StringDataZipper.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/StringDataZipper.kt deleted file mode 100644 index 287b555c6..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/data_migration/StringDataZipper.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2023 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ -package nl.rijksoverheid.ctr.holder.data_migration - -import java.io.ByteArrayOutputStream -import java.nio.charset.StandardCharsets.UTF_8 -import java.util.zip.GZIPInputStream -import java.util.zip.GZIPOutputStream - -interface StringDataZipper { - fun zip(data: String): ByteArray - fun unzip(data: ByteArray): String -} - -class StringDataZipperImpl : StringDataZipper { - override fun zip(data: String): ByteArray { - val bos = ByteArrayOutputStream() - GZIPOutputStream(bos).bufferedWriter(UTF_8).use { it.write(data) } - return bos.toByteArray() - } - - override fun unzip(data: ByteArray): String = - GZIPInputStream(data.inputStream()).bufferedReader(UTF_8).use { it.readText() } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModel.kt index c560d374e..46fc04f52 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModel.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModel.kt @@ -31,9 +31,7 @@ class MenuViewModelImpl( private fun menuSections(context: Context): Array { val actionExportIntroduction = MenuFragmentDirections.actionExportIntroduction() val actionChooseProofType = MenuFragmentDirections.actionChooseProofType() - val actionPaperProof = MenuFragmentDirections.actionPaperProof() val actionSavedEvents = MenuFragmentDirections.actionSavedEvents() - val actionDataMigration = MenuFragmentDirections.actionDataMigration() val actionHelpInfo = MenuFragmentDirections.actionMenu( toolbarTitle = context.getString(R.string.holder_helpInfo_title), menuSections = helpMenuDataModel.get(context) @@ -56,16 +54,6 @@ class MenuViewModelImpl( ) ) - val addPaperProofMenuItem = MenuSection.MenuItem( - icon = R.drawable.ic_menu_paper, - title = R.string.holder_menu_paperproof_title, - subtitle = R.string.holder_menu_paperproof_subTitle, - onClick = MenuSection.MenuItem.OnClick.Navigate( - navigationActionId = actionPaperProof.actionId, - navigationArguments = actionPaperProof.arguments - ) - ) - val savedEventsMenuItem = MenuSection.MenuItem( icon = R.drawable.ic_menu_saved_events, title = R.string.holder_menu_storedEvents, @@ -74,15 +62,6 @@ class MenuViewModelImpl( ) ) - val dataMigrationMenuItem = MenuSection.MenuItem( - icon = R.drawable.ic_menu_data_migration, - iconColor = -1, - title = R.string.holder_menu_migration, - onClick = MenuSection.MenuItem.OnClick.Navigate( - navigationActionId = actionDataMigration.actionId - ) - ) - val helpInfoMenuItem = MenuSection.MenuItem( icon = R.drawable.ic_menu_info, title = R.string.holder_menu_helpInfo, @@ -102,11 +81,6 @@ class MenuViewModelImpl( addVaccinationOrTestMenuItem } else { null - }, - if (featureFlagUseCase.getScanCertificateButtonEnabled()) { - addPaperProofMenuItem - } else { - null } ) @@ -120,11 +94,6 @@ class MenuViewModelImpl( null } else { savedEventsMenuItem - }, - if (featureFlagUseCase.getMigrateButtonEnabled()) { - dataMigrationMenuItem - } else { - null } ) ), diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/EventsUseCasesModule.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/EventsUseCasesModule.kt index c0ed88b24..bf1f1376f 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/EventsUseCasesModule.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/EventsUseCasesModule.kt @@ -3,14 +3,6 @@ package nl.rijksoverheid.ctr.holder.modules import java.time.Clock import nl.rijksoverheid.ctr.holder.dashboard.usecases.ShowBlockedEventsDialogUseCase import nl.rijksoverheid.ctr.holder.dashboard.usecases.ShowBlockedEventsDialogUseCaseImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataExportUseCase -import nl.rijksoverheid.ctr.holder.data_migration.DataExportUseCaseImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationImportUseCase -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationImportUseCaseImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationPayloadUseCase -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationPayloadUseCaseImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationUseCase -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationUseCaseImpl import nl.rijksoverheid.ctr.holder.get_events.usecases.GetEventProvidersWithTokensUseCase import nl.rijksoverheid.ctr.holder.get_events.usecases.GetEventProvidersWithTokensUseCaseImpl import nl.rijksoverheid.ctr.holder.get_events.usecases.GetEventsUseCase @@ -95,10 +87,6 @@ val eventsUseCasesModule = module { factory { PersistBlockedEventsUseCaseImpl(get()) } factory { ShowBlockedEventsDialogUseCaseImpl(get()) } factory { DraftEventUseCaseImpl(get()) } - factory { DataMigrationUseCaseImpl(get()) } - factory { DataExportUseCaseImpl(get(), get(), get()) } - factory { DataMigrationImportUseCaseImpl(get(), get()) } - factory { DataMigrationPayloadUseCaseImpl(get(), get()) } factory { PrintExportDccUseCaseImpl(get(), get(), get()) } factory { PreviewPdfUseCaseImpl() } } diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/UtilsModule.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/UtilsModule.kt index 32aa8aacc..5849f3547 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/UtilsModule.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/UtilsModule.kt @@ -21,8 +21,6 @@ import nl.rijksoverheid.ctr.holder.dashboard.util.OriginUtil import nl.rijksoverheid.ctr.holder.dashboard.util.OriginUtilImpl import nl.rijksoverheid.ctr.holder.dashboard.util.RemovedEventsBottomSheetUtil import nl.rijksoverheid.ctr.holder.dashboard.util.RemovedEventsBottomSheetUtilImpl -import nl.rijksoverheid.ctr.holder.data_migration.StringDataZipper -import nl.rijksoverheid.ctr.holder.data_migration.StringDataZipperImpl import nl.rijksoverheid.ctr.holder.get_events.utils.LoginTypeUtil import nl.rijksoverheid.ctr.holder.get_events.utils.LoginTypeUtilImpl import nl.rijksoverheid.ctr.holder.get_events.utils.ScopeUtil @@ -129,5 +127,4 @@ val utilsModule = module { factory { StringUtilImpl(get()) } factory { YourEventsEndStateUtilImpl(get()) } factory { RemovedEventsBottomSheetUtilImpl(get(), get(), get(), get(), get(), get()) } - factory { StringDataZipperImpl() } } diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/ViewModels.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/ViewModels.kt index e5f71ca1c..6f205ae61 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/ViewModels.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/ViewModels.kt @@ -5,12 +5,6 @@ import nl.rijksoverheid.ctr.holder.HolderMainActivityViewModel import nl.rijksoverheid.ctr.holder.HolderMainActivityViewModelImpl import nl.rijksoverheid.ctr.holder.dashboard.DashboardViewModel import nl.rijksoverheid.ctr.holder.dashboard.DashboardViewModelImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationScanQrViewModel -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationScanQrViewModelImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationShowQrCodeViewModel -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationShowQrCodeViewModelImpl -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationStartViewModel -import nl.rijksoverheid.ctr.holder.data_migration.DataMigrationStartViewModelImpl import nl.rijksoverheid.ctr.holder.get_events.GetEventsViewModel import nl.rijksoverheid.ctr.holder.get_events.GetEventsViewModelImpl import nl.rijksoverheid.ctr.holder.get_events.LoginViewModel @@ -18,10 +12,6 @@ import nl.rijksoverheid.ctr.holder.input_token.InputTokenViewModel import nl.rijksoverheid.ctr.holder.input_token.InputTokenViewModelImpl import nl.rijksoverheid.ctr.holder.menu.MenuViewModelImpl import nl.rijksoverheid.ctr.holder.modules.qualifier.LoginQualifier -import nl.rijksoverheid.ctr.holder.paper_proof.PaperProofDomesticInputCodeViewModel -import nl.rijksoverheid.ctr.holder.paper_proof.PaperProofDomesticInputCodeViewModelImpl -import nl.rijksoverheid.ctr.holder.paper_proof.PaperProofQrScannerViewModel -import nl.rijksoverheid.ctr.holder.paper_proof.PaperProofQrScannerViewModelImpl import nl.rijksoverheid.ctr.holder.pdf.PdfPreviewViewModel import nl.rijksoverheid.ctr.holder.pdf.PdfPreviewViewModelImpl import nl.rijksoverheid.ctr.holder.pdf.PdfWebViewModel @@ -65,16 +55,11 @@ val viewModels = module { viewModel { DeviceSecureViewModelImpl(get(), get()) } viewModel { YourEventsViewModelImpl(get(), get(), get()) } viewModel { GetEventsViewModelImpl(get(), get(), get()) } - viewModel { PaperProofDomesticInputCodeViewModelImpl(get(), get()) } - viewModel { PaperProofQrScannerViewModelImpl(get()) } viewModel { DashboardViewModelImpl(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) } viewModel { SyncGreenCardsViewModelImpl(get(), get()) } viewModel { SavedEventsViewModel(get(), get()) } viewModel { MenuViewModelImpl(get(), get()) } viewModel { PriorityNotificationViewModelImpl(get()) } - viewModel { DataMigrationStartViewModelImpl(get()) } - viewModel { DataMigrationShowQrCodeViewModelImpl(get(), get()) } - viewModel { DataMigrationScanQrViewModelImpl(get(), get(), get()) } viewModel { PdfWebViewModelImpl(androidContext().filesDir.path, get(), get()) } viewModel { PdfPreviewViewModelImpl(get()) } } diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofDomesticInputCodeFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofDomesticInputCodeFragment.kt deleted file mode 100644 index b3a7a1a9f..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofDomesticInputCodeFragment.kt +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2021 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -package nl.rijksoverheid.ctr.holder.paper_proof - -import android.os.Bundle -import android.view.View -import androidx.navigation.fragment.navArgs -import nl.rijksoverheid.ctr.design.fragments.info.ButtonData -import nl.rijksoverheid.ctr.design.fragments.info.DescriptionData -import nl.rijksoverheid.ctr.design.fragments.info.InfoFragmentData -import nl.rijksoverheid.ctr.design.utils.InfoFragmentUtil -import nl.rijksoverheid.ctr.holder.BaseFragment -import nl.rijksoverheid.ctr.holder.HolderMainFragment -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.databinding.FragmentPaperProofDomesticInputCodeBinding -import nl.rijksoverheid.ctr.holder.models.HolderFlow -import nl.rijksoverheid.ctr.holder.paper_proof.models.PaperProofDomesticCodeResult -import nl.rijksoverheid.ctr.holder.paper_proof.models.PaperProofDomesticResult -import nl.rijksoverheid.ctr.holder.your_events.YourEventsFragmentType -import nl.rijksoverheid.ctr.persistence.database.entities.OriginType -import nl.rijksoverheid.ctr.shared.ext.findNavControllerSafety -import nl.rijksoverheid.ctr.shared.ext.hideKeyboard -import nl.rijksoverheid.ctr.shared.ext.showKeyboard -import nl.rijksoverheid.ctr.shared.livedata.EventObserver -import nl.rijksoverheid.ctr.shared.models.ErrorResultFragmentData -import nl.rijksoverheid.ctr.shared.models.Flow -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.stateViewModel -import org.koin.androidx.viewmodel.scope.emptyState - -class PaperProofDomesticInputCodeFragment : BaseFragment(R.layout.fragment_paper_proof_domestic_input_code) { - - private var _binding: FragmentPaperProofDomesticInputCodeBinding? = null - private val binding get() = _binding!! - private val args: PaperProofDomesticInputCodeFragmentArgs by navArgs() - private val infoFragmentUtil: InfoFragmentUtil by inject() - - private val viewModel: PaperProofDomesticInputCodeViewModel by stateViewModel( - state = emptyState() - ) - - override fun onButtonClickWithRetryAction() { - viewModel.validateProof( - qrContent = args.qrContent, - couplingCode = binding.codeInputText.text.toString() - ) - } - - override fun getFlow(): Flow { - return HolderFlow.HkviScan - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - _binding = FragmentPaperProofDomesticInputCodeBinding.bind(view) - showKeyboard(binding.codeInputText) - - viewModel.loading.observe(viewLifecycleOwner) { - (parentFragment?.parentFragment as HolderMainFragment).presentLoading(it) - binding.bottom.setButtonEnabled(!it) - } - - viewModel.validateCodeLiveData.observe(viewLifecycleOwner, EventObserver { - when (it) { - is PaperProofDomesticCodeResult.Valid -> { - onButtonClickWithRetryAction() - } - is PaperProofDomesticCodeResult.Empty -> { - binding.codeInput.error = - getString(R.string.add_paper_proof_input_empty) - binding.codeInput.isErrorEnabled = true - binding.codeInput.setErrorIconDrawable(R.drawable.ic_error) - } - is PaperProofDomesticCodeResult.Invalid -> { - binding.codeInput.error = - getString(R.string.add_paper_proof_input_invalid) - binding.codeInput.isErrorEnabled = true - binding.codeInput.setErrorIconDrawable(R.drawable.ic_error) - } - } - }) - - viewModel.validateProofLiveData.observe(viewLifecycleOwner, EventObserver { - when (it) { - is PaperProofDomesticResult.Valid -> { - findNavControllerSafety()?.navigate(PaperProofDomesticInputCodeFragmentDirections.actionYourEvents( - toolbarTitle = getString(R.string.your_dcc_event_toolbar_title), - type = YourEventsFragmentType.DCC( - remoteEvent = it.remoteEvent, - eventGroupJsonData = it.eventGroupJsonData, - originType = OriginType.fromTypeString(it.remoteEvent.events!!.first().type!!) - ), - flow = HolderFlow.HkviScanned(it.remoteEvent) - )) - } - is PaperProofDomesticResult.Invalid.BlockedQr -> { - presentError( - data = ErrorResultFragmentData( - title = getString(R.string.add_paper_proof_limit_reached_paper_proof_title), - description = getString(R.string.add_paper_proof_limit_reached_paper_proof_description), - buttonTitle = getString(R.string.back_to_overview), - ErrorResultFragmentData.ButtonAction.Destination(R.id.action_my_overview) - ) - ) - } - is PaperProofDomesticResult.Invalid.RejectedQr -> { - presentError( - data = ErrorResultFragmentData( - title = getString(R.string.add_paper_proof_invalid_combination_title), - description = getString(R.string.add_paper_proof_invalid_combination_), - buttonTitle = getString(R.string.back_to_overview), - ErrorResultFragmentData.ButtonAction.Destination(R.id.action_my_overview) - ) - ) - } - is PaperProofDomesticResult.Invalid.Error -> { - presentError( - errorResult = it.errorResult - ) - } - } - }) - - binding.noLetterCombinationBtn.setOnClickListener { - infoFragmentUtil.presentFullScreen( - currentFragment = this, - toolbarTitle = getString(R.string.add_paper_proof_title), - data = InfoFragmentData.TitleDescriptionWithButton( - title = getString(R.string.no_letter_combination_dialog_title), - descriptionData = DescriptionData(R.string.no_letter_combination_dialog_description), - secondaryButtonData = ButtonData.NavigationButton( - text = getString(R.string.add_paper_proof_self_printed_goto_add_proof_button), - navigationActionId = R.id.action_choose_proof_type - ) - ) - ) - } - - binding.bottom.setButtonClick { - binding.codeInput.error = null - viewModel.validateCode(binding.codeInputText.text.toString()) - } - } - - override fun onDestroyView() { - super.onDestroyView() - (parentFragment?.parentFragment as? HolderMainFragment)?.presentLoading(false) - _binding = null - } - - override fun onPause() { - super.onPause() - hideKeyboard() - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofDomesticInputCodeViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofDomesticInputCodeViewModel.kt deleted file mode 100644 index e7d1a6067..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofDomesticInputCodeViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - * - */ - -package nl.rijksoverheid.ctr.holder.paper_proof - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch -import nl.rijksoverheid.ctr.holder.paper_proof.models.PaperProofDomesticCodeResult -import nl.rijksoverheid.ctr.holder.paper_proof.models.PaperProofDomesticResult -import nl.rijksoverheid.ctr.holder.paper_proof.usecases.ValidatePaperProofDomesticInputCodeUseCase -import nl.rijksoverheid.ctr.holder.paper_proof.usecases.ValidatePaperProofDomesticUseCase -import nl.rijksoverheid.ctr.shared.livedata.Event - -abstract class PaperProofDomesticInputCodeViewModel : ViewModel() { - val loading: LiveData = MutableLiveData() - val validateCodeLiveData: LiveData> = MutableLiveData() - val validateProofLiveData: LiveData> = MutableLiveData() - - abstract fun validateCode(code: String) - abstract fun validateProof(qrContent: String, couplingCode: String) -} - -class PaperProofDomesticInputCodeViewModelImpl( - private val validatePaperProofDomesticInputCodeUseCase: ValidatePaperProofDomesticInputCodeUseCase, - private val validatePaperProofDomesticUseCase: ValidatePaperProofDomesticUseCase -) : PaperProofDomesticInputCodeViewModel() { - - override fun validateCode(code: String) { - val result = validatePaperProofDomesticInputCodeUseCase.validate(code) - (validateCodeLiveData as MutableLiveData).postValue(Event(result)) - } - - override fun validateProof(qrContent: String, couplingCode: String) { - viewModelScope.launch { - (loading as MutableLiveData).postValue(true) - val result = validatePaperProofDomesticUseCase.validate( - qrContent = qrContent, - couplingCode = couplingCode - ) - (validateProofLiveData as MutableLiveData).postValue(Event(result)) - loading.postValue(false) - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerFragment.kt deleted file mode 100644 index 2d1ad9937..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerFragment.kt +++ /dev/null @@ -1,112 +0,0 @@ -package nl.rijksoverheid.ctr.holder.paper_proof - -import android.os.Bundle -import android.view.View -import nl.rijksoverheid.ctr.design.fragments.info.ButtonData -import nl.rijksoverheid.ctr.design.fragments.info.DescriptionData -import nl.rijksoverheid.ctr.design.fragments.info.InfoFragmentData -import nl.rijksoverheid.ctr.holder.HolderMainActivityViewModel -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.models.HolderFlow -import nl.rijksoverheid.ctr.holder.paper_proof.models.PaperProofType -import nl.rijksoverheid.ctr.holder.your_events.YourEventsFragmentType -import nl.rijksoverheid.ctr.persistence.database.entities.OriginType -import nl.rijksoverheid.ctr.qrscanner.QrCodeScannerFragment -import nl.rijksoverheid.ctr.shared.ext.findNavControllerSafety -import nl.rijksoverheid.ctr.shared.livedata.EventObserver -import org.koin.androidx.viewmodel.ext.android.sharedViewModel -import org.koin.androidx.viewmodel.ext.android.viewModel - -class PaperProofQrScannerFragment : QrCodeScannerFragment() { - - private val holderMainActivityViewModel: HolderMainActivityViewModel by sharedViewModel() - private val paperProofScannerViewModel: PaperProofQrScannerViewModel by viewModel() - - override fun onQrScanned(content: String) { - paperProofScannerViewModel.getType( - qrContent = content - ) - } - - override fun getCopy(): Copy { - return Copy( - title = getString(R.string.add_paper_proof_qr_scanner_title), - message = getString(R.string.add_paper_proof_qr_scanner_text), - rationaleDialog = Copy.RationaleDialog( - title = R.string.camera_rationale_dialog_title, - description = getString(R.string.camera_rationale_dialog_description), - okayButtonText = R.string.ok - ) - ) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - paperProofScannerViewModel.loadingLiveData.observe(viewLifecycleOwner, EventObserver { - binding.progress.visibility = if (it) View.VISIBLE else View.GONE - }) - - paperProofScannerViewModel.paperProofTypeLiveData.observe( - viewLifecycleOwner, - EventObserver { paperProofType -> - findNavControllerSafety()?.popBackStack() - when (paperProofType) { - is PaperProofType.DCC.Dutch -> { - holderMainActivityViewModel.navigate( - navDirections = PaperProofStartScanningFragmentDirections.actionPaperProofCode( - paperProofType.qrContent - ), - delayMillis = resources.getInteger(android.R.integer.config_mediumAnimTime) - .toLong() - ) - } - is PaperProofType.DCC.Foreign -> { - holderMainActivityViewModel.navigate( - navDirections = PaperProofStartScanningFragmentDirections.actionYourEvents( - toolbarTitle = getString(R.string.your_dcc_event_toolbar_title), - type = YourEventsFragmentType.DCC( - remoteEvent = paperProofType.remoteProtocol, - eventGroupJsonData = paperProofType.eventGroupJsonData, - originType = OriginType.fromTypeString(paperProofType.remoteProtocol.events!!.first().type!!) - ), - flow = HolderFlow.HkviScanned(paperProofType.remoteProtocol) - ) - ) - } - is PaperProofType.CTB -> { - scanAgain( - title = getString(R.string.holder_scanner_error_title_ctb), - description = getString(R.string.holder_scanner_error_message_ctb), - buttonText = getString(R.string.holder_scanner_error_action) - ) - } - is PaperProofType.Unknown -> { - scanAgain( - title = getString(R.string.holder_scanner_error_title_unknown), - description = getString(R.string.holder_scanner_error_message_unknown), - buttonText = getString(R.string.holder_scanner_error_action) - ) - } - } - }) - } - - private fun scanAgain(title: String, description: String, buttonText: String) { - holderMainActivityViewModel.navigate( - PaperProofStartScanningFragmentDirections.actionInfoFragment( - toolbarTitle = "", - data = InfoFragmentData.TitleDescriptionWithButton( - title = title, - descriptionData = DescriptionData( - htmlTextString = description - ), - primaryButtonData = ButtonData.NavigationButton( - text = buttonText, - navigationActionId = R.id.action_paper_proof_start_scanning - ) - ) - ) - ) - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerViewModel.kt deleted file mode 100644 index c2f710d22..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package nl.rijksoverheid.ctr.holder.paper_proof - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import nl.rijksoverheid.ctr.holder.paper_proof.models.PaperProofType -import nl.rijksoverheid.ctr.holder.paper_proof.usecases.GetPaperProofTypeUseCase -import nl.rijksoverheid.ctr.shared.livedata.Event - -abstract class PaperProofQrScannerViewModel : ViewModel() { - val loadingLiveData = MutableLiveData>() - val paperProofTypeLiveData = MutableLiveData>() - - abstract fun getType(qrContent: String) -} - -class PaperProofQrScannerViewModelImpl( - private val getPaperProofTypeUseCase: GetPaperProofTypeUseCase -) : PaperProofQrScannerViewModel() { - - override fun getType(qrContent: String) { - viewModelScope.launch(Dispatchers.IO) { - loadingLiveData.postValue(Event(true)) - val result = getPaperProofTypeUseCase.get( - qrContent = qrContent - ) - paperProofTypeLiveData.postValue(Event(result)) - loadingLiveData.postValue(Event(false)) - } - } -} diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofStartScanningFragment.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofStartScanningFragment.kt deleted file mode 100644 index 86b9af7c4..000000000 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofStartScanningFragment.kt +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2021 De Staat der Nederlanden, Ministerie van Volksgezondheid, Welzijn en Sport. - * Licensed under the EUROPEAN UNION PUBLIC LICENCE v. 1.2 - * - * SPDX-License-Identifier: EUPL-1.2 - */ - -package nl.rijksoverheid.ctr.holder.paper_proof - -import android.content.Context -import android.hardware.camera2.CameraAccessException -import android.hardware.camera2.CameraManager -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import androidx.navigation.Navigation -import nl.rijksoverheid.ctr.design.fragments.ErrorResultFragment -import nl.rijksoverheid.ctr.design.fragments.info.DescriptionData -import nl.rijksoverheid.ctr.design.fragments.info.InfoFragmentData -import nl.rijksoverheid.ctr.design.utils.InfoFragmentUtil -import nl.rijksoverheid.ctr.holder.HolderMainActivityViewModel -import nl.rijksoverheid.ctr.holder.R -import nl.rijksoverheid.ctr.holder.databinding.FragmentPaperProofStartScanningBinding -import nl.rijksoverheid.ctr.shared.ext.findNavControllerSafety -import nl.rijksoverheid.ctr.shared.livedata.EventObserver -import nl.rijksoverheid.ctr.shared.models.ErrorResultFragmentData -import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.sharedViewModel - -class PaperProofStartScanningFragment : Fragment(R.layout.fragment_paper_proof_start_scanning) { - - private val holderMainActivityViewModel: HolderMainActivityViewModel by sharedViewModel() - private val infoFragmentUtil: InfoFragmentUtil by inject() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - val binding = FragmentPaperProofStartScanningBinding.bind(view) - - holderMainActivityViewModel.navigateLiveData.observe(viewLifecycleOwner, EventObserver { - findNavControllerSafety()?.navigate(it) - }) - - binding.button.setOnClickListener { - infoFragmentUtil.presentAsBottomSheet( - fragmentManager = childFragmentManager, - data = InfoFragmentData.TitleDescription( - title = getString(R.string.holder_paperproof_whichProofsCanBeUsed_title), - descriptionData = DescriptionData( - htmlText = R.string.holder_paperproof_whichProofsCanBeUsed_body - ) - ) - ) - } - - binding.bottom.setButtonClick { - openScanner() - } - } - - private fun openScanner() { - try { - val cameraManager = - requireActivity().getSystemService(Context.CAMERA_SERVICE) as CameraManager - if (cameraManager.cameraIdList.isNotEmpty()) { - Navigation.findNavController(requireActivity(), R.id.main_nav_host_fragment) - .navigate(R.id.action_paper_proof_qr_scanner) - } else { - showNoCameraError() - } - } catch (exception: CameraAccessException) { - showNoCameraError() - } - } - - private fun showNoCameraError() { - findNavControllerSafety()?.navigate( - R.id.action_error_result, - ErrorResultFragment.getBundle( - ErrorResultFragmentData( - title = getString(R.string.add_paper_proof_no_camera_error_header), - description = getString(R.string.add_paper_proof_no_camera_error_description), - buttonTitle = getString(R.string.back_to_overview), - buttonAction = ErrorResultFragmentData.ButtonAction.Destination(R.id.action_my_overview) - ) - ) - ) - } -} diff --git a/holder/src/main/res/navigation/holder_nav_graph_main.xml b/holder/src/main/res/navigation/holder_nav_graph_main.xml index d71bb0b0b..e70cbcb8f 100644 --- a/holder/src/main/res/navigation/holder_nav_graph_main.xml +++ b/holder/src/main/res/navigation/holder_nav_graph_main.xml @@ -249,64 +249,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataExportUseCaseImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataExportUseCaseImplTest.kt deleted file mode 100644 index 1ec499f8e..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataExportUseCaseImplTest.kt +++ /dev/null @@ -1,46 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.Moshi -import io.mockk.coEvery -import io.mockk.mockk -import kotlinx.coroutines.test.runTest -import nl.rijksoverheid.ctr.persistence.database.HolderDatabase -import nl.rijksoverheid.ctr.persistence.database.entities.EventGroupEntity -import nl.rijksoverheid.ctr.persistence.database.entities.OriginType -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith -import org.koin.test.AutoCloseKoinTest -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class DataExportUseCaseImplTest : AutoCloseKoinTest() { - - private val holderDatabase: HolderDatabase = mockk() - private val stringDataZipper: StringDataZipper = mockk() - private val moshi = Moshi.Builder().build() - - @Test - fun `event group entity exports to migration parcels`() = runTest { - coEvery { holderDatabase.eventGroupDao().getAll() } returns listOf( - EventGroupEntity( - id = 1, - walletId = 1, - providerIdentifier = "ZZZ", - type = OriginType.Vaccination, - scope = "", - draft = false, - expiryDate = null, - jsonData = "".toByteArray() - ) - ) - - coEvery { stringDataZipper.zip(any()) } returns "Xi8RQlrQWV4nfZbaox3KL3vjVU6x8Dh5qr20Unao3LN74ckv6mHXDNglCH/UXeefnNQxg52y6/bl0rPuEiUdR+P5hCgu2uTBFhvArKjCfXOqYeRVSDzpyY9zyJAUTcQdzA0OmHFlUEf1R7nQXOaj4lgvZdQEHMucSrOvsPzgTuEekYy0Nzb1wG6in0jVfT4rXLjatVR3fl4vUpSRP8olKVWuGUP0cXLlSe4maxy/U1jvM0UFh3E4C3PiEc1Sd2a60wcjpKijeUdxfadcvpRC3szAFmMTdkQs5XudkM42OvLxJUYw/wkqFhum1pJCPfws17t6jzdnMU8nhONqIXcaz68s0vdLPEuZYyeLEMwx1JCa9GnBwQkZl0u6g/GTZ0wPpOvuJtdP7szlCTXKXKeIKKmJs72XsW21aqjMb8ulnyyRB7dAErHW3Gmb5EeEc3Pdzlm2fSltI6o26FIkHybePkVOn3IxmkSYicWeMqcBfZimWo0PMrCCx/6GiuZ4QrpUcWNJf9icntsjDYMwg75wh9pssDZDyWsh5ZmKbVQivCvtzTVS9kriU61m0IkaFWKztiEyLiYmGl/OYfB6kUynQxDpIVhMK7M6m07EaT4Zpu7JwXM6/HimVu9O7kyhjrjqHkgsMsu6+sPYIL2IRiic3BkKntSdPe1gW6PGrzHVxkmGCiUqlTWsSbS/2OZdRbMSXaOy7HOu+u1r6iZWicIz2TYw++BOUdBqORbpMN5ZxBBD45N0FNZv52oxnmk+5kZss0tvY6jNE1mCEx1Mdt4bLRULin4qtGPu".toByteArray() - - val dataExportUseCase = DataExportUseCaseImpl(holderDatabase, moshi, stringDataZipper) - - val migrationParcels = dataExportUseCase.export() - - assertEquals(2, migrationParcels.size) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationImportUseCaseImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationImportUseCaseImplTest.kt deleted file mode 100644 index 9ba19afb2..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationImportUseCaseImplTest.kt +++ /dev/null @@ -1,43 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.Moshi -import io.mockk.mockk -import kotlin.test.assertEquals -import kotlin.test.assertNotNull -import kotlinx.coroutines.test.runTest -import nl.rijksoverheid.ctr.api.json.Base64JsonAdapter -import nl.rijksoverheid.ctr.api.json.JsonObjectJsonAdapter -import nl.rijksoverheid.ctr.api.json.LocalDateJsonAdapter -import nl.rijksoverheid.ctr.api.json.OffsetDateTimeJsonAdapter -import org.junit.Test -import org.junit.runner.RunWith -import org.koin.test.AutoCloseKoinTest -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class DataMigrationImportUseCaseImplTest : AutoCloseKoinTest() { - - private val moshi = Moshi.Builder() - .add(Base64JsonAdapter()) - .add(JsonObjectJsonAdapter()) - .add(OffsetDateTimeJsonAdapter()) - .add(LocalDateJsonAdapter()) - .build() - - private val stringDataZipper = mockk() - - private val dataMigrationUseCase = DataMigrationImportUseCaseImpl(moshi, stringDataZipper) - - @Test - fun `convert migration qr string to migration parcel`() = runTest { - val content = - "eyJpIjo4LCJuIjoxNywicCI6InpGSVUzams4K0xXeWNkYVBJK1NwanpMMkpjdnhJMnRUQlB5V1ZLaiswTzdZUU8wSkhrTnlGS3d2Qm55QWRyckVlWGpyQ1lIcXRrSFJUVEZrMXcySDRXSk9oQ0FMdnZEWVFJaURWUU0xSmdhTitHNDZYRUtjS0lVYWdvSkVpay9JTExUVExxVGRrQzFuSlZEbE5TNGZ3UDlDTzZxWWJFQXpWaDRQMHY0M3FOZWt1WFFVZU5LMHdGSEFrL1lFV1FxWURNc3NXczliWkhicGtwZ0xTVUdmd3hyMEhYZzRoajRIcWR1ODYzamJBZXQ3aFRmZVRmZDQvdFFQREcwMVRoMGZGclYrVnMxbklRMHpDdGFQcHpPMldFY0swT09ZVGFDM3BleDgwRnUvaEl6OEJGNWM5d3VjYjcyUjYyZlFHMkNVVmU4ZzV3OUNHbWdiY1lpUXZoNXdiQ0RCbE5KOEZhTHpURDlpcGFKN0dVSWN0U3dRdis4bmQralhmaktOVWdIdEYyLzM3L01pZ1hibjMvTklia0JvMGE0UU9HYWhkaUdqZjJUeGRyeEVpYjNnWklGNVRvc2Vuem1pRDRMcG5Zdmk4WDMrcFlBN1paSnpvWmx4R0lER3BETUpIQ3B0VjNmcmVhVGRzUWhUME9NSGFBQjRUWElqQTRYMm1JRjFLSUo2RFN0Qk1STjRuOFhyZnZrNkZ4WVlrd1dRd1FmdEpldStiYnpxTlBCdHBxQjJvUDRlYTM2aDNleWZnYWVCcS8rZDhUWWd6NnMvSHFBV0U2eHlrN0VvQ1N2SVRCb0ZkOFdiWC9kalArZHZzTUR6MGl0NDhnbDVaSUx4YjZCT0htcmxmNVdFa0YydnBNVi93L3QvczkvVG9lODhVeXcwWThEYnhtT3dmaVJTbkI1cjRIZjZhN3paSHNiL3V2WEU5N2tBckxmK0g1LzNBZlArT3UrRDM1ZVJjM1RuR1hJVmtXanN1SXRURTBtWS8rQVZXUFJGdThrTGVOUk5Qbis3S3pFK1pJKy93RWRUNExscnhadVVEL1VIV1hSd1Z2T1F0czB0IiwidiI6IkNDMSJ9" - - val migrationParcel = dataMigrationUseCase.import(content) - - assertNotNull(migrationParcel) - assertEquals("CC1", migrationParcel.version) - assertEquals(8, migrationParcel.index) - assertEquals(17, migrationParcel.numberOfPackages) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationPayloadUseCaseImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationPayloadUseCaseImplTest.kt deleted file mode 100644 index 9a81266b9..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationPayloadUseCaseImplTest.kt +++ /dev/null @@ -1,68 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import com.squareup.moshi.Moshi -import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory -import io.mockk.every -import io.mockk.mockk -import kotlin.test.assertNotNull -import nl.rijksoverheid.ctr.api.json.Base64JsonAdapter -import nl.rijksoverheid.ctr.api.json.JsonObjectJsonAdapter -import nl.rijksoverheid.ctr.api.json.LocalDateJsonAdapter -import nl.rijksoverheid.ctr.api.json.OffsetDateTimeJsonAdapter -import nl.rijksoverheid.ctr.holder.api.OriginTypeJsonAdapter -import nl.rijksoverheid.ctr.holder.api.RemoteCouplingStatusJsonAdapter -import nl.rijksoverheid.ctr.holder.api.RemoteTestStatusJsonAdapter -import nl.rijksoverheid.ctr.holder.get_events.models.RemoteEvent -import nl.rijksoverheid.ctr.holder.paper_proof.usecases.GetEventsFromPaperProofQrUseCase -import org.junit.Test -import org.junit.runner.RunWith -import org.koin.test.AutoCloseKoinTest -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class DataMigrationPayloadUseCaseImplTest : AutoCloseKoinTest() { - private val moshi = Moshi.Builder() - .add(Base64JsonAdapter()) - .add(JsonObjectJsonAdapter()) - .add(OffsetDateTimeJsonAdapter()) - .add(LocalDateJsonAdapter()) - .add(RemoteTestStatusJsonAdapter()) - .add(OriginTypeJsonAdapter()) - .add(RemoteCouplingStatusJsonAdapter()) - .add( - PolymorphicJsonAdapterFactory.of( - RemoteEvent::class.java, "type" - ) - .withSubtype(RemoteEvent.getRemoteEventClassFromType(RemoteEvent.TYPE_POSITIVE_TEST), RemoteEvent.TYPE_POSITIVE_TEST) - .withSubtype(RemoteEvent.getRemoteEventClassFromType(RemoteEvent.TYPE_RECOVERY), RemoteEvent.TYPE_RECOVERY) - .withSubtype(RemoteEvent.getRemoteEventClassFromType(RemoteEvent.TYPE_NEGATIVE_TEST), RemoteEvent.TYPE_NEGATIVE_TEST) - .withSubtype(RemoteEvent.getRemoteEventClassFromType(RemoteEvent.TYPE_VACCINATION), RemoteEvent.TYPE_VACCINATION) - ) - .add(KotlinJsonAdapterFactory()) - .build() - - private val getEventsFromPaperProofQrUseCase = mockk() - private val dataMigrationPayloadUseCase = DataMigrationPayloadUseCaseImpl(moshi, getEventsFromPaperProofQrUseCase) - - @Test - fun `get remoteprotocol from non dcc payload`() { - val jsonData = - "{\"payload\":\"eyJwcm90b2NvbFZlcnNpb24iOiIzLjAiLCJwcm92aWRlcklkZW50aWZpZXIiOiJaWloiLCJzdGF0dXMiOiJjb21wbGV0ZSIsImhvbGRlciI6eyJmaXJzdE5hbWUiOiJDb3JyaWUiLCJpbmZpeCI6InZhbiIsImxhc3ROYW1lIjoiR2VlciIsImJpcnRoRGF0ZSI6IjE5NjAtMDEtMDEifSwiZXZlbnRzIjpbeyJ0eXBlIjoicG9zaXRpdmV0ZXN0IiwidW5pcXVlIjoiZGRmNDMyYTMtNTQ2OC00ODBiLThlYWYtNzg3NDFiMWE4OTYyIiwiaXNTcGVjaW1lbiI6dHJ1ZSwicG9zaXRpdmV0ZXN0Ijp7InNhbXBsZURhdGUiOiIyMDIzLTAzLTI1VDEwOjAxWiIsInBvc2l0aXZlUmVzdWx0Ijp0cnVlLCJmYWNpbGl0eSI6IkdHRCBYTCBBbXN0ZXJkYW0iLCJ0eXBlIjoiTFA2NDY0LTQiLCJuYW1lIjoiUENSIE5hbWUiLCJtYW51ZmFjdHVyZXIiOiJQQ1IgTWFudWZhY3R1cmVyIiwiY291bnRyeSI6Ik5MIn19XX0=\",\"signature\":\"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\"}" - - val remoteProtocol = dataMigrationPayloadUseCase.parsePayload(jsonData.toByteArray()) - - assertNotNull(remoteProtocol) - } - - @Test - fun `get remoteprotocol from dcc payload`() { - val jsonData = - "{\"couplingCode\":\"ZKGBKH\",\"credential\":\"HC1:NCFC20490T9WTWGVLKS79 1VYLTXZM8AVX*4FBBU42*70J+9DN03E54F3/Y1LOCY50.FK8ZKO/EZKEZ967L6C56GVC*JC1A6C%63W5Y96746TPCBEC7ZKW.CC9DCECS34\$ CXKEW.CAWEV+A3+9K09GY8 JC2/DSN83LEQEDMPCG/DY-CB1A5IAVY87:EDOL9WEQDD+Q6TW6FA7C466KCN9E%961A6DL6FA7D46.JCP9EJY8L/5M/5546.96VF6.JCBECB1A-:8\$966469L6OF6VX6FVCPD0KQEPD0LVC6JD846Y96*963W5.A6UPCBJCOT9+EDL8FHZ95/D QEALEN44:+C%69AECAWE:34: CJ.CZKE9440/D+34S9E5LEWJC0FD3%4AIA%G7ZM81G72A6J+9SG77N91R6E+9LCBMIBQCAYM8UIB51A9Y9AF6WA6I4817S6ZKH/C3*F*\$GR4N2+5F8FM B\$W6KU91A9WTO8S1QK87DBBMHDKFT*UMNCI3V\$LS.QFWMF18W6TH5\$9W+4QZLU71.5DB73000FGWU/0CRF\"}" - every { getEventsFromPaperProofQrUseCase.get(any()) } returns mockk() - - val remoteProtocol = dataMigrationPayloadUseCase.parsePayload(jsonData.toByteArray()) - - assertNotNull(remoteProtocol) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrViewModelImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrViewModelImplTest.kt deleted file mode 100644 index 4b49155a9..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationScanQrViewModelImplTest.kt +++ /dev/null @@ -1,192 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import io.mockk.coEvery -import io.mockk.mockk -import kotlin.test.assertTrue -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.setMain -import nl.rijksoverheid.ctr.getOrAwaitValue -import nl.rijksoverheid.ctr.holder.get_events.usecases.ConfigProvidersUseCase -import nl.rijksoverheid.ctr.holder.get_events.usecases.EventProvidersResult -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationDecodingErrorException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationInvalidNumberOfPackagesException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationInvalidVersionException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationOtherException -import nl.rijksoverheid.ctr.shared.exceptions.NoProvidersException -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Rule -import org.junit.Test - -class DataMigrationScanQrViewModelImplTest { - - @get:Rule - val instantExecutorRule = InstantTaskExecutorRule() - - private val dataMigrationImportUseCase: DataMigrationImportUseCase = mockk() - private val dataMigrationPayloadUseCase: DataMigrationPayloadUseCase = mockk() - private val configProvidersUseCase: ConfigProvidersUseCase = mockk() - - private val viewModel = DataMigrationScanQrViewModelImpl( - dataMigrationImportUseCase, - dataMigrationPayloadUseCase, - configProvidersUseCase - ) - - @Before - fun setup() { - Dispatchers.setMain(UnconfinedTestDispatcher()) - } - - @Test - fun `given a qr that throws exception when importing it, then app state is DataMigrationImport error`() { - coEvery { dataMigrationImportUseCase.import(any()) } throws Exception("Import failed") - - viewModel.onQrScanned("qrcodecontent") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Error) - assertTrue(dataMigrationScanQrState.errorResult.e is DataMigrationDecodingErrorException) - } - - @Test - fun `given a qr that generates no migration parcel, then app state is DataMigrationImport error`() { - coEvery { dataMigrationImportUseCase.import(any()) } returns null - - viewModel.onQrScanned("qrcodecontent") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Error) - assertTrue(dataMigrationScanQrState.errorResult.e is DataMigrationOtherException) - } - - @Test - fun `given a qr that generates a migration parcel with different version, then app state is DataMigrationImport error`() { - coEvery { dataMigrationImportUseCase.import(any()) } returns mockk().apply { - coEvery { version } returns "CC2" - } - - viewModel.onQrScanned("qrcodecontent") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Error) - assertTrue(dataMigrationScanQrState.errorResult.e is DataMigrationInvalidVersionException) - } - - @Test - fun `given a qr that generates a valid migration parcel, then app state updates progress`() { - coEvery { dataMigrationImportUseCase.import(any()) } returns MigrationParcel( - index = 1, - numberOfPackages = 10, - payload = "", - version = "CC1" - ) - - viewModel.onQrScanned("qrcodecontent") - - val progressBarLiveData = viewModel.progressBarLiveData.getOrAwaitValue() - - assertEquals(10, progressBarLiveData.calculateProgressPercentage()) - } - - @Test - fun `given a qr that generates a migration parcel with bigger number of packages, then app state is DataMigrationImport error`() { - coEvery { dataMigrationImportUseCase.import(any()) } returnsMany listOf( - MigrationParcel( - index = 1, - numberOfPackages = 10, - payload = "", - version = "CC1" - ), - MigrationParcel( - index = 1, - numberOfPackages = 1, - payload = "", - version = "CC1" - ) - ) - - viewModel.onQrScanned("qrcodecontent1") - viewModel.onQrScanned("qrcodecontent2") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Error) - assertTrue(dataMigrationScanQrState.errorResult.e is DataMigrationInvalidNumberOfPackagesException) - } - - @Test - fun `given a qr that generates a migration parcel that fails to merge to an event parcel, then app state is DataMigrationImport error`() { - coEvery { dataMigrationImportUseCase.import(any()) } returns MigrationParcel( - index = 1, - numberOfPackages = 1, - payload = "", - version = "CC1" - ) - coEvery { dataMigrationImportUseCase.merge(any()) } throws Exception("exception") - - viewModel.onQrScanned("qrcodecontent1") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Error) - assertTrue(dataMigrationScanQrState.errorResult.e is DataMigrationDecodingErrorException) - } - - @Test - fun `given a qr that generates a migration parcel but we have no event providers, then app state is DataMigrationImport error`() { - coEvery { dataMigrationImportUseCase.import(any()) } returns MigrationParcel( - index = 1, - numberOfPackages = 1, - payload = "", - version = "CC1" - ) - coEvery { dataMigrationImportUseCase.merge(any()) } returns listOf(mockk().apply { - coEvery { jsonData } returns "".toByteArray() - }) - coEvery { dataMigrationPayloadUseCase.parsePayload(any()) } returns mockk() - coEvery { configProvidersUseCase.eventProviders() } returns EventProvidersResult.Error(mockk()) - - viewModel.onQrScanned("qrcodecontent1") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Error) - assertTrue(dataMigrationScanQrState.errorResult.e is NoProvidersException.Migration) - } - - @Test - fun `given a qr that generated all migrations parcels, then app state is Success`() { - coEvery { dataMigrationImportUseCase.import(any()) } returns MigrationParcel( - index = 1, - numberOfPackages = 1, - payload = "", - version = "CC1" - ) - coEvery { dataMigrationImportUseCase.merge(any()) } returns listOf(mockk().apply { - coEvery { jsonData } returns "".toByteArray() - }) - coEvery { dataMigrationPayloadUseCase.parsePayload(any()) } returns mockk() - coEvery { configProvidersUseCase.eventProviders() } returns EventProvidersResult.Success( - listOf() - ) - - viewModel.onQrScanned("qrcodecontent1") - - val dataMigrationScanQrState = - viewModel.scanFinishedLiveData.getOrAwaitValue().peekContent() - - assertTrue(dataMigrationScanQrState is DataMigrationScanQrState.Success) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeViewModelImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeViewModelImplTest.kt deleted file mode 100644 index b3f7f9942..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationShowQrCodeViewModelImplTest.kt +++ /dev/null @@ -1,71 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import io.mockk.coEvery -import io.mockk.mockk -import java.io.IOException -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.setMain -import nl.rijksoverheid.ctr.getOrAwaitValue -import nl.rijksoverheid.ctr.holder.qrcodes.usecases.QrCodeUseCase -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationCompressionException -import nl.rijksoverheid.ctr.shared.exceptions.DataMigrationOtherException -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Rule -import org.junit.Test - -class DataMigrationShowQrCodeViewModelImplTest { - - @get:Rule - val instantExecutorRule = InstantTaskExecutorRule() - - private val dataExportUseCase: DataExportUseCase = mockk() - private val qrCodeUseCase: QrCodeUseCase = mockk() - - private val viewModel = DataMigrationShowQrCodeViewModelImpl(dataExportUseCase, qrCodeUseCase) - - @Before - fun setup() { - Dispatchers.setMain(UnconfinedTestDispatcher()) - } - - @Test - fun `generateQrCodes with no errors generates qr codes`() { - coEvery { dataExportUseCase.export() } returns listOf("") - coEvery { qrCodeUseCase.qrCode(any(), any(), any(), any(), any()) } returns mockk() - - viewModel.generateQrCodes(800) - - assertTrue(viewModel.qrCodesLiveData.getOrAwaitValue() is DataMigrationShowQrViewState.ShowQrs) - } - - @Test - fun `generateQrCodes with export error shows error`() { - coEvery { dataExportUseCase.export() } throws IOException("") - - viewModel.generateQrCodes(800) - - val state = viewModel.qrCodesLiveData.getOrAwaitValue() - - assertTrue( - (state as DataMigrationShowQrViewState.ShowError).errorResults.first() - .getException() is DataMigrationCompressionException - ) - } - - @Test - fun `generateQrCodes with other error shows error`() { - coEvery { dataExportUseCase.export() } throws Exception("") - - viewModel.generateQrCodes(800) - - val state = viewModel.qrCodesLiveData.getOrAwaitValue() - - assertTrue( - (state as DataMigrationShowQrViewState.ShowError).errorResults.first() - .getException() is DataMigrationOtherException - ) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationUseCaseImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationUseCaseImplTest.kt deleted file mode 100644 index a9d6c509b..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/DataMigrationUseCaseImplTest.kt +++ /dev/null @@ -1,43 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import io.mockk.coEvery -import io.mockk.mockk -import kotlinx.coroutines.test.runTest -import nl.rijksoverheid.ctr.persistence.database.HolderDatabase -import nl.rijksoverheid.ctr.persistence.database.entities.EventGroupEntity -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Test - -class DataMigrationUseCaseImplTest { - - private val holderDatabase = mockk() - private val dataMigrationUseCase = DataMigrationUseCaseImpl(holderDatabase) - - @Test - fun `canTransferData returns false for draft only events`() = runTest { - val events = listOf( - mockk().apply { - coEvery { draft } returns true - } - ) - coEvery { holderDatabase.eventGroupDao().getAll() } returns events - - assertFalse(dataMigrationUseCase.canTransferData()) - } - - @Test - fun `canTransferData returns true if non draft events exist`() = runTest { - val events = listOf( - mockk().apply { - coEvery { draft } returns true - }, - mockk().apply { - coEvery { draft } returns false - } - ) - coEvery { holderDatabase.eventGroupDao().getAll() } returns events - - assertTrue(dataMigrationUseCase.canTransferData()) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/ProgressBarStateTests.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/ProgressBarStateTests.kt deleted file mode 100644 index 51d9ecb39..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/data_migration/ProgressBarStateTests.kt +++ /dev/null @@ -1,16 +0,0 @@ -package nl.rijksoverheid.ctr.holder.data_migration - -import kotlin.test.assertEquals -import org.junit.Test - -class ProgressBarStateTests { - @Test - fun calculateProgressPercentage() { - val progressBarState = ProgressBarState( - max = 17, - progress = 15 - ) - - assertEquals(88, progressBarState.calculateProgressPercentage()) - } -} diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModelImplTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModelImplTest.kt index 9e37e05ec..b927cf606 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModelImplTest.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/holder/menu/MenuViewModelImplTest.kt @@ -5,13 +5,11 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.test.core.app.ApplicationProvider import io.mockk.every import io.mockk.mockk -import nl.rijksoverheid.ctr.design.fragments.menu.MenuFragmentDirections import nl.rijksoverheid.ctr.design.fragments.menu.MenuSection import nl.rijksoverheid.ctr.holder.R import nl.rijksoverheid.ctr.holder.usecases.HolderFeatureFlagUseCase import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -29,13 +27,10 @@ class MenuViewModelImplTest : AutoCloseKoinTest() { } private val featureFlagUseCase = mockk().apply { every { getAddEventsButtonEnabled() } returns true - every { getScanCertificateButtonEnabled() } returns true - every { getMigrateButtonEnabled() } returns true - every { isInArchiveMode() } returns false + every { isInArchiveMode() } returns true } @Test - @Ignore fun `on menu click get correct menu items`() { val menuViewModel = MenuViewModelImpl(helpMenuDataModel, featureFlagUseCase) @@ -43,29 +38,20 @@ class MenuViewModelImplTest : AutoCloseKoinTest() { val menuSections = menuViewModel.menuSectionLiveData.value!!.peekContent() assertEquals(2, menuSections[0].menuItems.size) - assertEquals(R.drawable.ic_menu_add, menuSections[0].menuItems[0].icon) + assertEquals(R.drawable.ic_menu_export_pdf, menuSections[0].menuItems[0].icon) assertEquals( - R.string.holder_menu_listItem_addVaccinationOrTest_title, + R.string.holder_menu_exportPDF, menuSections[0].menuItems[0].title ) assertTrue(menuSections[0].menuItems[0].onClick is MenuSection.MenuItem.OnClick.Navigate) - assertEquals(R.drawable.ic_menu_paper, menuSections[0].menuItems[1].icon) - assertEquals(R.string.holder_menu_paperproof_title, menuSections[0].menuItems[1].title) + assertEquals(R.drawable.ic_menu_add, menuSections[0].menuItems[1].icon) + assertEquals(R.string.holder_menu_listItem_addVaccinationOrTest_title, menuSections[0].menuItems[1].title) assertTrue(menuSections[0].menuItems[1].onClick is MenuSection.MenuItem.OnClick.Navigate) - assertEquals(2, menuSections[1].menuItems.size) - - assertEquals(R.drawable.ic_menu_saved_events, menuSections[1].menuItems[0].icon) - assertEquals(R.string.holder_menu_storedEvents, menuSections[1].menuItems[0].title) - assertTrue(menuSections[1].menuItems[0].onClick is MenuSection.MenuItem.OnClick.Navigate) - assertEquals(R.drawable.ic_menu_data_migration, menuSections[1].menuItems[1].icon) - assertEquals(R.string.holder_menu_migration, menuSections[1].menuItems[1].title) - assertEquals( - MenuFragmentDirections.actionDataMigration().actionId, - (menuSections[1].menuItems[1].onClick as MenuSection.MenuItem.OnClick.Navigate).navigationActionId - ) - - assertEquals(R.drawable.ic_menu_info, menuSections[2].menuItems[0].icon) - assertEquals(R.string.holder_menu_helpInfo, menuSections[2].menuItems[0].title) + assertEquals(R.drawable.ic_menu_saved_events, menuSections[2].menuItems[0].icon) + assertEquals(R.string.holder_menu_storedEvents, menuSections[2].menuItems[0].title) assertTrue(menuSections[2].menuItems[0].onClick is MenuSection.MenuItem.OnClick.Navigate) + assertEquals(R.drawable.ic_menu_info, menuSections[2].menuItems[1].icon) + assertEquals(R.string.holder_menu_helpInfo, menuSections[2].menuItems[1].title) + assertTrue(menuSections[2].menuItems[1].onClick is MenuSection.MenuItem.OnClick.Navigate) } } diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerFragmentTest.kt b/holder/src/test/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerFragmentTest.kt deleted file mode 100644 index aebd95f63..000000000 --- a/holder/src/test/java/nl/rijksoverheid/ctr/holder/paper_proof/PaperProofQrScannerFragmentTest.kt +++ /dev/null @@ -1,49 +0,0 @@ -package nl.rijksoverheid.ctr.holder.paper_proof - -import android.content.Context -import androidx.fragment.app.testing.launchFragmentInContainer -import androidx.lifecycle.ViewModelStore -import androidx.navigation.Navigation -import androidx.navigation.testing.TestNavHostController -import androidx.test.core.app.ApplicationProvider -import com.adevinta.android.barista.internal.assertAny -import com.adevinta.android.barista.internal.matcher.TextColorMatcher -import com.adevinta.android.barista.internal.matcher.withCompatText -import nl.rijksoverheid.ctr.holder.R -import org.junit.Test -import org.junit.runner.RunWith -import org.koin.test.AutoCloseKoinTest -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class PaperProofQrScannerFragmentTest : AutoCloseKoinTest() { - - private val navController = TestNavHostController( - ApplicationProvider.getApplicationContext() - ).also { - it.setViewModelStore(ViewModelStore()) - it.setGraph(R.navigation.holder_nav_graph_root) - it.setCurrentDestination(R.id.nav_paper_proof_qr_scanner) - } - - @Test - fun `scanner toolbar title color is white`() { - launchFragment() - - val toolbarTitle = ApplicationProvider.getApplicationContext() - .getString(R.string.add_paper_proof_qr_scanner_title) - withCompatText(toolbarTitle).assertAny(TextColorMatcher(R.color.white)) - } - - private fun launchFragment() { - launchFragmentInContainer(themeResId = R.style.AppTheme) { - PaperProofQrScannerFragment().also { - it.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner -> - if (viewLifecycleOwner != null) { - Navigation.setViewNavController(it.requireView(), navController) - } - } - } - } - } -}