diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..c5f3f6b9c7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index d0ecd8e85a..ac73c8f271 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -53,7 +53,7 @@ pipeline { stage('Build Debug-APK') { steps { sh "./gradlew -Pindependent='#$env.BUILD_NUMBER $env.BRANCH_NAME' assembleDebug" - archiveArtifacts 'app/build/outputs/apk/debug/paintroid-debug*.apk' + archiveArtifacts artifacts: 'app/build/outputs/apk/debug/paintroid-debug*.apk', allowEmptyArchive: true 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' } } @@ -76,9 +76,9 @@ pipeline { } renameApks("${env.BRANCH_NAME}-${env.BUILD_NUMBER}") dir('Catroid') { - archiveArtifacts "catroid/src/main/libs/*.aar" + archiveArtifacts artifacts: "catroid/src/main/libs/*.aar", allowEmptyArchive: true sh "./gradlew assembleCatroidDebug" - archiveArtifacts 'catroid/build/outputs/apk/catroid/debug/catroid-catroid-debug.apk' + archiveArtifacts artifacts: 'catroid/build/outputs/apk/catroid/debug/catroid-catroid-debug.apk', allowEmptyArchive: true } } } @@ -123,7 +123,7 @@ pipeline { sh '/home/user/android/sdk/platform-tools/adb logcat -d > logcat.txt' sh './gradlew stopEmulator' junitAndCoverage "$reports/coverage/debug/report.xml", 'device', javaSrc - archiveArtifacts 'logcat.txt' + archiveArtifacts artifacts: 'logcat.txt', allowEmptyArchive: true } } } diff --git a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/util/wrappers/ShapeToolOptionsViewInteraction.kt b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/util/wrappers/ShapeToolOptionsViewInteraction.kt index 85dd0e3dd1..1763bf38cb 100644 --- a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/util/wrappers/ShapeToolOptionsViewInteraction.kt +++ b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/espresso/util/wrappers/ShapeToolOptionsViewInteraction.kt @@ -47,12 +47,14 @@ class ShapeToolOptionsViewInteraction private constructor() : fun performSelectShape(shape: DrawableShape): ShapeToolOptionsViewInteraction { Espresso.onView(ViewMatchers.withId(getButtonIdFromBaseShape(shape))) + .check(androidx.test.espresso.assertion.ViewAssertions.matches(ViewMatchers.isDisplayed())) .perform(ViewActions.click()) return this } fun performSelectShapeDrawType(shapeDrawType: DrawableStyle): ShapeToolOptionsViewInteraction { Espresso.onView(ViewMatchers.withId(getButtonIdFromShapeDrawType(shapeDrawType))) + .check(androidx.test.espresso.assertion.ViewAssertions.matches(ViewMatchers.isDisplayed())) .perform(ViewActions.click()) return this } diff --git a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/junit/tools/ClipboardToolTest.kt b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/junit/tools/ClipboardToolTest.kt index bd9d375c1e..d7640572ef 100644 --- a/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/junit/tools/ClipboardToolTest.kt +++ b/Paintroid/src/androidTest/java/org/catrobat/paintroid/test/junit/tools/ClipboardToolTest.kt @@ -147,4 +147,41 @@ class ClipboardToolTest { Assert.assertEquals(tool!!.toolPosition.x, initialToolPositionX + 9, 0f) Assert.assertEquals(tool!!.toolPosition.y, initialToolPositionY + 9, 0f) } + + @Test + fun testClearButtonEnabledAfterCopy() { + Mockito.`when`(workspace!!.bitmapOfCurrentLayer).thenReturn( + Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888) + ) + tool!!.copyBoxContent() + Mockito.verify(clipboardToolOptionsView)!!.enableClear(true) + } + + @Test + fun testClearButtonEnabledAfterCut() { + Mockito.`when`(workspace!!.bitmapOfCurrentLayer).thenReturn( + Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888) + ) + tool!!.copyBoxContent() + Mockito.verify(clipboardToolOptionsView)!!.enableClear(true) + } + + @Test + fun testClearDisablesPasteAndClearButtons() { + Mockito.`when`(workspace!!.bitmapOfCurrentLayer).thenReturn( + Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888) + ) + // First copy to enable buttons + tool!!.copyBoxContent() + Mockito.verify(clipboardToolOptionsView)!!.enablePaste(true) + Mockito.verify(clipboardToolOptionsView)!!.enableClear(true) + // Now clear and verify both buttons are disabled + Mockito.clearInvocations(clipboardToolOptionsView) + // Simulate clear button click by getting the callback and calling clearClicked + val callbackCaptor = org.mockito.ArgumentCaptor.forClass(ClipboardToolOptionsView.Callback::class.java) + Mockito.verify(clipboardToolOptionsView, Mockito.atLeastOnce())!!.setCallback(callbackCaptor.capture()) + callbackCaptor.value.clearClicked() + Mockito.verify(clipboardToolOptionsView)!!.enablePaste(false) + Mockito.verify(clipboardToolOptionsView)!!.enableClear(false) + } } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/ClipboardTool.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/ClipboardTool.kt index 8b584f4f7c..1213465cf6 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/ClipboardTool.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/implementation/ClipboardTool.kt @@ -80,6 +80,7 @@ class ClipboardTool( highlightBox() copyBoxContent() this@ClipboardTool.clipboardToolOptionsView.enablePaste(true) + this@ClipboardTool.clipboardToolOptionsView.enableClear(true) } override fun cutClicked() { @@ -87,12 +88,21 @@ class ClipboardTool( copyBoxContent() cutBoxContent() this@ClipboardTool.clipboardToolOptionsView.enablePaste(true) + this@ClipboardTool.clipboardToolOptionsView.enableClear(true) } override fun pasteClicked() { highlightBox() pasteBoxContent() } + + override fun clearClicked() { + highlightBox() + drawingBitmap = null + readyForPaste = false + this@ClipboardTool.clipboardToolOptionsView.enablePaste(false) + this@ClipboardTool.clipboardToolOptionsView.enableClear(false) + } } clipboardToolOptionsView.setCallback(callback) toolOptionsViewController.showDelayed() diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/ClipboardToolOptionsView.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/ClipboardToolOptionsView.kt index 77a6255d26..4bf14fbe72 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/ClipboardToolOptionsView.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/options/ClipboardToolOptionsView.kt @@ -25,6 +25,8 @@ interface ClipboardToolOptionsView { fun enablePaste(enable: Boolean) + fun enableClear(enable: Boolean) + fun setShapeSizeText(shapeSize: String) fun toggleShapeSizeVisibility(isVisible: Boolean) @@ -37,5 +39,7 @@ interface ClipboardToolOptionsView { fun cutClicked() fun pasteClicked() + + fun clearClicked() } } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultClipboardToolOptionsView.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultClipboardToolOptionsView.kt index 8a99d22e30..e83c94e3dc 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultClipboardToolOptionsView.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultClipboardToolOptionsView.kt @@ -30,6 +30,7 @@ class DefaultClipboardToolOptionsView(rootView: ViewGroup) : ClipboardToolOption private val pasteChip: Chip private val copyChip: Chip private val cutChip: Chip + private val clearChip: Chip private val shapeSizeChip: Chip private val changeSizeShapeSizeChip: Chip private val clipboardToolOptionsView: View @@ -49,6 +50,10 @@ class DefaultClipboardToolOptionsView(rootView: ViewGroup) : ClipboardToolOption pasteChip.setOnClickListener { callback?.pasteClicked() } + + clearChip.setOnClickListener { + callback?.clearClicked() + } } override fun setCallback(callback: ClipboardToolOptionsView.Callback) { @@ -59,6 +64,10 @@ class DefaultClipboardToolOptionsView(rootView: ViewGroup) : ClipboardToolOption pasteChip.isEnabled = enable } + override fun enableClear(enable: Boolean) { + clearChip.isEnabled = enable + } + override fun toggleShapeSizeVisibility(isVisible: Boolean) { if (isVisible && !changeSizeShapeSizeChipVisible && clipboardToolOptionsView.visibility == View.INVISIBLE) { changeSizeShapeSizeChip.visibility = View.VISIBLE @@ -83,6 +92,7 @@ class DefaultClipboardToolOptionsView(rootView: ViewGroup) : ClipboardToolOption copyChip = stampToolOptionsView.findViewById(R.id.action_copy) pasteChip = stampToolOptionsView.findViewById(R.id.action_paste) cutChip = stampToolOptionsView.findViewById(R.id.action_cut) + clearChip = stampToolOptionsView.findViewById(R.id.action_clear) enablePaste(false) initializeListeners() stampToolOptionsView.run { diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_clipboard_tool.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_clipboard_tool.xml index 5baf9ee945..54992c8b2d 100644 --- a/Paintroid/src/main/res/layout/dialog_pocketpaint_clipboard_tool.xml +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_clipboard_tool.xml @@ -64,6 +64,23 @@ app:chipIcon="@drawable/ic_pocketpaint_paste_chip_icon_selector" app:chipStartPadding="8dp" /> + + + + Paste Copy Cut + Clear Stickers @string/button_import_image diff --git a/gradle.properties b/gradle.properties index 5e9758afa7..3ce859e6c7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ android.enableJetifier=true android.useAndroidX=true -org.gradle.jvmargs=-XX:MaxPermSize=1024m -Xmx4096m -android.disableAutomaticComponentCreation=true \ No newline at end of file +org.gradle.jvmargs=-Xmx4096m +android.disableAutomaticComponentCreation=true