diff --git a/Jenkinsfile b/Jenkinsfile index 301bdb65b7..d93cd7c5f3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -27,25 +27,7 @@ pipeline { parameters { string name: 'DEBUG_LABEL', defaultValue: '', description: 'For debugging when entered will be used as label to decide on which slaves the jobs will run.' booleanParam name: 'BUILD_WITH_CATROID', defaultValue: false, description: 'When checked then the current Paintroid build will be built with the current develop branch of Catroid' - booleanParam name: 'DEVICE_TESTING', defaultValue: true, description: 'When selected UI-testing runs locally' string name: 'CATROID_BRANCH', defaultValue: 'develop', description: 'The branch which to build catroid with, when BUILD_WITH_CATROID is checked.' - separator(name: "BROWSERSTACK", sectionHeader: "BrowserStack configuration", - separatorStyle: "border-width: 0", - sectionHeaderStyle: """ - background-color: #ffff00; - text-align: center; - padding: 4px; - color: #000000; - font-size: 20px; - font-weight: normal; - font-family: 'Orienta', sans-serif; - letter-spacing: 1px; - font-style: italic; - """) - choice choices: ['AndroidDevices', 'Samsung Galaxy S23-13.0', 'Samsung Galaxy S23 Ultra-13.0', 'Samsung Galaxy S22 Ultra-12.0', 'Samsung Galaxy S22 Plus-12.0', 'Samsung Galaxy S22-12.0', 'Samsung Galaxy S21-12.0', 'Samsung Galaxy S21 Ultra-11.0', 'Samsung Galaxy S21-11.0', 'Samsung Galaxy S21 Plus-11.0', 'Samsung Galaxy S20-10.0', 'Samsung Galaxy S20 Plus-10.0', 'Samsung Galaxy S20 Ultra-10.0', 'Samsung Galaxy M52-11.0', 'Samsung Galaxy M32-11.0', 'Samsung Galaxy A52-11.0', 'Samsung Galaxy Note 20 Ultra-10.0', 'Samsung Galaxy Note 20-10.0', 'Samsung Galaxy A51-10.0', 'Samsung Galaxy A11-10.0', 'Samsung Galaxy S10e-9.0', 'Samsung Galaxy S10 Plus-9.0', 'Samsung Galaxy S10-9.0', 'Samsung Galaxy Note 10 Plus-9.0', 'Samsung Galaxy Note 10-9.0', 'Samsung Galaxy A10-9.0', 'Samsung Galaxy Note 9-8.1', 'Samsung Galaxy J7 Prime-8.1', 'Samsung Galaxy S9 Plus-9.0', 'Samsung Galaxy S9 Plus-8.0', 'Samsung Galaxy S9-8.0', 'Samsung Galaxy Note 8-7.1', 'Samsung Galaxy A8-7.1', 'Samsung Galaxy S8 Plus-7.0', 'Samsung Galaxy S8-7.0', 'Samsung Galaxy S7-6.0', 'Samsung Galaxy S6-5.0', 'Samsung Galaxy Tab S8-12.0', 'Samsung Galaxy Tab S7-11.0', 'Samsung Galaxy Tab S7-10.0', 'Samsung Galaxy Tab S6-9.0', 'Samsung Galaxy Tab S5e-9.0', 'Samsung Galaxy Tab S4-8.1', 'Google Pixel 7 Pro-13.0', 'Google Pixel 7-13.0', 'Google Pixel 6 Pro-13.0', 'Google Pixel 6 Pro-12.0', 'Google Pixel 6-12.0', 'Google Pixel 5-12.0', 'Google Pixel 5-11.0', 'Google Pixel 4-11.0', 'Google Pixel 4 XL-10.0', 'Google Pixel 4-10.0', 'Google Pixel 3-10.0', 'Google Pixel 3a XL-9.0', 'Google Pixel 3a-9.0', 'Google Pixel 3 XL-9.0', 'Google Pixel 3-9.0', 'Google Pixel 2-9.0', 'Google Pixel 2-8.0', 'Google Pixel-7.1', 'Google Nexus 5-4.4', 'OnePlus 9-11.0', 'OnePlus 8-10.0', 'OnePlus 7T-10.0', 'OnePlus 7-9.0', 'OnePlus 6T-9.0', 'Xiaomi Redmi Note 11-11.0', 'Xiaomi Redmi Note 9-10.0', 'Xiaomi Redmi Note 8-9.0', 'Xiaomi Redmi Note 7-9.0', 'Motorola Moto G71 5G-11.0', 'Motorola Moto G9 Play-10.0', 'Motorola Moto G7 Play-9.0', 'Vivo Y21-11.0', 'Vivo Y50-10.0', 'Oppo Reno 6-11.0', 'Oppo A96-11.0', 'Oppo Reno 3 Pro-10.0', 'Huawei P30-9.0'], description: 'Available Android Devices on BrowserStack', name: 'BROWSERSTACK_ANDROID_DEVICES' - booleanParam name: 'BROWSERSTACK_TESTING', defaultValue: false, description: 'When selected testing runs over Browserstack' - choice choices: ['1', '2', '3', '4',' 5'], description: 'Number of Shards for running tests on BrowserStack. BrowserStack Dashboard', name: 'BROWSERSTACK_SHARDS' - } agent { @@ -57,8 +39,6 @@ pipeline { } } - tools {nodejs "NodeJS"} - options { timeout(time: 2, unit: 'HOURS') timestamps() @@ -79,15 +59,6 @@ pipeline { } } - stage('Build Test-APK') { - steps { - sh "./gradlew -Pindependent='#$env.BUILD_NUMBER $env.BRANCH_NAME' assembleAndroidTest" - archiveArtifacts 'Paintroid/build/outputs/apk/androidTest/debug/*.apk' - renameApks("${env.BRANCH_NAME}-${env.BUILD_NUMBER}") - plot csvFileName: 'dexcount.csv', csvSeries: [[displayTableFlag: false, exclusionValues: '', file: 'Paintroid/build/outputs/dexcount/*.csv', inclusionFlag: 'OFF', url: '']], group: 'APK Stats', numBuilds: '180', style: 'line', title: 'dexcount' - } - } - stage('Build with Catroid') { when { expression { @@ -129,18 +100,6 @@ pipeline { } } - stage('Browserstack testing') { - when { - expression { params.BROWSERSTACK_TESTING == true } - } - steps { - withCredentials([usernamePassword(credentialsId: 'browserstack', passwordVariable: 'BROWSERSTACK_ACCESS_KEY', usernameVariable: 'BROWSERSTACK_USERNAME')]) { - script { - browserStack('app/build/outputs/apk/debug/', 'Paintroid/build/outputs/apk/androidTest/debug/', 'Paintroid') - } - } - } - } stage('Tests') { stages { stage('Unit Tests') { @@ -155,9 +114,6 @@ pipeline { } stage('Device Tests') { - when { - expression { params.DEVICE_TESTING == true } - } steps { sh "echo no | avdmanager create avd --force --name android28 --package 'system-images;android-28;default;x86_64'" sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android28 > /dev/null 2>&1 &" diff --git a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/UndoRedoIntegrationTest.kt b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/UndoRedoIntegrationTest.kt index 6ba9e5f472..34bddd87d8 100644 --- a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/UndoRedoIntegrationTest.kt +++ b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/UndoRedoIntegrationTest.kt @@ -453,4 +453,41 @@ class UndoRedoIntegrationTest { BitmapLocationProvider.HALFWAY_TOP_MIDDLE ) } + + @Test + fun testNoColorUndoInEraserMode() { + onToolBarView() + .performSelectTool(ToolType.FILL) + onDrawingSurfaceView() + .perform(UiInteractions.touchAt(DrawingSurfaceLocationProvider.MIDDLE)) + selectColorInDialog(0) + selectColorInDialog(1) + selectColorInDialog(2) + onToolBarView() + .performSelectTool(ToolType.ERASER) + onDrawingSurfaceView().perform( + UiInteractions.swipeAccurate( + DrawingSurfaceLocationProvider.HALFWAY_TOP_MIDDLE, + DrawingSurfaceLocationProvider.HALFWAY_BOTTOM_MIDDLE + ) + ) + onTopBarView().performUndo() + onTopBarView().performUndo() + onToolBarView() + .performSelectTool(ToolType.BRUSH) + onDrawingSurfaceView().perform( + UiInteractions.swipeAccurate( + DrawingSurfaceLocationProvider.HALFWAY_TOP_MIDDLE, + DrawingSurfaceLocationProvider.HALFWAY_BOTTOM_MIDDLE + ) + ) + onDrawingSurfaceView().perform( + UiInteractions.swipeAccurate( + DrawingSurfaceLocationProvider.HALFWAY_TOP_LEFT, + DrawingSurfaceLocationProvider.HALFWAY_TOP_RIGHT + ) + ) + onDrawingSurfaceView() + .checkPixelColor(Color.parseColor("#FF078707"), BitmapLocationProvider.HALFWAY_TOP_MIDDLE) + } } diff --git a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/tools/ClippingToolIntegrationTest.kt b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/tools/ClippingToolIntegrationTest.kt index f790d925da..8cf7d42f11 100644 --- a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/tools/ClippingToolIntegrationTest.kt +++ b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/tools/ClippingToolIntegrationTest.kt @@ -214,7 +214,7 @@ class ClippingToolIntegrationTest { .performClose() val bitmapColor = workspace.bitmapOfCurrentLayer?.getPixel(middleTop.x.toInt(), middleTop.y.toInt()) - assertEquals(bitmapColor, Color.BLACK) + assertEquals(bitmapColor, Color.TRANSPARENT) } @Test @@ -320,8 +320,9 @@ class ClippingToolIntegrationTest { val colorOutOfAreaAfterUndo = workspace.bitmapOfCurrentLayer?.getPixel(outOfAreaX, outOfAreaY) assertEquals(colorOutOfAreaAfterUndo, Color.BLACK) - TopBarViewInteraction.onTopBarView() - .performRedo() + while (mainActivity.commandManager.isRedoAvailable) { + TopBarViewInteraction.onTopBarView().performRedo() + } val colorOutOfAreaAfterRedo = workspace.bitmapOfCurrentLayer?.getPixel(outOfAreaX, outOfAreaY) assertEquals(colorOutOfAreaAfterRedo, Color.TRANSPARENT) diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/command/implementation/ColorChangedCommand.kt b/Paintroid/src/main/java/org/catrobat/paintroid/command/implementation/ColorChangedCommand.kt index 033a09904d..378a9dd3b2 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/command/implementation/ColorChangedCommand.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/command/implementation/ColorChangedCommand.kt @@ -25,6 +25,7 @@ import org.catrobat.paintroid.MainActivity import org.catrobat.paintroid.command.Command import org.catrobat.paintroid.contract.LayerContracts import org.catrobat.paintroid.tools.ToolReference +import org.catrobat.paintroid.tools.implementation.EraserTool import org.catrobat.paintroid.tools.implementation.LineTool class ColorChangedCommand(toolReference: ToolReference, context: Context, color: Int) : Command { @@ -51,8 +52,10 @@ class ColorChangedCommand(toolReference: ToolReference, context: Context, color: firstTime = false } } - (context as MainActivity).runOnUiThread { - (context as MainActivity).bottomNavigationViewHolder.setColorButtonColor(color) + if (toolReference.tool !is EraserTool) { + (context as MainActivity).runOnUiThread { + (context as MainActivity).bottomNavigationViewHolder.setColorButtonColor(color) + } } } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/presenter/MainActivityPresenter.kt b/Paintroid/src/main/java/org/catrobat/paintroid/presenter/MainActivityPresenter.kt index 929a6f2cc5..3a4e453d29 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/presenter/MainActivityPresenter.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/presenter/MainActivityPresenter.kt @@ -98,6 +98,7 @@ import org.catrobat.paintroid.tools.implementation.CONSTANT_3 import org.catrobat.paintroid.tools.implementation.ClippingTool import org.catrobat.paintroid.tools.implementation.LineTool import org.catrobat.paintroid.tools.implementation.DefaultToolPaint +import org.catrobat.paintroid.tools.implementation.EraserTool import org.catrobat.paintroid.ui.LayerAdapter import java.io.File @@ -591,7 +592,7 @@ open class MainActivityPresenter( if (view.isKeyboardShown) { view.hideKeyboard() } else { - if (commandManager.isLastColorCommandOnTop() || commandManager.getColorCommandCount() == 0) { + if (toolController.currentTool !is EraserTool && (commandManager.isLastColorCommandOnTop() || commandManager.getColorCommandCount() == 0)) { toolController.currentTool?.changePaintColor(Color.BLACK) setBottomNavigationColor(Color.BLACK) } @@ -604,7 +605,11 @@ open class MainActivityPresenter( if (toolController.currentTool is LineTool) { (toolController.currentTool as LineTool).undoChangePaintColor(Color.BLACK, false) } else { - commandManager.undo() + if (toolController.currentTool is EraserTool) { + commandManager.undoIgnoringColorChanges() + } else { + commandManager.undo() + } } } } @@ -645,6 +650,7 @@ open class MainActivityPresenter( } } } + checkIfClippingToolNeedsAdjustment() drawerLayoutViewHolder.openDrawer(Gravity.END) idlingResource.decrement() } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/BrushTool.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/BrushTool.kt index b87e4b39a8..675d0b0958 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/BrushTool.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/BrushTool.kt @@ -243,7 +243,6 @@ open class BrushTool( val pathNew = AdvancedSettingsAlgorithms.smoothingAlgorithm(pointArray) val command = commandFactory.createPathCommand(bitmapPaint, pathNew) commandManager.addCommand(command) - commandManager.executeAllCommands() } pointArray.clear() diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/LayerAdapter.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/LayerAdapter.kt index f28cd9a47c..cc7fa2e5c3 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/ui/LayerAdapter.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/LayerAdapter.kt @@ -96,10 +96,7 @@ class LayerAdapter( get() = itemView override fun bindView() { - val layer = layerPresenter.getLayerItem(position) - if (layer == null) { - return - } + val layer = layerPresenter.getLayerItem(position) ?: return val isSelected = layer === layerPresenter.getSelectedLayer() setSelected(isSelected) setLayerVisibilityCheckbox(layer.isVisible) @@ -145,8 +142,6 @@ class LayerAdapter( opacitySeekBar.progress = opacityPercentage layerPresenter.changeLayerOpacity(position, opacityPercentage) } - - layer.opacityPercentage = opacityPercentage layerPresenter.refreshDrawingSurface() } }) diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt index 4f2f3d8e9c..ca9992f843 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/zoomwindow/DefaultZoomWindowController.kt @@ -203,8 +203,7 @@ class DefaultZoomWindowController canvas.drawBitmap(backgroundBitmap, Matrix(), null) - if (toolReference.tool?.toolType?.name.equals(ToolType.LINE.name) || - toolReference.tool?.toolType?.name.equals(ToolType.CURSOR.name)) { + if (checkIfToolCompatibleWithZoomWindow(toolReference.tool) == Constants.COMPATIBLE_NEW) { layerModel.currentLayer?.bitmap?.let { canvas.drawBitmap(it, zoomWindowDiameter / 2f, zoomWindowDiameter / 2f, null) } @@ -229,12 +228,8 @@ class DefaultZoomWindowController ToolType.IMPORTPNG.name, ToolType.SHAPE.name, ToolType.TEXT.name -> Constants.NOT_COMPATIBLE - ToolType.LINE.name, - ToolType.CURSOR.name, - ToolType.WATERCOLOR.name, - ToolType.SPRAY.name, - ToolType.BRUSH.name -> Constants.COMPATIBLE_NEW - else -> Constants.COMPATIBLE_ALL + ToolType.ERASER.name -> Constants.COMPATIBLE_ALL + else -> Constants.COMPATIBLE_NEW } } diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_watercolor.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_watercolor.xml index 726e9c049c..1704292824 100644 --- a/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_watercolor.xml +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_tool_watercolor.xml @@ -1,8 +1,8 @@ + android:width="24dp">