diff --git a/app/src/main/java/org/fairscan/app/FairScanApp.kt b/app/src/main/java/org/fairscan/app/FairScanApp.kt index b3cb446..b49e6e1 100644 --- a/app/src/main/java/org/fairscan/app/FairScanApp.kt +++ b/app/src/main/java/org/fairscan/app/FairScanApp.kt @@ -94,3 +94,15 @@ class AppContainer(context: Context) { return now - lastModified > 24 * 60 * 60 * 1000 // 24h } } + +class SessionViewModelFactory( + private val application: Application, + private val launchMode: LaunchMode, + private val appContainer: AppContainer +) : ViewModelProvider.Factory { + + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + return SessionViewModel(application, launchMode, appContainer) as T + } +} diff --git a/app/src/main/java/org/fairscan/app/MainActivity.kt b/app/src/main/java/org/fairscan/app/MainActivity.kt index 54f13ce..dec70ed 100644 --- a/app/src/main/java/org/fairscan/app/MainActivity.kt +++ b/app/src/main/java/org/fairscan/app/MainActivity.kt @@ -43,7 +43,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.toClipEntry import androidx.compose.ui.res.stringResource import androidx.core.content.ContextCompat.checkSelfPermission -import androidx.core.content.FileProvider import androidx.core.net.toFile import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope @@ -63,11 +62,11 @@ import org.fairscan.app.ui.screens.about.createEmailWithImageIntent import org.fairscan.app.ui.screens.camera.CameraEvent import org.fairscan.app.ui.screens.camera.CameraScreen import org.fairscan.app.ui.screens.camera.CameraViewModel +import org.fairscan.app.ui.screens.export.ExportActions import org.fairscan.app.ui.screens.export.ExportEvent import org.fairscan.app.ui.screens.export.ExportResult import org.fairscan.app.ui.screens.export.ExportScreenWrapper import org.fairscan.app.ui.screens.export.ExportViewModel -import org.fairscan.app.ui.screens.export.ExportActions import org.fairscan.app.ui.screens.home.HomeScreen import org.fairscan.app.ui.screens.home.HomeViewModel import org.fairscan.app.ui.screens.settings.ExportFormat @@ -76,7 +75,6 @@ import org.fairscan.app.ui.screens.settings.SettingsViewModel import org.fairscan.app.ui.theme.FairScanTheme import org.opencv.android.OpenCVLoader import java.io.File -import java.util.UUID class MainActivity : ComponentActivity() { @@ -85,27 +83,32 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initLibraries() + val appContainer = (application as FairScanApp).appContainer val launchMode = resolveLaunchMode(intent) - sessionDir = when (launchMode) { - LaunchMode.NORMAL -> filesDir - LaunchMode.EXTERNAL_SCAN_TO_PDF -> - File(appContainer.sessionsRoot(), UUID.randomUUID().toString()).apply { mkdirs() } + + val sessionViewModel: SessionViewModel by viewModels { + SessionViewModelFactory( + application = application, + launchMode = launchMode, + appContainer = appContainer + ) } - val sessionContainer = ScanSessionContainer(this, sessionDir) + + val imageRepository = sessionViewModel.imageRepository val viewModel: MainViewModel by viewModels { appContainer.viewModelFactory { - MainViewModel(sessionContainer.imageRepository, launchMode) + MainViewModel(imageRepository, launchMode) } } val exportViewModel: ExportViewModel by viewModels { appContainer.viewModelFactory { - ExportViewModel(appContainer, sessionContainer.imageRepository) + ExportViewModel(appContainer, imageRepository) } } val aboutViewModel: AboutViewModel by viewModels { appContainer.viewModelFactory { - AboutViewModel(appContainer, sessionContainer.imageRepository) + AboutViewModel(appContainer, imageRepository) } } val homeViewModel: HomeViewModel by viewModels { appContainer.homeViewModelFactory } @@ -126,7 +129,7 @@ class MainActivity : ComponentActivity() { val cameraPermission = rememberCameraPermissionState() CollectCameraEvents(cameraViewModel, viewModel) CollectExportEvents(context, exportViewModel) - CollectAboutEvents(context, aboutViewModel, sessionContainer.imageRepository) + CollectAboutEvents(context, aboutViewModel, imageRepository) FairScanTheme { val navigation = navigation(viewModel, launchMode) diff --git a/app/src/main/java/org/fairscan/app/ScanSessionContainer.kt b/app/src/main/java/org/fairscan/app/SessionViewModel.kt similarity index 63% rename from app/src/main/java/org/fairscan/app/ScanSessionContainer.kt rename to app/src/main/java/org/fairscan/app/SessionViewModel.kt index 8cc4ac2..1937a91 100644 --- a/app/src/main/java/org/fairscan/app/ScanSessionContainer.kt +++ b/app/src/main/java/org/fairscan/app/SessionViewModel.kt @@ -14,10 +14,36 @@ */ package org.fairscan.app +import android.app.Application import android.content.Context +import androidx.lifecycle.AndroidViewModel import org.fairscan.app.data.ImageRepository import org.fairscan.app.platform.OpenCvTransformations import java.io.File +import java.util.UUID + +class SessionViewModel( + app: Application, + launchMode: LaunchMode, + appContainer: AppContainer +) : AndroidViewModel(app) { + + val sessionDir: File = when (launchMode) { + LaunchMode.NORMAL -> + app.filesDir + + LaunchMode.EXTERNAL_SCAN_TO_PDF -> + File(appContainer.sessionsRoot(), UUID.randomUUID().toString()) + .apply { mkdirs() } + } + + private val sessionContainer = ScanSessionContainer( + context = app, + scanRootDir = sessionDir + ) + + val imageRepository: ImageRepository = sessionContainer.imageRepository +} class ScanSessionContainer( context: Context,