From a2580b9b555f04784a2825bad37dabf1a7d31b28 Mon Sep 17 00:00:00 2001 From: Praneel Dev Date: Thu, 5 Mar 2026 07:39:10 +0530 Subject: [PATCH 1/3] bug: Added defensive fix for fragment fetch crash on reinitialization --- .../java/org/catrobat/paintroid/MainActivity.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt b/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt index dffb83df93..f7ba891db3 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt @@ -407,12 +407,15 @@ class MainActivity : AppCompatActivity(), MainView, CommandListener { } private fun getAppFragment() { - supportFragmentManager.findFragmentByTag(APP_FRAGMENT_KEY)?.let { fragment -> - appFragment = fragment as PaintroidApplicationFragment - } - if (!this::appFragment.isInitialized) { + val existing = supportFragmentManager.findFragmentByTag(APP_FRAGMENT_KEY) + + if (existing is PaintroidApplicationFragment) { + appFragment = existing + } else { appFragment = PaintroidApplicationFragment() - supportFragmentManager.beginTransaction().add(appFragment, APP_FRAGMENT_KEY).commit() + supportFragmentManager.beginTransaction() + .add(appFragment, APP_FRAGMENT_KEY) + .commitNow() } } From e5b9c7bdcb47bc3b4b1671560ad4fb67638effa1 Mon Sep 17 00:00:00 2001 From: Praneel Dev Date: Thu, 5 Mar 2026 08:07:02 +0530 Subject: [PATCH 2/3] bug: Handle corrupted temporary autosave file (KryoBufferUnderflowException) --- .../main/java/org/catrobat/paintroid/FileIO.kt | 9 +++++++-- .../org/catrobat/paintroid/MainActivity.kt | 18 ++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt index 432399538f..dc1474dbaf 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt @@ -39,6 +39,7 @@ import androidx.annotation.RequiresApi import androidx.core.content.FileProvider import androidx.exifinterface.media.ExifInterface import id.zelory.compressor.Compressor +import kotlinx.coroutines.Runnable import org.catrobat.paintroid.command.serialization.CommandSerializer import org.catrobat.paintroid.common.CATROBAT_IMAGE_ENDING import org.catrobat.paintroid.common.Constants.DOWNLOADS_DIRECTORY @@ -642,10 +643,14 @@ object FileIO { var workspaceReturnValue: WorkspaceReturnValue? = null if (temporaryFilePath != null) { try { - val stream = FileInputStream(temporaryFilePath) - workspaceReturnValue = commandSerializer.readFromInternalMemory(stream) + FileInputStream(temporaryFilePath).use { stream -> + workspaceReturnValue = commandSerializer.readFromInternalMemory(stream) + } } catch (e: IOException) { Log.e("Cannot read", "Can't read from stream", e) + } catch (e: RuntimeException){ + Log.e("Paintroid", "Temporary file corrupted", e) + deleteTempFile(File(temporaryFilePath)) } } return workspaceReturnValue diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt b/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt index f7ba891db3..b05c2acd18 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/MainActivity.kt @@ -316,12 +316,18 @@ class MainActivity : AppCompatActivity(), MainView, CommandListener { presenterMain.initializeFromCleanState(picturePath, pictureName) if (!model.isOpenedFromCatroid && presenterMain.checkForTemporaryFile() && (!isRunningEspressoTests || isTemporaryFileSavingTest)) { - val workspaceReturnValue = presenterMain.openTemporaryFile() - commandManager.loadCommandsCatrobatImage(workspaceReturnValue?.commandManagerModel) - model.colorHistory = workspaceReturnValue?.colorHistory ?: ColorHistory() - model.colorHistory.colors.lastOrNull()?.let { - toolReference.tool?.changePaintColor(it) - presenterMain.setBottomNavigationColor(it) + try{ + val workspaceReturnValue = presenterMain.openTemporaryFile() + commandManager.loadCommandsCatrobatImage(workspaceReturnValue?.commandManagerModel) + model.colorHistory = workspaceReturnValue?.colorHistory ?: ColorHistory() + model.colorHistory.colors.lastOrNull()?.let { + toolReference.tool?.changePaintColor(it) + presenterMain.setBottomNavigationColor(it) + } + } + catch(e: Exception){ + Log.e("Paintroid", "Temporary file Corrupted Error: ", e) + presenterMain.initializeFromCleanState(null, null) } } workspace.perspective.setBitmapDimensions(layerModel.width, layerModel.height) From 04ecef6542eed2da4f56cc7d0464cac918645ee3 Mon Sep 17 00:00:00 2001 From: Praneel Dev Date: Thu, 5 Mar 2026 08:11:05 +0530 Subject: [PATCH 3/3] Remove unused import for Runnable in FileIO.kt --- Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt index dc1474dbaf..be449597e0 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt @@ -39,7 +39,6 @@ import androidx.annotation.RequiresApi import androidx.core.content.FileProvider import androidx.exifinterface.media.ExifInterface import id.zelory.compressor.Compressor -import kotlinx.coroutines.Runnable import org.catrobat.paintroid.command.serialization.CommandSerializer import org.catrobat.paintroid.common.CATROBAT_IMAGE_ENDING import org.catrobat.paintroid.common.Constants.DOWNLOADS_DIRECTORY