Skip to content

Commit

Permalink
Merge pull request #1084 from Catrobat/hotfix-release-v2.8.3
Browse files Browse the repository at this point in the history
Hotfix release v2.8.3
  • Loading branch information
wslany authored May 6, 2022
2 parents 5cce665 + f9e741d commit 4a4bee5
Show file tree
Hide file tree
Showing 22 changed files with 304 additions and 151 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ package org.catrobat.paintroid.test.espresso
import android.app.Activity
import android.app.Instrumentation.ActivityResult
import android.content.Intent
import android.content.pm.ActivityInfo
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
Expand Down Expand Up @@ -74,10 +75,12 @@ class LayerIntegrationTest {

private var bitmapHeight = 0
private var bitmapWidth = 0
private lateinit var activity: Activity
private lateinit var deletionFileList: ArrayList<File?>

@Before
fun setUp() {
activity = launchActivityRule.activity
deletionFileList = ArrayList()
val workspace = launchActivityRule.activity.workspace
bitmapHeight = workspace.height
Expand Down Expand Up @@ -540,6 +543,22 @@ class LayerIntegrationTest {
.checkMatchesColorResource(R.color.pocketpaint_color_picker_green1)
}

@Test
fun testLayerPreviewKeepsBitmapAfterOrientationChange() {
ToolBarViewInteraction.onToolBarView()
.performSelectTool(ToolType.FILL)
DrawingSurfaceInteraction.onDrawingSurfaceView()
.perform(UiInteractions.touchAt(DrawingSurfaceLocationProvider.MIDDLE))
LayerMenuViewInteraction.onLayerMenuView()
.performOpen()
.checkLayerAtPositionHasTopLeftPixelWithColor(0, Color.BLACK)

activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

LayerMenuViewInteraction.onLayerMenuView()
.checkLayerAtPositionHasTopLeftPixelWithColor(0, Color.BLACK)
}

@Test
fun testUndoRedoLayerRotate() {
ToolBarViewInteraction.onToolBarView()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,20 @@

package org.catrobat.paintroid.test.espresso.util.wrappers;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;

import org.catrobat.paintroid.R;
import org.catrobat.paintroid.model.Layer;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

import androidx.annotation.ColorInt;
import androidx.test.espresso.DataInteraction;
import androidx.test.espresso.ViewInteraction;
import androidx.test.espresso.contrib.DrawerActions;
Expand Down Expand Up @@ -87,7 +92,7 @@ public LayerMenuViewInteraction performOpen() {
public LayerMenuViewInteraction performClose() {
check(matches(isDisplayed()));
onView(withId(R.id.pocketpaint_drawer_layout))
.perform(DrawerActions.close(Gravity.END));
.perform(DrawerActions.close(Gravity.END));
return this;
}

Expand Down Expand Up @@ -142,4 +147,34 @@ public boolean matchesSafely(View view) {
}
};
}

public LayerMenuViewInteraction checkLayerAtPositionHasTopLeftPixelWithColor(int listPosition, @ColorInt final int expectedColor) {
onData(instanceOf(Layer.class))
.inAdapterView(withId(R.id.pocketpaint_layer_side_nav_list))
.atPosition(listPosition)
.onChildView(withId(R.id.pocketpaint_item_layer_image))
.check(matches(new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("Color at coordinates is " + Integer.toHexString(expectedColor));
}

@Override
protected boolean matchesSafely(View view) {
Bitmap bitmap = getBitmap(((ImageView) view).getDrawable());
int actualColor = bitmap.getPixel(0, 0);
return actualColor == expectedColor;
}
}));

return this;
}

private Bitmap getBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -361,16 +361,16 @@ public void testIsClickInsideBoxCalculatedCorrect() {
}

@Test
public void testToolClicksOnTouchDownPosition() {
public void testToolPreciseMovementTest() {
float initialToolPositionX = toolToTest.toolPosition.x;
float initialToolPositionY = toolToTest.toolPosition.y;

toolToTest.handleDown(new PointF(initialToolPositionX, initialToolPositionY));
toolToTest.handleMove(new PointF(initialToolPositionX + 9, initialToolPositionY + 9));
toolToTest.handleUp(new PointF(initialToolPositionX + 9, initialToolPositionY + 9));

assertEquals(toolToTest.toolPosition.x, initialToolPositionX, 0);
assertEquals(toolToTest.toolPosition.y, initialToolPositionY, 0);
assertEquals(toolToTest.toolPosition.x, initialToolPositionX + 9, 0);
assertEquals(toolToTest.toolPosition.y, initialToolPositionY + 9, 0);
}

private class BaseToolWithRectangleShapeImpl extends BaseToolWithRectangleShape {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public void testShouldReturnCorrectToolType() {
}

@Test
public void testToolClicksOnTouchDownPosition() {
public void testToolPreciseMovementTest() {
Looper.prepare();

float initialToolPositionX = tool.toolPosition.x;
Expand All @@ -128,7 +128,7 @@ public void testToolClicksOnTouchDownPosition() {
tool.handleMove(new PointF(initialToolPositionX + 9, initialToolPositionY + 9));
tool.handleUp(new PointF(initialToolPositionX + 9, initialToolPositionY + 9));

assertEquals(tool.toolPosition.x, initialToolPositionX, 0);
assertEquals(tool.toolPosition.y, initialToolPositionY, 0);
assertEquals(tool.toolPosition.x, initialToolPositionX + 9, 0);
assertEquals(tool.toolPosition.y, initialToolPositionY + 9, 0);
}
}
3 changes: 2 additions & 1 deletion Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import org.catrobat.paintroid.common.IS_NO_FILE
import org.catrobat.paintroid.common.IS_ORA
import org.catrobat.paintroid.common.IS_PNG
import org.catrobat.paintroid.common.MAX_LAYERS
import org.catrobat.paintroid.common.TEMP_PICTURE_NAME
import org.catrobat.paintroid.iotasks.BitmapReturnValue
import org.catrobat.paintroid.presenter.MainActivityPresenter
import java.io.File
Expand Down Expand Up @@ -160,7 +161,7 @@ object FileIO {
val compressor = Compressor(mainActivity)
compressor.setQuality(compressQuality)
compressor.setCompressFormat(compressFormat)
val tempFileName = "tmp"
val tempFileName = TEMP_PICTURE_NAME
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
var compressed: File? = null
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import androidx.appcompat.widget.TooltipCompat
import androidx.core.widget.ContentLoadingProgressBar
import androidx.drawerlayout.widget.DrawerLayout
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.navigation.NavigationView
import org.catrobat.paintroid.command.CommandFactory
import org.catrobat.paintroid.command.CommandManager
import org.catrobat.paintroid.command.CommandManager.CommandListener
Expand All @@ -56,7 +57,6 @@ import org.catrobat.paintroid.contract.MainActivityContracts
import org.catrobat.paintroid.contract.MainActivityContracts.MainView
import org.catrobat.paintroid.controller.DefaultToolController
import org.catrobat.paintroid.iotasks.OpenRasterFileFormatConversion
import org.catrobat.paintroid.listener.DrawerLayoutListener
import org.catrobat.paintroid.listener.PresenterColorPickedListener
import org.catrobat.paintroid.model.LayerModel
import org.catrobat.paintroid.model.MainActivityModel
Expand Down Expand Up @@ -411,7 +411,7 @@ class MainActivity : AppCompatActivity(), MainView, CommandListener {
}

private fun onCreateLayerMenu() {
val layerLayout = findViewById<ViewGroup>(R.id.pocketpaint_layer_side_nav_menu)
val layerLayout = findViewById<NavigationView>(R.id.pocketpaint_nav_view_layer)
val layerListView = findViewById<DragAndDropListView>(R.id.pocketpaint_layer_side_nav_list)
val layerMenuViewHolder = LayerMenuViewHolder(layerLayout)
val layerNavigator = LayerNavigator(applicationContext)
Expand All @@ -422,9 +422,6 @@ class MainActivity : AppCompatActivity(), MainView, CommandListener {
val layerAdapter = LayerAdapter(layerPresenter)
presenterMain.setLayerAdapter(layerAdapter)
layerPresenter.setAdapter(layerAdapter)
findViewById<DrawerLayout>(R.id.pocketpaint_drawer_layout).also {
it.addDrawerListener(DrawerLayoutListener(it, layerAdapter))
}
layerListView.setPresenter(layerPresenter)
layerListView.adapter = layerAdapter
layerPresenter.refreshLayerMenuViewHolder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ package org.catrobat.paintroid.command.implementation

import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Point
import android.graphics.RectF
import androidx.annotation.VisibleForTesting
Expand Down Expand Up @@ -59,7 +58,7 @@ class StampCommand(bitmap: Bitmap, position: Point, width: Float, height: Float,
save()
translate(coordinates.x.toFloat(), coordinates.y.toFloat())
rotate(boxRotation)
drawBitmap(bitmapToDraw, null, rect, Paint(Paint.DITHER_FLAG))
drawBitmap(bitmapToDraw, null, rect, null)
restore()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ interface LayerContracts {
fun notifyDataSetChanged()

fun getViewHolderAt(position: Int): LayerViewHolder?

fun setDrawerLayoutOpen(isOpen: Boolean)
}

interface Presenter {
Expand Down Expand Up @@ -67,6 +65,8 @@ interface LayerContracts {
fun setDefaultToolController(defaultToolController: DefaultToolController)

fun setBottomNavigationViewHolder(bottomNavigationViewHolder: BottomNavigationViewHolder)

fun isShown(): Boolean
}

interface LayerViewHolder {
Expand All @@ -83,7 +83,7 @@ interface LayerContracts {

fun setDeselected()

fun updateImageView(bitmap: Bitmap?, isDrawerLayoutOpen: Boolean)
fun updateImageView(bitmap: Bitmap?)

fun setMergable()

Expand All @@ -100,6 +100,8 @@ interface LayerContracts {
fun disableRemoveLayerButton()

fun enableRemoveLayerButton()

fun isShown(): Boolean
}

interface Layer {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,20 @@ import org.catrobat.paintroid.tools.ToolType
import org.catrobat.paintroid.tools.options.ToolOptionsViewController
import org.catrobat.paintroid.ui.DrawingSurface
import java.util.EnumSet
import kotlin.collections.ArrayList
import kotlin.collections.MutableList
import kotlin.collections.mutableListOf
import kotlin.math.hypot

private const val DRAWER_EDGE_SIZE = 20f
private const val CONSTANT_1 = 0.5f
private const val JITTER_DELAY_THRESHOLD: Long = 30
private const val JITTER_DISTANCE_THRESHOLD = 50f

open class DrawingSurfaceListener(
private val autoScrollTask: AutoScrollTask,
private val callback: DrawingSurfaceListenerCallback,
displayDensity: Float
private val displayDensity: Float
) : OnTouchListener {
private var touchMode: TouchMode
private var pointerDistance = 0f
Expand All @@ -52,6 +57,10 @@ open class DrawingSurfaceListener(
private var autoScroll = true
private var timerStartDraw = 0.toLong()

private var recentTouchEventsData: MutableList<TouchEventData> = mutableListOf()

private data class TouchEventData constructor(val timeStamp: Long, val xCoordinate: Float, val yCoordinate: Float)

internal enum class TouchMode {
DRAW, PINCH
}
Expand Down Expand Up @@ -99,6 +108,8 @@ open class DrawingSurfaceListener(
val yOld: Float
if (event.pointerCount == 1) {
currentTool ?: return
recentTouchEventsData.add(TouchEventData(event.eventTime, event.x, event.y))
removeObsoleteTouchEventsData(event.eventTime)
if (currentTool.handToolMode()) {
disableAutoScroll()
if (touchMode == TouchMode.PINCH) {
Expand Down Expand Up @@ -155,6 +166,7 @@ open class DrawingSurfaceListener(
return false
}
timerStartDraw = System.currentTimeMillis()
recentTouchEventsData.add(TouchEventData(event.eventTime, event.x, event.y))
currentTool?.handleDown(canvasTouchPoint)
if (autoScroll) {
setEvenPointAndViewDimensionsForAutoScrollTask(view)
Expand All @@ -168,6 +180,22 @@ open class DrawingSurfaceListener(
}
if (touchMode == TouchMode.DRAW) {
val drawingTime = System.currentTimeMillis() - timerStartDraw
removeObsoleteTouchEventsData(event.eventTime)
var dX = 0f
var dY = 0f
if (recentTouchEventsData.size > 1) {
val oldestEntry = recentTouchEventsData[0]
val distanceCorrectionX = event.x - oldestEntry.xCoordinate
val distanceCorrectionY = event.y - oldestEntry.yCoordinate
val distance = distanceCorrectionX * distanceCorrectionX + distanceCorrectionY * distanceCorrectionY
if (distance < JITTER_DISTANCE_THRESHOLD * displayDensity && distance != 0f) {
dX = distanceCorrectionX
dY = distanceCorrectionY
}
}
canvasTouchPoint.x = event.x - dX
canvasTouchPoint.y = event.y - dY
callback.convertToCanvasFromSurface(canvasTouchPoint)
currentTool?.drawTime = drawingTime
currentTool?.handleUp(canvasTouchPoint)
} else {
Expand All @@ -185,6 +213,18 @@ open class DrawingSurfaceListener(
return true
}

private fun removeObsoleteTouchEventsData(timeStamp: Long) {
val obsoleteTouchEventsData: MutableList<TouchEventData> = ArrayList()
for (touchEventData in recentTouchEventsData) {
if (timeStamp - touchEventData.timeStamp > JITTER_DELAY_THRESHOLD) {
obsoleteTouchEventsData.add(touchEventData)
} else {
break
}
}
recentTouchEventsData.removeAll(obsoleteTouchEventsData)
}

open class AutoScrollTask(
private val handler: Handler,
private val callback: AutoScrollTaskCallback
Expand Down
Loading

0 comments on commit 4a4bee5

Please sign in to comment.