From 53fa74cc8367a9e8e76b9a9d1485f360c0603c11 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Sat, 11 Oct 2025 18:54:24 -0600 Subject: [PATCH] iOS Build 23 --- android/app/build.gradle.kts | 3 +- .../openclimb/data/sync/SyncService.kt | 272 +++++++++++--- .../openclimb/ui/components/ImagePicker.kt | 4 +- .../openclimb/ui/screens/AddEditScreens.kt | 6 +- .../openclimb/ui/screens/DetailScreens.kt | 2 +- .../openclimb/ui/screens/ProblemsScreen.kt | 4 +- .../openclimb/ui/screens/SettingsScreen.kt | 150 +++++++- .../openclimb/ui/viewmodel/ClimbViewModel.kt | 134 ++++++- .../openclimb/utils/ImageNamingUtils.kt | 57 ++- .../com/atridad/openclimb/utils/ImageUtils.kt | 102 ++++- android/gradle/libs.versions.toml | 2 + ios/OpenClimb.xcodeproj/project.pbxproj | 8 +- .../UserInterfaceState.xcuserstate | Bin 155792 -> 268403 bytes .../Components/PhotoOptionSheet.swift | 4 +- ios/OpenClimb/Services/SyncService.swift | 348 ++++++++++++++---- ios/OpenClimb/Utils/ImageManager.swift | 69 ++++ ios/OpenClimb/Utils/ImageNamingUtils.swift | 58 ++- .../ViewModels/ClimbingDataManager.swift | 94 ++++- .../Views/AddEdit/AddAttemptView.swift | 74 ++-- .../Views/AddEdit/AddEditProblemView.swift | 49 ++- .../Views/Detail/ProblemDetailView.swift | 28 +- ios/OpenClimb/Views/ProblemsView.swift | 33 +- ios/OpenClimb/Views/SettingsView.swift | 135 +++++++ 23 files changed, 1351 insertions(+), 285 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 7f4349a..556c8db 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -16,7 +16,7 @@ android { applicationId = "com.atridad.openclimb" minSdk = 31 targetSdk = 36 - versionCode = 35 + versionCode = 36 versionName = "1.8.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -60,6 +60,7 @@ dependencies { // Room Database implementation(libs.androidx.room.runtime) implementation(libs.androidx.room.ktx) + implementation(libs.androidx.exifinterface) ksp(libs.androidx.room.compiler) diff --git a/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt b/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt index ecd8b4a..5ca5f0d 100644 --- a/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt +++ b/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt @@ -25,6 +25,8 @@ import java.io.IOException import java.time.Instant import java.util.concurrent.TimeUnit import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -54,9 +56,9 @@ class SyncService(private val context: Context, private val repository: ClimbRep private val httpClient = OkHttpClient.Builder() - .connectTimeout(30, TimeUnit.SECONDS) - .readTimeout(60, TimeUnit.SECONDS) - .writeTimeout(60, TimeUnit.SECONDS) + .connectTimeout(45, TimeUnit.SECONDS) + .readTimeout(90, TimeUnit.SECONDS) + .writeTimeout(90, TimeUnit.SECONDS) .build() private val json = Json { @@ -86,6 +88,11 @@ class SyncService(private val context: Context, private val repository: ClimbRep private val _isTesting = MutableStateFlow(false) val isTesting: StateFlow = _isTesting.asStateFlow() + // Debounced sync properties + private var syncJob: Job? = null + private var pendingChanges = false + private val syncDebounceDelay = 2000L // 2 seconds + // Configuration keys private object Keys { const val SERVER_URL = "sync_server_url" @@ -137,6 +144,9 @@ class SyncService(private val context: Context, private val repository: ClimbRep repository.setAutoSyncCallback { kotlinx.coroutines.CoroutineScope(Dispatchers.IO).launch { triggerAutoSync() } } + + // Perform image naming migration on initialization + kotlinx.coroutines.CoroutineScope(Dispatchers.IO).launch { performImageNamingMigration() } } suspend fun downloadData(): ClimbDataBackup = @@ -297,6 +307,9 @@ class SyncService(private val context: Context, private val repository: ClimbRep try { val response = httpClient.newCall(request).execute() Log.d(TAG, "Image download response for $filename: ${response.code}") + if (response.code != 200) { + Log.w(TAG, "Failed request URL: ${request.url}") + } when (response.code) { 200 -> { @@ -426,28 +439,23 @@ class SyncService(private val context: Context, private val repository: ClimbRep totalImages += imageCount } - problem.imagePaths?.forEachIndexed { index, imagePath -> + problem.imagePaths?.forEach { imagePath -> try { - Log.d(TAG, "Attempting to download image: $imagePath") - val imageData = downloadImage(imagePath) - + // Use the server's actual filename, not regenerated val serverFilename = imagePath.substringAfterLast('/') - val consistentFilename = - if (ImageNamingUtils.isValidImageFilename(serverFilename)) { - serverFilename - } else { - ImageNamingUtils.generateImageFilename(problem.id, index) - } + + Log.d(TAG, "Attempting to download image: $serverFilename") + val imageData = downloadImage(serverFilename) val localImagePath = ImageUtils.saveImageFromBytesWithFilename( context, imageData, - consistentFilename + serverFilename ) if (localImagePath != null) { - imagePathMapping[serverFilename] = localImagePath + imagePathMapping[imagePath] = localImagePath downloadedImages++ Log.d( TAG, @@ -457,6 +465,12 @@ class SyncService(private val context: Context, private val repository: ClimbRep Log.w(TAG, "Failed to save downloaded image locally: $imagePath") failedImages++ } + } catch (e: SyncException.ImageNotFound) { + Log.w( + TAG, + "Image not found on server: $imagePath - might be missing or use different naming" + ) + failedImages++ } catch (e: Exception) { Log.w(TAG, "Failed to download image $imagePath: ${e.message}") failedImages++ @@ -495,32 +509,24 @@ class SyncService(private val context: Context, private val repository: ClimbRep if (imageFile.exists() && imageFile.length() > 0) { val imageData = imageFile.readBytes() + // Always use consistent problem-based naming for uploads + val consistentFilename = + ImageNamingUtils.generateImageFilename(problem.id, index) + val filename = imagePath.substringAfterLast('/') - val consistentFilename = - if (ImageNamingUtils.isValidImageFilename(filename)) { - filename - } else { - val newFilename = - ImageNamingUtils.generateImageFilename( - problem.id, - index - ) - val newFile = java.io.File(imageFile.parent, newFilename) - if (imageFile.renameTo(newFile)) { - Log.d( - TAG, - "Renamed local image file: $filename -> $newFilename" - ) - newFilename - } else { - Log.w( - TAG, - "Failed to rename local image file, using original" - ) - filename - } - } + // Rename local file if needed + if (filename != consistentFilename) { + val newFile = java.io.File(imageFile.parent, consistentFilename) + if (imageFile.renameTo(newFile)) { + Log.d( + TAG, + "Renamed local image file: $filename -> $consistentFilename" + ) + } else { + Log.w(TAG, "Failed to rename local image file, using original") + } + } Log.d(TAG, "Uploading image: $consistentFilename (${imageData.size} bytes)") uploadImage(consistentFilename, imageData) @@ -568,7 +574,21 @@ class SyncService(private val context: Context, private val repository: ClimbRep version = "2.0", formatVersion = "2.0", gyms = allGyms.map { BackupGym.fromGym(it) }, - problems = allProblems.map { BackupProblem.fromProblem(it) }, + problems = + allProblems.map { problem -> + // Normalize image paths to consistent naming in backup + val normalizedImagePaths = + problem.imagePaths?.mapIndexed { index, _ -> + ImageNamingUtils.generateImageFilename(problem.id, index) + } + + val backupProblem = BackupProblem.fromProblem(problem) + if (!normalizedImagePaths.isNullOrEmpty()) { + backupProblem.copy(imagePaths = normalizedImagePaths) + } else { + backupProblem + } + }, sessions = completedSessions.map { BackupClimbSession.fromClimbSession(it) }, attempts = completedAttempts.map { BackupAttempt.fromAttempt(it) }, deletedItems = repository.getDeletedItems() @@ -851,10 +871,8 @@ class SyncService(private val context: Context, private val repository: ClimbRep val localIds = local.map { it.id }.toSet() val deletedGymIds = deletedItems.filter { it.type == "gym" }.map { it.id }.toSet() - // Remove items that were deleted on other devices merged.removeAll { deletedGymIds.contains(it.id) } - // Add new items from server (excluding deleted ones) server.forEach { serverGym -> if (!localIds.contains(serverGym.id) && !deletedGymIds.contains(serverGym.id)) { try { @@ -878,24 +896,26 @@ class SyncService(private val context: Context, private val repository: ClimbRep val localIds = local.map { it.id }.toSet() val deletedProblemIds = deletedItems.filter { it.type == "problem" }.map { it.id }.toSet() - // Remove items that were deleted on other devices merged.removeAll { deletedProblemIds.contains(it.id) } - // Add new items from server (excluding deleted ones) server.forEach { serverProblem -> if (!localIds.contains(serverProblem.id) && !deletedProblemIds.contains(serverProblem.id) ) { try { val problemToAdd = - if (imagePathMapping.isNotEmpty()) { - val newImagePaths = - serverProblem.imagePaths?.map { oldPath -> - val filename = oldPath.substringAfterLast('/') - imagePathMapping[filename] ?: oldPath + if (imagePathMapping.isNotEmpty() && + !serverProblem.imagePaths.isNullOrEmpty() + ) { + val updatedImagePaths = + serverProblem.imagePaths?.mapNotNull { oldPath -> + imagePathMapping[oldPath] ?: oldPath } - ?: emptyList() - serverProblem.withUpdatedImagePaths(newImagePaths) + if (updatedImagePaths != serverProblem.imagePaths) { + serverProblem.copy(imagePaths = updatedImagePaths) + } else { + serverProblem + } } else { serverProblem } @@ -918,10 +938,8 @@ class SyncService(private val context: Context, private val repository: ClimbRep val localIds = local.map { it.id }.toSet() val deletedSessionIds = deletedItems.filter { it.type == "session" }.map { it.id }.toSet() - // Remove items that were deleted on other devices (but never remove active sessions) merged.removeAll { deletedSessionIds.contains(it.id) && it.status != SessionStatus.ACTIVE } - // Add new items from server (excluding deleted ones) server.forEach { serverSession -> if (!localIds.contains(serverSession.id) && !deletedSessionIds.contains(serverSession.id) @@ -946,10 +964,8 @@ class SyncService(private val context: Context, private val repository: ClimbRep val localIds = local.map { it.id }.toSet() val deletedAttemptIds = deletedItems.filter { it.type == "attempt" }.map { it.id }.toSet() - // Remove items that were deleted on other devices (but be conservative with attempts) merged.removeAll { deletedAttemptIds.contains(it.id) } - // Add new items from server (excluding deleted ones) server.forEach { serverAttempt -> if (!localIds.contains(serverAttempt.id) && !deletedAttemptIds.contains(serverAttempt.id) @@ -1093,19 +1109,54 @@ class SyncService(private val context: Context, private val repository: ClimbRep } if (_isSyncing.value) { - Log.d(TAG, "Sync already in progress, skipping auto-sync") + pendingChanges = true return } + syncJob?.cancel() + + syncJob = + kotlinx.coroutines.CoroutineScope(Dispatchers.IO).launch { + delay(syncDebounceDelay) + + do { + pendingChanges = false + + try { + syncWithServer() + } catch (e: Exception) { + Log.e(TAG, "Auto-sync failed: ${e.message}") + _syncError.value = e.message + return@launch + } + + if (pendingChanges) { + delay(syncDebounceDelay) + } + } while (pendingChanges) + } + } + + suspend fun forceSyncNow() { + if (!isConfigured || !_isConnected.value) return + + syncJob?.cancel() + syncJob = null + pendingChanges = false + try { syncWithServer() } catch (e: Exception) { - Log.e(TAG, "Auto-sync failed: ${e.message}") + Log.e(TAG, "Force sync failed: ${e.message}") _syncError.value = e.message } } fun clearConfiguration() { + syncJob?.cancel() + syncJob = null + pendingChanges = false + serverURL = "" authToken = "" isAutoSyncEnabled = true @@ -1116,6 +1167,113 @@ class SyncService(private val context: Context, private val repository: ClimbRep sharedPreferences.edit().clear().apply() updateConfiguredState() } + + // MARK: - Image Naming Migration + + private suspend fun performImageNamingMigration() = + withContext(Dispatchers.IO) { + val migrationKey = "image_naming_migration_completed" + if (sharedPreferences.getBoolean(migrationKey, false)) { + Log.d(TAG, "Image naming migration already completed") + return@withContext + } + + Log.d(TAG, "Starting image naming migration...") + var updateCount = 0 + + try { + // Get all problems with images + val problems = repository.getAllProblems().first() + val updatedProblems = mutableListOf() + + for (problem in problems) { + if (problem.imagePaths.isNullOrEmpty()) { + continue + } + + val updatedImagePaths = mutableListOf() + var hasChanges = false + + problem.imagePaths.forEachIndexed { index, imagePath -> + val currentFilename = imagePath.substringAfterLast('/') + val consistentFilename = + ImageNamingUtils.generateImageFilename(problem.id, index) + + if (currentFilename != consistentFilename) { + // Get the image file + val oldFile = ImageUtils.getImageFile(context, imagePath) + + if (oldFile.exists()) { + val newPath = "problem_images/$consistentFilename" + val newFile = ImageUtils.getImageFile(context, newPath) + + try { + // Create parent directory if needed + newFile.parentFile?.mkdirs() + + if (oldFile.renameTo(newFile)) { + updatedImagePaths.add(newPath) + hasChanges = true + updateCount++ + Log.d( + TAG, + "Migrated image: $currentFilename -> $consistentFilename" + ) + } else { + Log.w(TAG, "Failed to migrate image $currentFilename") + updatedImagePaths.add( + imagePath + ) // Keep original on failure + } + } catch (e: Exception) { + Log.w( + TAG, + "Failed to migrate image $currentFilename: ${e.message}" + ) + updatedImagePaths.add(imagePath) // Keep original on failure + } + } else { + updatedImagePaths.add( + imagePath + ) // Keep original if file doesn't exist + } + } else { + updatedImagePaths.add(imagePath) // Already consistent + } + } + + if (hasChanges) { + val updatedProblem = + problem.copy( + imagePaths = updatedImagePaths, + updatedAt = DateFormatUtils.formatISO8601(Instant.now()) + ) + updatedProblems.add(updatedProblem) + } + } + + // Update problems in database + if (updatedProblems.isNotEmpty()) { + updatedProblems.forEach { problem -> repository.updateProblem(problem) } + Log.d( + TAG, + "Updated ${updatedProblems.size} problems with migrated image paths" + ) + } + + // Mark migration as completed + sharedPreferences.edit().putBoolean(migrationKey, true).apply() + Log.d(TAG, "Image naming migration completed, updated $updateCount images") + + // Trigger sync after migration if images were updated + if (updateCount > 0) { + Log.d(TAG, "Triggering sync after image migration") + triggerAutoSync() + } + } catch (e: Exception) { + Log.e(TAG, "Image naming migration failed: ${e.message}", e) + } + } } sealed class SyncException(message: String) : Exception(message) { diff --git a/android/app/src/main/java/com/atridad/openclimb/ui/components/ImagePicker.kt b/android/app/src/main/java/com/atridad/openclimb/ui/components/ImagePicker.kt index 08ee0a3..a744058 100644 --- a/android/app/src/main/java/com/atridad/openclimb/ui/components/ImagePicker.kt +++ b/android/app/src/main/java/com/atridad/openclimb/ui/components/ImagePicker.kt @@ -56,7 +56,7 @@ fun ImagePicker( // Process images val newImagePaths = mutableListOf() urisToProcess.forEach { uri -> - val imagePath = ImageUtils.saveImageFromUri(context, uri) + val imagePath = ImageUtils.saveTemporaryImageFromUri(context, uri) if (imagePath != null) { newImagePaths.add(imagePath) } @@ -76,7 +76,7 @@ fun ImagePicker( success -> if (success) { cameraImageUri?.let { uri -> - val imagePath = ImageUtils.saveImageFromUri(context, uri) + val imagePath = ImageUtils.saveTemporaryImageFromUri(context, uri) if (imagePath != null) { val updatedUris = tempImageUris + imagePath tempImageUris = updatedUris diff --git a/android/app/src/main/java/com/atridad/openclimb/ui/screens/AddEditScreens.kt b/android/app/src/main/java/com/atridad/openclimb/ui/screens/AddEditScreens.kt index 3705ea4..1b785d3 100644 --- a/android/app/src/main/java/com/atridad/openclimb/ui/screens/AddEditScreens.kt +++ b/android/app/src/main/java/com/atridad/openclimb/ui/screens/AddEditScreens.kt @@ -248,6 +248,7 @@ fun AddEditProblemScreen( ) { val isEditing = problemId != null val gyms by viewModel.gyms.collectAsState() + val context = LocalContext.current // Problem form state var selectedGym by remember { @@ -387,10 +388,11 @@ fun AddEditProblemScreen( if (isEditing) { viewModel.updateProblem( - problem.copy(id = problemId!!) + problem.copy(id = problemId), + context ) } else { - viewModel.addProblem(problem) + viewModel.addProblem(problem, context) } onNavigateBack() } diff --git a/android/app/src/main/java/com/atridad/openclimb/ui/screens/DetailScreens.kt b/android/app/src/main/java/com/atridad/openclimb/ui/screens/DetailScreens.kt index 2a5ac9b..147598a 100644 --- a/android/app/src/main/java/com/atridad/openclimb/ui/screens/DetailScreens.kt +++ b/android/app/src/main/java/com/atridad/openclimb/ui/screens/DetailScreens.kt @@ -537,7 +537,7 @@ fun SessionDetailScreen( viewModel.addAttempt(attempt) showAddAttemptDialog = false }, - onProblemCreated = { problem -> viewModel.addProblem(problem) } + onProblemCreated = { problem -> viewModel.addProblem(problem, context) } ) } diff --git a/android/app/src/main/java/com/atridad/openclimb/ui/screens/ProblemsScreen.kt b/android/app/src/main/java/com/atridad/openclimb/ui/screens/ProblemsScreen.kt index 7277579..05c12f3 100644 --- a/android/app/src/main/java/com/atridad/openclimb/ui/screens/ProblemsScreen.kt +++ b/android/app/src/main/java/com/atridad/openclimb/ui/screens/ProblemsScreen.kt @@ -8,6 +8,7 @@ import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -25,6 +26,7 @@ import com.atridad.openclimb.ui.viewmodel.ClimbViewModel fun ProblemsScreen(viewModel: ClimbViewModel, onNavigateToProblemDetail: (String) -> Unit) { val problems by viewModel.problems.collectAsState() val gyms by viewModel.gyms.collectAsState() + val context = LocalContext.current var showImageViewer by remember { mutableStateOf(false) } var selectedImagePaths by remember { mutableStateOf>(emptyList()) } var selectedImageIndex by remember { mutableIntStateOf(0) } @@ -184,7 +186,7 @@ fun ProblemsScreen(viewModel: ClimbViewModel, onNavigateToProblemDetail: (String }, onToggleActive = { val updatedProblem = problem.copy(isActive = !problem.isActive) - viewModel.updateProblem(updatedProblem) + viewModel.updateProblem(updatedProblem, context) } ) Spacer(modifier = Modifier.height(8.dp)) diff --git a/android/app/src/main/java/com/atridad/openclimb/ui/screens/SettingsScreen.kt b/android/app/src/main/java/com/atridad/openclimb/ui/screens/SettingsScreen.kt index 78a6f92..0466508 100644 --- a/android/app/src/main/java/com/atridad/openclimb/ui/screens/SettingsScreen.kt +++ b/android/app/src/main/java/com/atridad/openclimb/ui/screens/SettingsScreen.kt @@ -42,6 +42,10 @@ fun SettingsScreen(viewModel: ClimbViewModel) { var showResetDialog by remember { mutableStateOf(false) } var showSyncConfigDialog by remember { mutableStateOf(false) } var showDisconnectDialog by remember { mutableStateOf(false) } + var showFixImagesDialog by remember { mutableStateOf(false) } + var showDeleteImagesDialog by remember { mutableStateOf(false) } + var isFixingImages by remember { mutableStateOf(false) } + var isDeletingImages by remember { mutableStateOf(false) } // Sync configuration state var serverUrl by remember { mutableStateOf(syncService.serverURL) } @@ -475,6 +479,88 @@ fun SettingsScreen(viewModel: ClimbViewModel) { Spacer(modifier = Modifier.height(8.dp)) + Card( + shape = RoundedCornerShape(12.dp), + colors = + CardDefaults.cardColors( + containerColor = + MaterialTheme.colorScheme.surfaceVariant.copy( + alpha = 0.3f + ) + ) + ) { + ListItem( + headlineContent = { Text("Fix Image Names") }, + supportingContent = { + Text( + "Rename all images to use consistent naming across devices" + ) + }, + leadingContent = { + Icon(Icons.Default.Build, contentDescription = null) + }, + trailingContent = { + TextButton( + onClick = { showFixImagesDialog = true }, + enabled = !isFixingImages && !uiState.isLoading + ) { + if (isFixingImages) { + CircularProgressIndicator( + modifier = Modifier.size(16.dp), + strokeWidth = 2.dp + ) + } else { + Text("Fix Names") + } + } + } + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + + Card( + shape = RoundedCornerShape(12.dp), + colors = + CardDefaults.cardColors( + containerColor = + MaterialTheme.colorScheme.errorContainer.copy( + alpha = 0.3f + ) + ) + ) { + ListItem( + headlineContent = { Text("Delete All Images") }, + supportingContent = { + Text("Permanently delete all image files from device") + }, + leadingContent = { + Icon( + Icons.Default.Delete, + contentDescription = null, + tint = MaterialTheme.colorScheme.error + ) + }, + trailingContent = { + TextButton( + onClick = { showDeleteImagesDialog = true }, + enabled = !isDeletingImages && !uiState.isLoading + ) { + if (isDeletingImages) { + CircularProgressIndicator( + modifier = Modifier.size(16.dp), + strokeWidth = 2.dp + ) + } else { + Text("Delete", color = MaterialTheme.colorScheme.error) + } + } + } + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + Card( shape = RoundedCornerShape(12.dp), colors = @@ -903,16 +989,72 @@ fun SettingsScreen(viewModel: ClimbViewModel) { confirmButton = { TextButton( onClick = { - syncService.clearConfiguration() - serverUrl = "" - authToken = "" + viewModel.syncService.clearConfiguration() showDisconnectDialog = false } - ) { Text("Disconnect", color = MaterialTheme.colorScheme.error) } + ) { Text("Disconnect") } }, dismissButton = { TextButton(onClick = { showDisconnectDialog = false }) { Text("Cancel") } } ) } + + // Fix Image Names dialog + if (showFixImagesDialog) { + AlertDialog( + onDismissRequest = { showFixImagesDialog = false }, + title = { Text("Fix Image Names") }, + text = { + Text( + "This will rename all existing image files to use a consistent naming system across devices.\n\nThis improves sync reliability between iOS and Android. Your images will not be lost, only renamed.\n\nThis is safe to run multiple times." + ) + }, + confirmButton = { + TextButton( + onClick = { + isFixingImages = true + showFixImagesDialog = false + coroutineScope.launch { + viewModel.migrateImageNamesToDeterministic(context) + isFixingImages = false + viewModel.setMessage("Image names fixed successfully!") + } + } + ) { Text("Fix Names") } + }, + dismissButton = { + TextButton(onClick = { showFixImagesDialog = false }) { Text("Cancel") } + } + ) + } + + // Delete All Images dialog + if (showDeleteImagesDialog) { + AlertDialog( + onDismissRequest = { showDeleteImagesDialog = false }, + title = { Text("Delete All Images") }, + text = { + Text( + "This will permanently delete ALL image files from your device.\n\nProblems will keep their references but the actual image files will be removed. This cannot be undone.\n\nConsider exporting your data first if you want to keep your images." + ) + }, + confirmButton = { + TextButton( + onClick = { + isDeletingImages = true + showDeleteImagesDialog = false + coroutineScope.launch { + viewModel.deleteAllImages(context) + isDeletingImages = false + viewModel.setMessage("All images deleted successfully!") + } + } + ) { Text("Delete", color = MaterialTheme.colorScheme.error) } + }, + dismissButton = { + TextButton(onClick = { showDeleteImagesDialog = false }) { Text("Cancel") } + } + ) + } } diff --git a/android/app/src/main/java/com/atridad/openclimb/ui/viewmodel/ClimbViewModel.kt b/android/app/src/main/java/com/atridad/openclimb/ui/viewmodel/ClimbViewModel.kt index 87c243f..576b6e5 100644 --- a/android/app/src/main/java/com/atridad/openclimb/ui/viewmodel/ClimbViewModel.kt +++ b/android/app/src/main/java/com/atridad/openclimb/ui/viewmodel/ClimbViewModel.kt @@ -7,6 +7,7 @@ import com.atridad.openclimb.data.model.* import com.atridad.openclimb.data.repository.ClimbRepository import com.atridad.openclimb.data.sync.SyncService import com.atridad.openclimb.service.SessionTrackingService +import com.atridad.openclimb.utils.ImageNamingUtils import com.atridad.openclimb.utils.ImageUtils import com.atridad.openclimb.utils.SessionShareUtils import com.atridad.openclimb.widget.ClimbStatsWidgetProvider @@ -106,25 +107,41 @@ class ClimbViewModel(private val repository: ClimbRepository, val syncService: S fun getGymById(id: String): Flow = flow { emit(repository.getGymById(id)) } // Problem operations - fun addProblem(problem: Problem) { - viewModelScope.launch { repository.insertProblem(problem) } - } - fun addProblem(problem: Problem, context: Context) { viewModelScope.launch { - repository.insertProblem(problem) + val finalProblem = renameTemporaryImages(problem, context) + repository.insertProblem(finalProblem) ClimbStatsWidgetProvider.updateAllWidgets(context) // Auto-sync now happens automatically via repository callback } } - fun updateProblem(problem: Problem) { - viewModelScope.launch { repository.updateProblem(problem) } + private suspend fun renameTemporaryImages(problem: Problem, context: Context? = null): Problem { + if (problem.imagePaths.isEmpty()) { + return problem + } + + val appContext = context ?: return problem + val finalImagePaths = mutableListOf() + + problem.imagePaths.forEachIndexed { index, tempPath -> + if (tempPath.startsWith("temp_")) { + val deterministicName = ImageNamingUtils.generateImageFilename(problem.id, index) + val finalPath = + ImageUtils.renameTemporaryImage(appContext, tempPath, problem.id, index) + finalImagePaths.add(finalPath ?: tempPath) + } else { + finalImagePaths.add(tempPath) + } + } + + return problem.copy(imagePaths = finalImagePaths) } fun updateProblem(problem: Problem, context: Context) { viewModelScope.launch { - repository.updateProblem(problem) + val finalProblem = renameTemporaryImages(problem, context) + repository.updateProblem(finalProblem) ClimbStatsWidgetProvider.updateAllWidgets(context) } } @@ -147,6 +164,99 @@ class ClimbViewModel(private val repository: ClimbRepository, val syncService: S val referencedImagePaths = allProblems.flatMap { it.imagePaths }.toSet() ImageUtils.cleanupOrphanedImages(context, referencedImagePaths) } + fun migrateImageNamesToDeterministic(context: Context) { + viewModelScope.launch { + val allProblems = repository.getAllProblems().first() + var migrationCount = 0 + val updatedProblems = mutableListOf() + + for (problem in allProblems) { + if (problem.imagePaths.isEmpty()) continue + + var newImagePaths = mutableListOf() + var problemNeedsUpdate = false + + for ((index, imagePath) in problem.imagePaths.withIndex()) { + val currentFilename = File(imagePath).name + + if (ImageNamingUtils.isValidImageFilename(currentFilename)) { + newImagePaths.add(imagePath) + continue + } + + val deterministicName = + ImageNamingUtils.generateImageFilename(problem.id, index) + + val imagesDir = ImageUtils.getImagesDirectory(context) + val oldFile = File(imagesDir, currentFilename) + val newFile = File(imagesDir, deterministicName) + + if (oldFile.exists()) { + if (oldFile.renameTo(newFile)) { + newImagePaths.add(deterministicName) + problemNeedsUpdate = true + migrationCount++ + println("Migrated: $currentFilename → $deterministicName") + } else { + println("Failed to migrate $currentFilename") + newImagePaths.add(imagePath) + } + } else { + println("Warning: Image file not found: $currentFilename") + newImagePaths.add(imagePath) + } + } + + if (problemNeedsUpdate) { + val updatedProblem = problem.copy(imagePaths = newImagePaths) + updatedProblems.add(updatedProblem) + } + } + + for (updatedProblem in updatedProblems) { + repository.insertProblemWithoutSync(updatedProblem) + } + + println( + "Migration completed: $migrationCount images renamed, ${updatedProblems.size} problems updated" + ) + } + } + + fun deleteAllImages(context: Context) { + viewModelScope.launch { + val imagesDir = ImageUtils.getImagesDirectory(context) + var deletedCount = 0 + + imagesDir.listFiles()?.forEach { file -> + if (file.isFile && file.extension.lowercase() == "jpg") { + if (file.delete()) { + deletedCount++ + } + } + } + + val allProblems = repository.getAllProblems().first() + val updatedProblems = + allProblems.map { problem -> + if (problem.imagePaths.isNotEmpty()) { + problem.copy(imagePaths = emptyList()) + } else { + problem + } + } + + for (updatedProblem in updatedProblems) { + if (updatedProblem.imagePaths != + allProblems.find { it.id == updatedProblem.id }?.imagePaths + ) { + repository.insertProblemWithoutSync(updatedProblem) + } + } + + println("Deleted $deletedCount image files and cleared image references") + } + } fun getProblemById(id: String): Flow = flow { emit(repository.getProblemById(id)) } @@ -240,7 +350,6 @@ class ClimbViewModel(private val repository: ClimbRepository, val syncService: S ClimbStatsWidgetProvider.updateAllWidgets(context) - android.util.Log.d("ClimbViewModel", "Session started successfully") _uiState.value = _uiState.value.copy(message = "Session started successfully!") } } @@ -268,8 +377,6 @@ class ClimbViewModel(private val repository: ClimbRepository, val syncService: S ClimbStatsWidgetProvider.updateAllWidgets(context) - // Auto-sync now happens automatically via repository callback - _uiState.value = _uiState.value.copy(message = "Session completed!") } } @@ -295,7 +402,6 @@ class ClimbViewModel(private val repository: ClimbRepository, val syncService: S viewModelScope.launch { repository.insertAttempt(attempt) ClimbStatsWidgetProvider.updateAllWidgets(context) - // Auto-sync now happens automatically via repository callback } } @@ -410,6 +516,10 @@ class ClimbViewModel(private val repository: ClimbRepository, val syncService: S _uiState.value = _uiState.value.copy(error = message) } + fun setMessage(message: String) { + _uiState.value = _uiState.value.copy(message = message) + } + fun resetAllData() { viewModelScope.launch { try { diff --git a/android/app/src/main/java/com/atridad/openclimb/utils/ImageNamingUtils.kt b/android/app/src/main/java/com/atridad/openclimb/utils/ImageNamingUtils.kt index 73c907b..5aabe5b 100644 --- a/android/app/src/main/java/com/atridad/openclimb/utils/ImageNamingUtils.kt +++ b/android/app/src/main/java/com/atridad/openclimb/utils/ImageNamingUtils.kt @@ -13,18 +13,16 @@ object ImageNamingUtils { private const val HASH_LENGTH = 12 // First 12 chars of SHA-256 /** Generates a deterministic filename for a problem image */ - fun generateImageFilename(problemId: String, timestamp: String, imageIndex: Int): String { - // Create a deterministic hash from problemId + timestamp + index - val input = "${problemId}_${timestamp}_${imageIndex}" + fun generateImageFilename(problemId: String, imageIndex: Int): String { + val input = "${problemId}_${imageIndex}" val hash = createHash(input) return "problem_${hash}_${imageIndex}${IMAGE_EXTENSION}" } - /** Generates a deterministic filename using current timestamp */ - fun generateImageFilename(problemId: String, imageIndex: Int): String { - val timestamp = DateFormatUtils.nowISO8601() - return generateImageFilename(problemId, timestamp, imageIndex) + /** Legacy method for backward compatibility */ + fun generateImageFilename(problemId: String, timestamp: String, imageIndex: Int): String { + return generateImageFilename(problemId, imageIndex) } /** Extracts problem ID from an image filename */ @@ -41,9 +39,7 @@ object ImageNamingUtils { return null } - // We can't extract the original problem ID from the hash, - // but we can validate the format - return parts[1] // Return the hash as identifier + return parts[1] } /** Validates if a filename follows our naming convention */ @@ -63,15 +59,11 @@ object ImageNamingUtils { /** Migrates an existing filename to our naming convention */ fun migrateFilename(oldFilename: String, problemId: String, imageIndex: Int): String { - // If it's already using our convention, keep it if (isValidImageFilename(oldFilename)) { return oldFilename } - // Generate new deterministic name - // Use a timestamp based on the old filename to maintain some consistency - val timestamp = DateFormatUtils.nowISO8601() - return generateImageFilename(problemId, timestamp, imageIndex) + return generateImageFilename(problemId, imageIndex) } /** Creates a deterministic hash from input string */ @@ -90,7 +82,7 @@ object ImageNamingUtils { val renameMap = mutableMapOf() existingFilenames.forEachIndexed { index, oldFilename -> - val newFilename = migrateFilename(oldFilename, problemId, index) + val newFilename = generateImageFilename(problemId, index) if (newFilename != oldFilename) { renameMap[oldFilename] = newFilename } @@ -98,4 +90,37 @@ object ImageNamingUtils { return renameMap } + + /** Generates the canonical filename for a problem image */ + fun getCanonicalImageFilename(problemId: String, imageIndex: Int): String { + return generateImageFilename(problemId, imageIndex) + } + + /** Creates a mapping of existing server filenames to canonical filenames */ + fun createServerMigrationMap( + problemId: String, + serverImageFilenames: List, + localImageCount: Int + ): Map { + val migrationMap = mutableMapOf() + + for (imageIndex in 0 until localImageCount) { + val canonicalName = getCanonicalImageFilename(problemId, imageIndex) + + if (serverImageFilenames.contains(canonicalName)) { + continue + } + + for (serverFilename in serverImageFilenames) { + if (isValidImageFilename(serverFilename) && + !migrationMap.values.contains(serverFilename) + ) { + migrationMap[serverFilename] = canonicalName + break + } + } + } + + return migrationMap + } } diff --git a/android/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt b/android/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt index 47a245d..ed4c480 100644 --- a/android/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt +++ b/android/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt @@ -5,6 +5,8 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri +import android.provider.MediaStore +import android.util.Log import androidx.core.graphics.scale import java.io.File import java.io.FileOutputStream @@ -17,7 +19,7 @@ object ImageUtils { private const val IMAGE_QUALITY = 85 // Creates the images directory if it doesn't exist - private fun getImagesDirectory(context: Context): File { + fun getImagesDirectory(context: Context): File { val imagesDir = File(context.filesDir, IMAGES_DIR) if (!imagesDir.exists()) { imagesDir.mkdirs() @@ -43,12 +45,12 @@ object ImageUtils { val orientedBitmap = correctImageOrientation(context, imageUri, originalBitmap) val compressedBitmap = compressImage(orientedBitmap) - val filename = - if (problemId != null && imageIndex != null) { - ImageNamingUtils.generateImageFilename(problemId, imageIndex) - } else { - "${UUID.randomUUID()}.jpg" - } + // Always require deterministic naming - no UUID fallback + require(problemId != null && imageIndex != null) { + "Problem ID and image index are required for deterministic image naming" + } + + val filename = ImageNamingUtils.generateImageFilename(problemId, imageIndex) val imageFile = File(getImagesDirectory(context), filename) FileOutputStream(imageFile).use { output -> @@ -73,35 +75,35 @@ object ImageUtils { return try { val inputStream = context.contentResolver.openInputStream(imageUri) inputStream?.use { input -> - val exif = android.media.ExifInterface(input) + val exif = androidx.exifinterface.media.ExifInterface(input) val orientation = exif.getAttributeInt( - android.media.ExifInterface.TAG_ORIENTATION, - android.media.ExifInterface.ORIENTATION_NORMAL + androidx.exifinterface.media.ExifInterface.TAG_ORIENTATION, + androidx.exifinterface.media.ExifInterface.ORIENTATION_NORMAL ) val matrix = android.graphics.Matrix() when (orientation) { - android.media.ExifInterface.ORIENTATION_ROTATE_90 -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_90 -> { matrix.postRotate(90f) } - android.media.ExifInterface.ORIENTATION_ROTATE_180 -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_180 -> { matrix.postRotate(180f) } - android.media.ExifInterface.ORIENTATION_ROTATE_270 -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_270 -> { matrix.postRotate(270f) } - android.media.ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> { matrix.postScale(-1f, 1f) } - android.media.ExifInterface.ORIENTATION_FLIP_VERTICAL -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_FLIP_VERTICAL -> { matrix.postScale(1f, -1f) } - android.media.ExifInterface.ORIENTATION_TRANSPOSE -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_TRANSPOSE -> { matrix.postRotate(90f) matrix.postScale(-1f, 1f) } - android.media.ExifInterface.ORIENTATION_TRANSVERSE -> { + androidx.exifinterface.media.ExifInterface.ORIENTATION_TRANSVERSE -> { matrix.postRotate(-90f) matrix.postScale(-1f, 1f) } @@ -212,6 +214,72 @@ object ImageUtils { } } + /** Temporarily saves an image during selection process */ + fun saveTemporaryImageFromUri(context: Context, imageUri: Uri): String? { + return try { + val originalBitmap = + MediaStore.Images.Media.getBitmap(context.contentResolver, imageUri) + ?: return null + + val orientedBitmap = correctImageOrientation(context, imageUri, originalBitmap) + val compressedBitmap = compressImage(orientedBitmap) + + val tempFilename = "temp_${UUID.randomUUID()}.jpg" + val imageFile = File(getImagesDirectory(context), tempFilename) + + FileOutputStream(imageFile).use { output -> + compressedBitmap.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, output) + } + + originalBitmap.recycle() + if (orientedBitmap != originalBitmap) { + orientedBitmap.recycle() + } + if (compressedBitmap != orientedBitmap) { + compressedBitmap.recycle() + } + + tempFilename + } catch (e: Exception) { + Log.e("ImageUtils", "Error saving temporary image from URI", e) + null + } + } + + /** Renames a temporary image */ + fun renameTemporaryImage( + context: Context, + tempFilename: String, + problemId: String, + imageIndex: Int + ): String? { + return try { + val tempFile = File(getImagesDirectory(context), tempFilename) + if (!tempFile.exists()) { + Log.e("ImageUtils", "Temporary file does not exist: $tempFilename") + return null + } + + val deterministicFilename = + ImageNamingUtils.generateImageFilename(problemId, imageIndex) + val finalFile = File(getImagesDirectory(context), deterministicFilename) + + if (tempFile.renameTo(finalFile)) { + Log.d( + "ImageUtils", + "Renamed temporary image: $tempFilename -> $deterministicFilename" + ) + deterministicFilename + } else { + Log.e("ImageUtils", "Failed to rename temporary image: $tempFilename") + null + } + } catch (e: Exception) { + Log.e("ImageUtils", "Error renaming temporary image", e) + null + } + } + /** Saves an image from byte array to app's private storage */ fun saveImageFromBytes(context: Context, imageData: ByteArray): String? { return try { diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index b1cea28..37d7eec 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -19,6 +19,7 @@ kotlinxSerialization = "1.9.0" kotlinxCoroutines = "1.10.2" coil = "2.7.0" ksp = "2.2.20-2.0.3" +exifinterface = "1.3.6" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -66,6 +67,7 @@ mockk = { group = "io.mockk", name = "mockk", version = "1.14.6" } # Image Loading coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } +androidx-exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exifinterface" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/ios/OpenClimb.xcodeproj/project.pbxproj b/ios/OpenClimb.xcodeproj/project.pbxproj index ace6167..e374a54 100644 --- a/ios/OpenClimb.xcodeproj/project.pbxproj +++ b/ios/OpenClimb.xcodeproj/project.pbxproj @@ -465,7 +465,7 @@ CODE_SIGN_ENTITLEMENTS = OpenClimb/OpenClimb.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 4BC9Y2LL4B; DRIVERKIT_DEPLOYMENT_TARGET = 24.6; ENABLE_PREVIEWS = YES; @@ -513,7 +513,7 @@ CODE_SIGN_ENTITLEMENTS = OpenClimb/OpenClimb.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 4BC9Y2LL4B; DRIVERKIT_DEPLOYMENT_TARGET = 24.6; ENABLE_PREVIEWS = YES; @@ -602,7 +602,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 4BC9Y2LL4B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SessionStatusLive/Info.plist; @@ -632,7 +632,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = 4BC9Y2LL4B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SessionStatusLive/Info.plist; diff --git a/ios/OpenClimb.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate b/ios/OpenClimb.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate index a1c7f67937e70bc6f33eb7910bbb5cc623278ca4..b91ded595440e39ce74e4d247fa7fe88b066068a 100644 GIT binary patch literal 268403 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 COoE;Dc(+;WPC?`zwgYd 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 + private var pendingChanges = false + private let syncDebounceDelay: TimeInterval = 2.0 private enum Keys { static let serverURL = "sync_server_url" @@ -44,6 +47,11 @@ class SyncService: ObservableObject { self.lastSyncTime = lastSync } self.isConnected = userDefaults.bool(forKey: Keys.isConnected) + + // Perform image naming migration on initialization + Task { + await performImageNamingMigration() + } } func downloadData() async throws -> ClimbDataBackup { @@ -144,6 +152,9 @@ class SyncService: ObservableObject { request.setValue("application/octet-stream", forHTTPHeaderField: "Content-Type") request.httpBody = imageData + request.timeoutInterval = 60.0 + request.cachePolicy = .reloadIgnoringLocalCacheData + let (_, response) = try await URLSession.shared.data(for: request) guard let httpResponse = response as? HTTPURLResponse else { @@ -173,6 +184,9 @@ class SyncService: ObservableObject { request.httpMethod = "GET" request.setValue("Bearer \(authToken)", forHTTPHeaderField: "Authorization") + request.timeoutInterval = 45.0 + request.cachePolicy = .returnCacheDataElseLoad + let (data, response) = try await URLSession.shared.data(for: request) guard let httpResponse = response as? HTTPURLResponse else { @@ -283,7 +297,6 @@ class SyncService: ObservableObject { { var imagePathMapping: [String: String] = [:] - // Process images by problem to maintain consistent naming for problem in backup.problems { guard let imagePaths = problem.imagePaths, !imagePaths.isEmpty else { continue } @@ -293,19 +306,13 @@ class SyncService: ObservableObject { do { let imageData = try await downloadImage(filename: serverFilename) - // Generate consistent filename if needed - let consistentFilename = - ImageNamingUtils.isValidImageFilename(serverFilename) - ? serverFilename - : ImageNamingUtils.generateImageFilename( - problemId: problem.id, imageIndex: index) + let consistentFilename = ImageNamingUtils.generateImageFilename( + problemId: problem.id, imageIndex: index) - // Save image with consistent filename let imageManager = ImageManager.shared _ = try imageManager.saveImportedImage( imageData, filename: consistentFilename) - // Map server filename to consistent local filename imagePathMapping[serverFilename] = consistentFilename print("Downloaded and mapped image: \(serverFilename) -> \(consistentFilename)") } catch SyncError.imageNotFound { @@ -329,12 +336,8 @@ class SyncService: ObservableObject { for (index, imagePath) in problem.imagePaths.enumerated() { let filename = URL(fileURLWithPath: imagePath).lastPathComponent - // Ensure filename follows consistent naming convention - let consistentFilename = - ImageNamingUtils.isValidImageFilename(filename) - ? filename - : ImageNamingUtils.generateImageFilename( - problemId: problem.id.uuidString, imageIndex: index) + let consistentFilename = ImageNamingUtils.generateImageFilename( + problemId: problem.id.uuidString, imageIndex: index) // Load image data let imageManager = ImageManager.shared @@ -392,6 +395,53 @@ class SyncService: ObservableObject { ) } + func createBackupForExport(_ dataManager: ClimbingDataManager) -> ClimbDataBackup { + // Filter out active sessions and their attempts from sync + let completedSessions = dataManager.sessions.filter { $0.status != .active } + let activeSessionIds = Set( + dataManager.sessions.filter { $0.status == .active }.map { $0.id }) + let completedAttempts = dataManager.attempts.filter { + !activeSessionIds.contains($0.sessionId) + } + + // Create backup with normalized image paths for export + return ClimbDataBackup( + exportedAt: DataStateManager.shared.getLastModified(), + gyms: dataManager.gyms.map { BackupGym(from: $0) }, + problems: dataManager.problems.map { problem in + var backupProblem = BackupProblem(from: problem) + + if !problem.imagePaths.isEmpty { + let normalizedPaths = problem.imagePaths.enumerated().map { index, _ in + ImageNamingUtils.generateImageFilename( + problemId: problem.id.uuidString, imageIndex: index) + } + + backupProblem = BackupProblem( + id: backupProblem.id, + gymId: backupProblem.gymId, + name: backupProblem.name, + description: backupProblem.description, + climbType: backupProblem.climbType, + difficulty: backupProblem.difficulty, + tags: backupProblem.tags, + location: backupProblem.location, + imagePaths: normalizedPaths, + isActive: backupProblem.isActive, + dateSet: backupProblem.dateSet, + notes: backupProblem.notes, + createdAt: backupProblem.createdAt, + updatedAt: backupProblem.updatedAt + ) + } + return backupProblem + }, + sessions: completedSessions.map { BackupClimbSession(from: $0) }, + attempts: completedAttempts.map { BackupAttempt(from: $0) }, + deletedItems: dataManager.getDeletedItems() + ) + } + private func mergeDataSafely( localBackup: ClimbDataBackup, serverBackup: ClimbDataBackup, @@ -620,17 +670,31 @@ class SyncService: ObservableObject { } let jsonData = try encoder.encode(backup) - // Collect all downloaded images from ImageManager + // Collect all images from ImageManager let imageManager = ImageManager.shared var imageFiles: [(filename: String, data: Data)] = [] - let imagePaths = Set(backup.problems.flatMap { $0.imagePaths ?? [] }) - for imagePath in imagePaths { - let filename = URL(fileURLWithPath: imagePath).lastPathComponent - let fullPath = imageManager.imagesDirectory.appendingPathComponent(filename).path - if let imageData = imageManager.loadImageData(fromPath: fullPath) { - imageFiles.append((filename: filename, data: imageData)) + // Get original problems to access actual image paths on disk + if let problemsData = userDefaults.data(forKey: "problems"), + let problems = try? JSONDecoder().decode([Problem].self, from: problemsData) + { + // Create a mapping from normalized paths to actual paths + for problem in problems { + for (index, imagePath) in problem.imagePaths.enumerated() { + // Get the actual filename on disk + let actualFilename = URL(fileURLWithPath: imagePath).lastPathComponent + let fullPath = imageManager.imagesDirectory.appendingPathComponent( + actualFilename + ).path + // Generate the normalized filename for the ZIP + let normalizedFilename = ImageNamingUtils.generateImageFilename( + problemId: problem.id.uuidString, imageIndex: index) + + if let imageData = imageManager.loadImageData(fromPath: fullPath) { + imageFiles.append((filename: normalizedFilename, data: imageData)) + } + } } } @@ -875,20 +939,51 @@ class SyncService: ObservableObject { } func triggerAutoSync(dataManager: ClimbingDataManager) { - // Early exit if sync cannot proceed - don't set isSyncing guard isConnected && isConfigured && isAutoSyncEnabled else { - // Ensure isSyncing is false when sync is not possible if isSyncing { isSyncing = false } return } - // Prevent multiple simultaneous syncs - guard !isSyncing else { + if isSyncing { + pendingChanges = true return } + syncTask?.cancel() + + syncTask = Task { + try? await Task.sleep(nanoseconds: UInt64(syncDebounceDelay * 1_000_000_000)) + + guard !Task.isCancelled else { return } + + repeat { + pendingChanges = false + + do { + try await syncWithServer(dataManager: dataManager) + } catch { + await MainActor.run { + self.isSyncing = false + } + return + } + + if pendingChanges { + try? await Task.sleep(nanoseconds: UInt64(syncDebounceDelay * 1_000_000_000)) + } + } while pendingChanges && !Task.isCancelled + } + } + + func forceSyncNow(dataManager: ClimbingDataManager) { + guard isConnected && isConfigured else { return } + + syncTask?.cancel() + syncTask = nil + pendingChanges = false + Task { do { try await syncWithServer(dataManager: dataManager) @@ -901,6 +996,10 @@ class SyncService: ObservableObject { } func disconnect() { + syncTask?.cancel() + syncTask = nil + pendingChanges = false + isSyncing = false isConnected = false lastSyncTime = nil syncError = nil @@ -917,6 +1016,112 @@ class SyncService: ObservableObject { userDefaults.removeObject(forKey: Keys.lastSyncTime) userDefaults.removeObject(forKey: Keys.isConnected) userDefaults.removeObject(forKey: Keys.autoSyncEnabled) + syncTask?.cancel() + syncTask = nil + pendingChanges = false + } + + deinit { + syncTask?.cancel() + } + + // MARK: - Image Naming Migration + + private func performImageNamingMigration() async { + let migrationKey = "image_naming_migration_completed_v2" + guard !userDefaults.bool(forKey: migrationKey) else { + print("Image naming migration already completed") + return + } + + print("Starting image naming migration...") + var updateCount = 0 + let imageManager = ImageManager.shared + + // Get all problems from UserDefaults + if let problemsData = userDefaults.data(forKey: "problems"), + var problems = try? JSONDecoder().decode([Problem].self, from: problemsData) + { + + for problemIndex in 0.. \(consistentFilename)") + } catch { + print("Failed to migrate image \(currentFilename): \(error)") + updatedImagePaths.append(imagePath) + } + } else { + updatedImagePaths.append(imagePath) + } + } else { + updatedImagePaths.append(imagePath) + } + } + + if hasChanges { + // Decode problem to dictionary, update imagePaths, re-encode + if let problemData = try? JSONEncoder().encode(problem), + var problemDict = try? JSONSerialization.jsonObject(with: problemData) + as? [String: Any] + { + problemDict["imagePaths"] = updatedImagePaths + problemDict["updatedAt"] = ISO8601DateFormatter().string(from: Date()) + if let updatedData = try? JSONSerialization.data( + withJSONObject: problemDict), + let updatedProblem = try? JSONDecoder().decode( + Problem.self, from: updatedData) + { + problems[problemIndex] = updatedProblem + } + } + } + } + + if updateCount > 0 { + if let updatedData = try? JSONEncoder().encode(problems) { + userDefaults.set(updatedData, forKey: "problems") + print("Updated \(updateCount) image paths in UserDefaults") + } + } + } + + userDefaults.set(true, forKey: migrationKey) + print("Image naming migration completed, updated \(updateCount) images") + + // Notify ClimbingDataManager to reload data if images were updated + if updateCount > 0 { + DispatchQueue.main.async { + NotificationCenter.default.post( + name: NSNotification.Name("ImageMigrationCompleted"), + object: nil, + userInfo: ["updateCount": updateCount] + ) + } + } } // MARK: - Safe Merge Functions @@ -926,13 +1131,14 @@ class SyncService: ObservableObject { var merged = local let deletedGymIds = Set(deletedItems.filter { $0.type == "gym" }.map { $0.id }) - // Remove items that were deleted on other devices + let localGymIds = Set(local.map { $0.id.uuidString }) + merged.removeAll { deletedGymIds.contains($0.id.uuidString) } // Add new items from server (excluding deleted ones) for serverGym in server { if let serverGymConverted = try? serverGym.toGym() { - let localHasGym = local.contains(where: { $0.id.uuidString == serverGym.id }) + let localHasGym = localGymIds.contains(serverGym.id) let isDeleted = deletedGymIds.contains(serverGym.id) if !localHasGym && !isDeleted { @@ -953,41 +1159,44 @@ class SyncService: ObservableObject { var merged = local let deletedProblemIds = Set(deletedItems.filter { $0.type == "problem" }.map { $0.id }) - // Remove items that were deleted on other devices + let localProblemIds = Set(local.map { $0.id.uuidString }) + merged.removeAll { deletedProblemIds.contains($0.id.uuidString) } - // Add new items from server (excluding deleted ones) for serverProblem in server { - var problemToAdd = serverProblem + let localHasProblem = localProblemIds.contains(serverProblem.id) + let isDeleted = deletedProblemIds.contains(serverProblem.id) - // Update image paths if needed - if !imagePathMapping.isEmpty { - let updatedImagePaths = serverProblem.imagePaths?.compactMap { oldPath in - imagePathMapping[oldPath] ?? oldPath + if !localHasProblem && !isDeleted { + var problemToAdd = serverProblem + + if !imagePathMapping.isEmpty, let imagePaths = serverProblem.imagePaths, + !imagePaths.isEmpty + { + let updatedImagePaths = imagePaths.compactMap { oldPath in + imagePathMapping[oldPath] ?? oldPath + } + if updatedImagePaths != imagePaths { + problemToAdd = BackupProblem( + id: serverProblem.id, + gymId: serverProblem.gymId, + name: serverProblem.name, + description: serverProblem.description, + climbType: serverProblem.climbType, + difficulty: serverProblem.difficulty, + tags: serverProblem.tags, + location: serverProblem.location, + imagePaths: updatedImagePaths, + isActive: serverProblem.isActive, + dateSet: serverProblem.dateSet, + notes: serverProblem.notes, + createdAt: serverProblem.createdAt, + updatedAt: serverProblem.updatedAt + ) + } } - problemToAdd = BackupProblem( - id: serverProblem.id, - gymId: serverProblem.gymId, - name: serverProblem.name, - description: serverProblem.description, - climbType: serverProblem.climbType, - difficulty: serverProblem.difficulty, - tags: serverProblem.tags, - location: serverProblem.location, - imagePaths: updatedImagePaths, - isActive: serverProblem.isActive, - dateSet: serverProblem.dateSet, - notes: serverProblem.notes, - createdAt: serverProblem.createdAt, - updatedAt: serverProblem.updatedAt - ) - } - if let serverProblemConverted = try? problemToAdd.toProblem() { - let localHasProblem = local.contains(where: { $0.id.uuidString == problemToAdd.id }) - let isDeleted = deletedProblemIds.contains(problemToAdd.id) - - if !localHasProblem && !isDeleted { + if let serverProblemConverted = try? problemToAdd.toProblem() { merged.append(serverProblemConverted) } } @@ -1004,19 +1213,18 @@ class SyncService: ObservableObject { var merged = local let deletedSessionIds = Set(deletedItems.filter { $0.type == "session" }.map { $0.id }) - // Remove items that were deleted on other devices (but never remove active sessions) + let localSessionIds = Set(local.map { $0.id.uuidString }) + merged.removeAll { session in deletedSessionIds.contains(session.id.uuidString) && session.status != .active } - // Add new items from server (excluding deleted ones) for serverSession in server { - if let serverSessionConverted = try? serverSession.toClimbSession() { - let localHasSession = local.contains(where: { $0.id.uuidString == serverSession.id } - ) - let isDeleted = deletedSessionIds.contains(serverSession.id) + let localHasSession = localSessionIds.contains(serverSession.id) + let isDeleted = deletedSessionIds.contains(serverSession.id) - if !localHasSession && !isDeleted { + if !localHasSession && !isDeleted { + if let serverSessionConverted = try? serverSession.toClimbSession() { merged.append(serverSessionConverted) } } @@ -1031,6 +1239,8 @@ class SyncService: ObservableObject { var merged = local let deletedAttemptIds = Set(deletedItems.filter { $0.type == "attempt" }.map { $0.id }) + let localAttemptIds = Set(local.map { $0.id.uuidString }) + // Get active session IDs to protect their attempts let activeSessionIds = Set( local.compactMap { attempt in @@ -1048,14 +1258,12 @@ class SyncService: ObservableObject { && !activeSessionIds.contains(attempt.sessionId) } - // Add new items from server (excluding deleted ones) for serverAttempt in server { - if let serverAttemptConverted = try? serverAttempt.toAttempt() { - let localHasAttempt = local.contains(where: { $0.id.uuidString == serverAttempt.id } - ) - let isDeleted = deletedAttemptIds.contains(serverAttempt.id) + let localHasAttempt = localAttemptIds.contains(serverAttempt.id) + let isDeleted = deletedAttemptIds.contains(serverAttempt.id) - if !localHasAttempt && !isDeleted { + if !localHasAttempt && !isDeleted { + if let serverAttemptConverted = try? serverAttempt.toAttempt() { merged.append(serverAttemptConverted) } } diff --git a/ios/OpenClimb/Utils/ImageManager.swift b/ios/OpenClimb/Utils/ImageManager.swift index 77afcf9..f52ab5f 100644 --- a/ios/OpenClimb/Utils/ImageManager.swift +++ b/ios/OpenClimb/Utils/ImageManager.swift @@ -852,4 +852,73 @@ class ImageManager { print("ERROR: Failed to migrate from previous Application Support: \(error)") } } + + func migrateImageNamesToDeterministic(dataManager: ClimbingDataManager) { + print("Starting migration of image names to deterministic format...") + + var migrationCount = 0 + var updatedProblems: [Problem] = [] + + for problem in dataManager.problems { + guard !problem.imagePaths.isEmpty else { continue } + + var newImagePaths: [String] = [] + var problemNeedsUpdate = false + + for (index, imagePath) in problem.imagePaths.enumerated() { + let currentFilename = URL(fileURLWithPath: imagePath).lastPathComponent + + if ImageNamingUtils.isValidImageFilename(currentFilename) { + newImagePaths.append(imagePath) + continue + } + + let deterministicName = ImageNamingUtils.generateImageFilename( + problemId: problem.id.uuidString, imageIndex: index) + + let oldPath = imagesDirectory.appendingPathComponent(currentFilename) + let newPath = imagesDirectory.appendingPathComponent(deterministicName) + + if fileManager.fileExists(atPath: oldPath.path) { + do { + try fileManager.moveItem(at: oldPath, to: newPath) + + let oldBackupPath = backupDirectory.appendingPathComponent(currentFilename) + let newBackupPath = backupDirectory.appendingPathComponent( + deterministicName) + + if fileManager.fileExists(atPath: oldBackupPath.path) { + try? fileManager.moveItem(at: oldBackupPath, to: newBackupPath) + } + + newImagePaths.append(deterministicName) + problemNeedsUpdate = true + migrationCount += 1 + + print("Migrated: \(currentFilename) → \(deterministicName)") + + } catch { + print("Failed to migrate \(currentFilename): \(error)") + newImagePaths.append(imagePath) + } + } else { + print("Warning: Image file not found: \(currentFilename)") + newImagePaths.append(imagePath) + } + } + + if problemNeedsUpdate { + let updatedProblem = problem.updated(imagePaths: newImagePaths) + updatedProblems.append(updatedProblem) + } + } + + for updatedProblem in updatedProblems { + dataManager.updateProblem(updatedProblem) + } + + print( + "Migration completed: \(migrationCount) images renamed, \(updatedProblems.count) problems updated" + ) + } } diff --git a/ios/OpenClimb/Utils/ImageNamingUtils.swift b/ios/OpenClimb/Utils/ImageNamingUtils.swift index b15eabb..ad339d7 100644 --- a/ios/OpenClimb/Utils/ImageNamingUtils.swift +++ b/ios/OpenClimb/Utils/ImageNamingUtils.swift @@ -11,21 +11,18 @@ class ImageNamingUtils { private static let hashLength = 12 /// Generates a deterministic filename for a problem image - static func generateImageFilename(problemId: String, timestamp: String, imageIndex: Int) - -> String - { - - let input = "\(problemId)_\(timestamp)_\(imageIndex)" + static func generateImageFilename(problemId: String, imageIndex: Int) -> String { + let input = "\(problemId)_\(imageIndex)" let hash = createHash(from: input) return "problem_\(hash)_\(imageIndex)\(imageExtension)" } - /// Generates a deterministic filename using current timestamp - static func generateImageFilename(problemId: String, imageIndex: Int) -> String { - let timestamp = ISO8601DateFormatter().string(from: Date()) - return generateImageFilename( - problemId: problemId, timestamp: timestamp, imageIndex: imageIndex) + /// Legacy method for backward compatibility + static func generateImageFilename(problemId: String, timestamp: String, imageIndex: Int) + -> String + { + return generateImageFilename(problemId: problemId, imageIndex: imageIndex) } /// Extracts problem ID from an image filename @@ -64,9 +61,7 @@ class ImageNamingUtils { return oldFilename } - let timestamp = ISO8601DateFormatter().string(from: Date()) - return generateImageFilename( - problemId: problemId, timestamp: timestamp, imageIndex: imageIndex) + return generateImageFilename(problemId: problemId, imageIndex: imageIndex) } /// Creates a deterministic hash from input string @@ -84,8 +79,7 @@ class ImageNamingUtils { var renameMap: [String: String] = [:] for (index, oldFilename) in existingFilenames.enumerated() { - let newFilename = migrateFilename( - oldFilename: oldFilename, problemId: problemId, imageIndex: index) + let newFilename = generateImageFilename(problemId: problemId, imageIndex: index) if newFilename != oldFilename { renameMap[oldFilename] = newFilename } @@ -113,6 +107,40 @@ class ImageNamingUtils { invalidImages: invalidImages ) } + + /// Generates the canonical filename that should be used for a problem image + static func getCanonicalImageFilename(problemId: String, imageIndex: Int) -> String { + return generateImageFilename(problemId: problemId, imageIndex: imageIndex) + } + + /// Creates a mapping of existing server filenames to canonical filenames + static func createServerMigrationMap( + problemId: String, + serverImageFilenames: [String], + localImageCount: Int + ) -> [String: String] { + var migrationMap: [String: String] = [:] + + for imageIndex in 0.. [BackupProblem] { return problems.map { problem in - let updatedImagePaths = (problem.imagePaths ?? []).compactMap { oldPath in - let fileName = URL(fileURLWithPath: oldPath).lastPathComponent - return imagePathMapping[fileName] + guard let originalImagePaths = problem.imagePaths, !originalImagePaths.isEmpty else { + return problem } - return problem.withUpdatedImagePaths(updatedImagePaths) + + var deterministicImagePaths: [String] = [] + + for (index, oldPath) in originalImagePaths.enumerated() { + let originalFileName = URL(fileURLWithPath: oldPath).lastPathComponent + + let deterministicName = ImageNamingUtils.generateImageFilename( + problemId: problem.id, imageIndex: index) + + if let tempFileName = imagePathMapping[originalFileName] { + let imageManager = ImageManager.shared + let tempPath = imageManager.imagesDirectory.appendingPathComponent(tempFileName) + let deterministicPath = imageManager.imagesDirectory.appendingPathComponent( + deterministicName) + + do { + if FileManager.default.fileExists(atPath: tempPath.path) { + try FileManager.default.moveItem(at: tempPath, to: deterministicPath) + + let tempBackupPath = imageManager.backupDirectory + .appendingPathComponent(tempFileName) + let deterministicBackupPath = imageManager.backupDirectory + .appendingPathComponent(deterministicName) + + if FileManager.default.fileExists(atPath: tempBackupPath.path) { + try? FileManager.default.moveItem( + at: tempBackupPath, to: deterministicBackupPath) + } + + deterministicImagePaths.append(deterministicName) + print("Renamed imported image: \(tempFileName) → \(deterministicName)") + } + } catch { + print( + "Failed to rename imported image \(tempFileName) to \(deterministicName): \(error)" + ) + deterministicImagePaths.append(tempFileName) + } + } else { + deterministicImagePaths.append(deterministicName) + } + } + + return problem.withUpdatedImagePaths(deterministicImagePaths) } } @@ -1134,6 +1183,19 @@ extension ClimbingDataManager { } } + private func setupMigrationNotifications() { + migrationObserver = NotificationCenter.default.addObserver( + forName: NSNotification.Name("ImageMigrationCompleted"), + object: nil, + queue: .main + ) { [weak self] notification in + if let updateCount = notification.userInfo?["updateCount"] as? Int { + print("🔔 Image migration completed with \(updateCount) updates - reloading data") + self?.loadProblems() + } + } + } + /// Handle Live Activity being dismissed by user private func handleLiveActivityDismissed() async { guard let activeSession = activeSession, diff --git a/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift b/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift index e44e39a..3eadd0b 100644 --- a/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift +++ b/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift @@ -458,24 +458,36 @@ struct AddAttemptView: View { let difficulty = DifficultyGrade( system: selectedDifficultySystem, grade: newProblemGrade) - // Save images and get paths - var imagePaths: [String] = [] - for data in imageData { - if let relativePath = ImageManager.shared.saveImageData(data) { - imagePaths.append(relativePath) - } - } - let newProblem = Problem( gymId: gym.id, name: newProblemName.isEmpty ? nil : newProblemName, climbType: selectedClimbType, difficulty: difficulty, - imagePaths: imagePaths + imagePaths: [] ) dataManager.addProblem(newProblem) + if !imageData.isEmpty { + var imagePaths: [String] = [] + + for (index, data) in imageData.enumerated() { + let deterministicName = ImageNamingUtils.generateImageFilename( + problemId: newProblem.id.uuidString, imageIndex: index) + + if let relativePath = ImageManager.shared.saveImageData( + data, withName: deterministicName) + { + imagePaths.append(relativePath) + } + } + + if !imagePaths.isEmpty { + let updatedProblem = newProblem.updated(imagePaths: imagePaths) + dataManager.updateProblem(updatedProblem) + } + } + let attempt = Attempt( sessionId: session.id, problemId: newProblem.id, @@ -1218,24 +1230,36 @@ struct EditAttemptView: View { let difficulty = DifficultyGrade( system: selectedDifficultySystem, grade: newProblemGrade) - // Save images and get paths - var imagePaths: [String] = [] - for data in imageData { - if let relativePath = ImageManager.shared.saveImageData(data) { - imagePaths.append(relativePath) - } - } - let newProblem = Problem( gymId: gym.id, name: newProblemName.isEmpty ? nil : newProblemName, climbType: selectedClimbType, difficulty: difficulty, - imagePaths: imagePaths + imagePaths: [] ) dataManager.addProblem(newProblem) + if !imageData.isEmpty { + var imagePaths: [String] = [] + + for (index, data) in imageData.enumerated() { + let deterministicName = ImageNamingUtils.generateImageFilename( + problemId: newProblem.id.uuidString, imageIndex: index) + + if let relativePath = ImageManager.shared.saveImageData( + data, withName: deterministicName) + { + imagePaths.append(relativePath) + } + } + + if !imagePaths.isEmpty { + let updatedProblem = newProblem.updated(imagePaths: imagePaths) + dataManager.updateProblem(updatedProblem) + } + } + let updatedAttempt = attempt.updated( problemId: newProblem.id, result: selectedResult, @@ -1329,16 +1353,18 @@ struct ProblemSelectionImageView: View { return } - DispatchQueue.global(qos: .userInitiated).async { - if let data = ImageManager.shared.loadImageData(fromPath: imagePath), - let image = UIImage(data: data) - { - DispatchQueue.main.async { + Task { + let data = await MainActor.run { + ImageManager.shared.loadImageData(fromPath: imagePath) + } + + if let data = data, let image = UIImage(data: data) { + await MainActor.run { self.uiImage = image self.isLoading = false } } else { - DispatchQueue.main.async { + await MainActor.run { self.hasFailed = true self.isLoading = false } diff --git a/ios/OpenClimb/Views/AddEdit/AddEditProblemView.swift b/ios/OpenClimb/Views/AddEdit/AddEditProblemView.swift index a8deda9..a913f75 100644 --- a/ios/OpenClimb/Views/AddEdit/AddEditProblemView.swift +++ b/ios/OpenClimb/Views/AddEdit/AddEditProblemView.swift @@ -556,21 +556,25 @@ struct AddEditProblemView: View { let difficulty = DifficultyGrade(system: selectedDifficultySystem, grade: difficultyGrade) - // Save new image data and combine with existing paths - var allImagePaths = imagePaths + if isEditing, let problem = existingProblem { + var allImagePaths = imagePaths - // Only save NEW images (those beyond the existing imagePaths count) - let newImagesStartIndex = imagePaths.count - if imageData.count > newImagesStartIndex { - for i in newImagesStartIndex.. newImagesStartIndex { + for i in newImagesStartIndex.. = { + private static let imageCache: NSCache = { let cache = NSCache() cache.countLimit = 100 cache.totalCostLimit = 50 * 1024 * 1024 // 50MB @@ -531,31 +531,28 @@ struct ProblemImageView: View { return } - let cacheKey = NSString(string: imagePath) + // Load image asynchronously + Task { @MainActor in + let cacheKey = NSString(string: imagePath) - // Check cache first - if let cachedImage = Self.imageCache.object(forKey: cacheKey) { - self.uiImage = cachedImage - self.isLoading = false - return - } + // Check cache first + if let cachedImage = Self.imageCache.object(forKey: cacheKey) { + self.uiImage = cachedImage + self.isLoading = false + return + } - DispatchQueue.global(qos: .userInitiated).async { + // Load image data if let data = ImageManager.shared.loadImageData(fromPath: imagePath), let image = UIImage(data: data) { // Cache the image Self.imageCache.setObject(image, forKey: cacheKey) - - DispatchQueue.main.async { - self.uiImage = image - self.isLoading = false - } + self.uiImage = image + self.isLoading = false } else { - DispatchQueue.main.async { - self.hasFailed = true - self.isLoading = false - } + self.hasFailed = true + self.isLoading = false } } } diff --git a/ios/OpenClimb/Views/SettingsView.swift b/ios/OpenClimb/Views/SettingsView.swift index 6f87735..73c5205 100644 --- a/ios/OpenClimb/Views/SettingsView.swift +++ b/ios/OpenClimb/Views/SettingsView.swift @@ -80,6 +80,10 @@ struct DataManagementSection: View { @Binding var activeSheet: SheetType? @State private var showingResetAlert = false @State private var isExporting = false + @State private var isMigrating = false + @State private var showingMigrationAlert = false + @State private var isDeletingImages = false + @State private var showingDeleteImagesAlert = false var body: some View { Section("Data Management") { @@ -117,6 +121,48 @@ struct DataManagementSection: View { } .foregroundColor(.primary) + // Migrate Image Names + Button(action: { + showingMigrationAlert = true + }) { + HStack { + if isMigrating { + ProgressView() + .scaleEffect(0.8) + Text("Migrating Images...") + .foregroundColor(.secondary) + } else { + Image(systemName: "photo.badge.arrow.down") + .foregroundColor(.orange) + Text("Fix Image Names") + } + Spacer() + } + } + .disabled(isMigrating) + .foregroundColor(.primary) + + // Delete All Images + Button(action: { + showingDeleteImagesAlert = true + }) { + HStack { + if isDeletingImages { + ProgressView() + .scaleEffect(0.8) + Text("Deleting Images...") + .foregroundColor(.secondary) + } else { + Image(systemName: "trash") + .foregroundColor(.red) + Text("Delete All Images") + } + Spacer() + } + } + .disabled(isDeletingImages) + .foregroundColor(.red) + // Reset All Data Button(action: { showingResetAlert = true @@ -140,6 +186,26 @@ struct DataManagementSection: View { "Are you sure you want to reset all data? This will permanently delete:\n\n• All gyms and their information\n• All problems and their images\n• All climbing sessions\n• All attempts and progress data\n\nThis action cannot be undone. Consider exporting your data first." ) } + .alert("Fix Image Names", isPresented: $showingMigrationAlert) { + Button("Cancel", role: .cancel) {} + Button("Fix Names") { + migrateImageNames() + } + } message: { + Text( + "This will rename all existing image files to use a consistent naming system across devices.\n\nThis improves sync reliability between iOS and Android. Your images will not be lost, only renamed.\n\nThis is safe to run multiple times." + ) + } + .alert("Delete All Images", isPresented: $showingDeleteImagesAlert) { + Button("Cancel", role: .cancel) {} + Button("Delete", role: .destructive) { + deleteAllImages() + } + } message: { + Text( + "This will permanently delete ALL image files from your device.\n\nProblems will keep their references but the actual image files will be removed. This cannot be undone.\n\nConsider exporting your data first if you want to keep your images." + ) + } } private func exportDataAsync() { @@ -152,6 +218,75 @@ struct DataManagementSection: View { } } } + + private func migrateImageNames() { + isMigrating = true + Task { + await MainActor.run { + ImageManager.shared.migrateImageNamesToDeterministic(dataManager: dataManager) + isMigrating = false + dataManager.successMessage = "Image names fixed successfully!" + } + } + } + + private func deleteAllImages() { + isDeletingImages = true + Task { + await MainActor.run { + deleteAllImageFiles() + isDeletingImages = false + dataManager.successMessage = "All images deleted successfully!" + } + } + } + + private func deleteAllImageFiles() { + let imageManager = ImageManager.shared + let fileManager = FileManager.default + + // Delete all images from the images directory + let imagesDir = imageManager.imagesDirectory + do { + let imageFiles = try fileManager.contentsOfDirectory( + at: imagesDir, includingPropertiesForKeys: nil) + var deletedCount = 0 + + for imageFile in imageFiles { + do { + try fileManager.removeItem(at: imageFile) + deletedCount += 1 + } catch { + print("Failed to delete image: \(imageFile.lastPathComponent)") + } + } + + print("Deleted \(deletedCount) image files") + } catch { + print("Failed to access images directory: \(error)") + } + + // Delete all images from backup directory + let backupDir = imageManager.backupDirectory + do { + let backupFiles = try fileManager.contentsOfDirectory( + at: backupDir, includingPropertiesForKeys: nil) + for backupFile in backupFiles { + try? fileManager.removeItem(at: backupFile) + } + } catch { + print("Failed to access backup directory: \(error)") + } + + // Clear image paths from all problems + let updatedProblems = dataManager.problems.map { problem in + problem.updated(imagePaths: []) + } + + for problem in updatedProblems { + dataManager.updateProblem(problem) + } + } } struct AppInfoSection: View {