diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt index 864f069b0c..190981aa0d 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt @@ -104,7 +104,8 @@ object FileIO { PNG("png"), JPG("jpg"), ORA("ora"), - CATROBAT("catrobat-image"); + CATROBAT("catrobat-image"), + GIF("gif"); fun toExtension(): String = ".$value" } @@ -132,7 +133,7 @@ object FileIO { } @Throws(IOException::class) - fun saveBitmapToUri(uri: Uri, bitmap: Bitmap?, context: Context): Uri { + fun saveBitmapToUri(uri: Uri, bitmap: Bitmap?, context: Context): Uri { val uid = UUID.randomUUID() val cachedImageUri = saveBitmapToCache(bitmap, context as MainActivity, uid.toString()) var cachedFile: File? = null diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt b/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt index b93795d6d6..d4726e9e8c 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt @@ -18,17 +18,21 @@ */ package org.catrobat.paintroid -import java.io.File -import java.lang.IllegalArgumentException + +import android.graphics.Bitmap @SuppressWarnings("ThrowingExceptionsWithoutMessageOrCause") -class PaintroidApplication private constructor() { - companion object { - @JvmStatic - var cacheDir: File? = null - } +class PaintroidApplication() { + object DrawingSurface { + fun copyBitmap(): Bitmap { - init { - throw IllegalArgumentException() + return Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888) + } } } + + + + + + diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/contract/MainActivityContracts.kt b/Paintroid/src/main/java/org/catrobat/paintroid/contract/MainActivityContracts.kt index 84fef55bab..517bb8a02b 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/contract/MainActivityContracts.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/contract/MainActivityContracts.kt @@ -308,6 +308,7 @@ interface MainActivityContracts { fun checkForTemporaryFile(): Boolean fun setColorHistoryAfterLoadImage(colorHistory: ColorHistory?) + fun showGifInformationDialog() } interface Model { diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/dialog/SaveInformationDialog.kt b/Paintroid/src/main/java/org/catrobat/paintroid/dialog/SaveInformationDialog.kt index b58f914105..3a671557c5 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/dialog/SaveInformationDialog.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/dialog/SaveInformationDialog.kt @@ -22,6 +22,7 @@ import android.annotation.SuppressLint import android.app.Dialog import android.graphics.Bitmap import android.os.Bundle +import android.os.Environment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -36,19 +37,36 @@ import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatImageButton import androidx.appcompat.widget.AppCompatTextView import org.catrobat.paintroid.FileIO -import org.catrobat.paintroid.FileIO.FileType + + import org.catrobat.paintroid.FileIO.FileType.PNG import org.catrobat.paintroid.FileIO.FileType.JPG import org.catrobat.paintroid.FileIO.FileType.CATROBAT import org.catrobat.paintroid.FileIO.FileType.ORA +import org.catrobat.paintroid.PaintroidApplication + import org.catrobat.paintroid.R +import java.io.File +import java.io.FileOutputStream +import java.io.IOException import java.util.Locale + + + + + + + + private const val STANDARD_FILE_NAME = "image" private const val SET_NAME = "setName" private const val PERMISSION = "permission" private const val IS_EXPORT = "isExport" + + + class SaveInformationDialog : MainActivityDialogFragment(), OnItemSelectedListener, @@ -57,6 +75,7 @@ class SaveInformationDialog : private lateinit var inflater: LayoutInflater private lateinit var specificFormatLayout: ViewGroup private lateinit var jpgView: View + private lateinit var percentage: AppCompatTextView private lateinit var imageName: AppCompatEditText private lateinit var fileName: String @@ -73,7 +92,7 @@ class SaveInformationDialog : if (isStandard) { FileIO.filename = STANDARD_FILE_NAME FileIO.compressFormat = Bitmap.CompressFormat.PNG - FileIO.fileType = PNG + } return SaveInformationDialog().apply { arguments = Bundle().apply { @@ -118,8 +137,9 @@ class SaveInformationDialog : FileIO.storeImageUri = null if (FileIO.checkFileExists(FileIO.fileType, FileIO.defaultFileName, requireContext().contentResolver)) { presenter.showOverwriteDialog(permission, isExport) + } else { - presenter.switchBetweenVersions(permission, isExport) + } dismiss() } @@ -127,8 +147,11 @@ class SaveInformationDialog : .create() } + private fun initViews(customLayout: View) { initSpecificFormatLayout(customLayout) + + initJpgView() initSeekBar() initPercentage() @@ -141,6 +164,10 @@ class SaveInformationDialog : specificFormatLayout = view.findViewById(R.id.pocketpaint_save_format_specific_options) } + + + + private fun initJpgView() { jpgView = inflater.inflate( R.layout.dialog_pocketpaint_save_jpg_sub_dialog, @@ -168,16 +195,19 @@ class SaveInformationDialog : JPG -> presenter.showJpgInformationDialog() ORA -> presenter.showOraInformationDialog() CATROBAT -> presenter.showCatrobatInformationDialog() + FileType.GIF -> presenter.showGifInformationDialog() else -> presenter.showPngInformationDialog() } } } + + private fun initSpinner(view: View) { spinner = view.findViewById(R.id.pocketpaint_save_dialog_spinner) val spinnerArray = FileType.values().map { it.value } val adapter = ArrayAdapter(spinner.context, android.R.layout.simple_spinner_item, spinnerArray) - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) //xml file spinner.adapter = adapter spinner.onItemSelectedListener = this } @@ -204,6 +234,7 @@ class SaveInformationDialog : JPG -> spinner.setSelection(JPG.ordinal) ORA -> spinner.setSelection(ORA.ordinal) CATROBAT -> spinner.setSelection(CATROBAT.ordinal) + else -> spinner.setSelection(PNG.ordinal) } } @@ -212,8 +243,10 @@ class SaveInformationDialog : when (parent?.getItemAtPosition(position).toString().toLowerCase(Locale.getDefault())) { JPG.value -> setFileDetails(Bitmap.CompressFormat.JPEG, JPG) PNG.value -> setFileDetails(Bitmap.CompressFormat.PNG, PNG) + ORA.value -> setFileDetails(Bitmap.CompressFormat.PNG, ORA) CATROBAT.value -> setFileDetails(Bitmap.CompressFormat.PNG, CATROBAT) + } } @@ -226,3 +259,6 @@ class SaveInformationDialog : override fun onStartTrackingTouch(seekBar: SeekBar) = Unit override fun onStopTrackingTouch(seekBar: SeekBar) = Unit } + + + diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/iotasks/SaveImage.kt b/Paintroid/src/main/java/org/catrobat/paintroid/iotasks/SaveImage.kt index 70de33a490..324b04c794 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/iotasks/SaveImage.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/iotasks/SaveImage.kt @@ -60,7 +60,7 @@ class SaveImage( val imageUri = FileIO.saveBitmapToFile(filename, bitmap, callback.contentResolver, context) imageUri } else { - uri?.let { FileIO.saveBitmapToUri(it, bitmap, context) } + uri?.let { FileIO.saveBitmapToUri(it, bitmap, context) } } } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/ArrowDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/ArrowDrawable.kt new file mode 100644 index 0000000000..6f41a8c44a --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/ArrowDrawable.kt @@ -0,0 +1,27 @@ +package org.catrobat.paintroid.tools.drawable + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.RectF + +import android.graphics.Path + + +class ArrowDrawable :ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + + path.run { + reset() + moveTo(shapeRect.left, midHeight) + lineTo(midWidth, shapeRect.top) + lineTo(shapeRect.right, midHeight) + lineTo(midWidth, shapeRect.bottom) + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableFactory.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableFactory.kt index 0658b7e59d..6e222718d4 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableFactory.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableFactory.kt @@ -25,6 +25,18 @@ class DrawableFactory { DrawableShape.OVAL -> OvalDrawable() DrawableShape.HEART -> HeartDrawable() DrawableShape.STAR -> StarDrawable() + DrawableShape.PENTAGON -> PentagonDrawable() + DrawableShape.TRIANGLE -> TriangleDrawable() + DrawableShape.HEXAGON -> HexagonDrawable() + DrawableShape.OCTAGON -> OctagonDrawable() + DrawableShape.ARROW -> ArrowDrawable() + DrawableShape.CROSS -> ArrowDrawable() + DrawableShape.TICK -> ArrowDrawable() + DrawableShape.MOON -> ArrowDrawable() + DrawableShape.LIGHTNING -> ArrowDrawable() + DrawableShape.SPEECH -> ArrowDrawable() + + } } } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableShape.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableShape.kt index cc76fae877..6a1f202997 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableShape.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableShape.kt @@ -19,5 +19,5 @@ package org.catrobat.paintroid.tools.drawable enum class DrawableShape { - RECTANGLE, OVAL, HEART, STAR + RECTANGLE, OVAL, HEART, STAR , PENTAGON, TRIANGLE, HEXAGON , OCTAGON,ARROW,CROSS,TICK,MOON,LIGHTNING,SPEECH } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/HexagonDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/HexagonDrawable.kt new file mode 100644 index 0000000000..f48574fb96 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/HexagonDrawable.kt @@ -0,0 +1,31 @@ +package org.catrobat.paintroid.tools.drawable +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF + +private const val CONSTANT_1 = 2f +private const val CONSTANT_2 = 1.7f +class HexagonDrawable:ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + val height = shapeRect.height() / CONSTANT_2 + val width = shapeRect.width() / CONSTANT_1 + path.run { + reset() + moveTo(midWidth - width, midHeight) + lineTo(midWidth - width/2, midHeight - height) + lineTo(midWidth + width/2, midHeight - height) + lineTo(midWidth + width, midHeight) + lineTo(midWidth + width/2, midHeight + height) + lineTo(midWidth - width/2, midHeight + height) + lineTo(midWidth - width, midHeight) + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} + diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/LightningDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/LightningDrawable.kt new file mode 100644 index 0000000000..e5eef559e7 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/LightningDrawable.kt @@ -0,0 +1,33 @@ +package org.catrobat.paintroid.tools.drawable +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF + +private const val CONSTANT_1 = 2f +private const val CONSTANT_2 = 1.7f +class LightningDrawable:ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + val height = shapeRect.height() / CONSTANT_2 + val width = shapeRect.width() / CONSTANT_1 + path.run { + reset() + + moveTo(midWidth - width, midHeight - height) + + lineTo(midWidth, midHeight + height) + lineTo(midWidth + width, midHeight - height) + lineTo(midWidth + width / 2, midHeight - height) + lineTo(midWidth + width / 2, midHeight + height) + lineTo(midWidth + width * 2, midHeight - height) + + lineTo(midWidth + width * 2, midHeight + height) + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} \ No newline at end of file diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/MoonDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/MoonDrawable.kt new file mode 100644 index 0000000000..d36b0541eb --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/MoonDrawable.kt @@ -0,0 +1,33 @@ +package org.catrobat.paintroid.tools.drawable + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF + +private const val CONSTANT_1 = 2f +private const val CONSTANT_2 = 1.7f + +class MoonDrawable : ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + val height = shapeRect.height() / CONSTANT_2 + val width = shapeRect.width() / CONSTANT_1 + path.run { + reset() + + val leftArcRect = RectF(midWidth - width, midHeight - height, midWidth + width, midHeight + height) + arcTo(leftArcRect, 90f, 180f) + + + val rightArcRect = RectF(midWidth, midHeight - height, midWidth + width * 2, midHeight + height) + arcTo(rightArcRect, -90f, 180f) + + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/OctagonDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/OctagonDrawable.kt new file mode 100644 index 0000000000..189a105754 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/OctagonDrawable.kt @@ -0,0 +1,38 @@ +package org.catrobat.paintroid.tools.drawable + +import android.graphics.Canvas +import android.graphics.RectF +import io.reactivex.plugins.RxJavaPlugins.reset + + +import android.graphics.Paint +import android.graphics.Path + +private const val CONSTANT_1 = 2f +private const val CONSTANT_2 = 1.7f + +class OctagonDrawable : ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + val width = shapeRect.width() / CONSTANT_1 + + path.run { + reset() + moveTo(midWidth - width, shapeRect.top) + lineTo(midWidth + width, shapeRect.top) + lineTo(shapeRect.right, midHeight - width) + lineTo(shapeRect.right, midHeight + width) + lineTo(midWidth + width, shapeRect.bottom) + lineTo(midWidth - width, shapeRect.bottom) + lineTo(shapeRect.left, midHeight + width) + lineTo(shapeRect.left, midHeight - width) + lineTo(midWidth - width, shapeRect.top) + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} + diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/PentagonDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/PentagonDrawable.kt new file mode 100644 index 0000000000..3da3ce9fcb --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/PentagonDrawable.kt @@ -0,0 +1,33 @@ +package org.catrobat.paintroid.tools.drawable + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF + +private const val CONSTANT_1 = 0.95f +private const val CONSTANT_2 = 0.31f +private const val CONSTANT_3 = 0.59f +class PentagonDrawable : ShapeDrawable{ + + private val path = Path() + + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + val height = shapeRect.height() + val width = shapeRect.width() + path.run { + reset() + moveTo(midWidth, 0f) + lineTo(midWidth + CONSTANT_1 * width / 2, CONSTANT_2 * height) + lineTo(midWidth + CONSTANT_3 * width / 2, height) + lineTo(midWidth - CONSTANT_3 * width / 2, height) + lineTo(midWidth - CONSTANT_1 * width / 2, CONSTANT_2 * height) + lineTo(midWidth, 0f) + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} \ No newline at end of file diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/SpeechDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/SpeechDrawable.kt new file mode 100644 index 0000000000..6e1ae953a4 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/SpeechDrawable.kt @@ -0,0 +1,39 @@ +package org.catrobat.paintroid.tools.drawable + + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF + +private const val CONSTANT_1 = 2f +private const val CONSTANT_2 = 1.7f +class SpeechDrawable : ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val cornerRadius = shapeRect.height() / CONSTANT_1 + val bubbleHeight = shapeRect.height() / CONSTANT_2 + val bubbleWidth = shapeRect.width() * CONSTANT_1 / CONSTANT_2 + val bubbleTailWidth = shapeRect.width() / CONSTANT_1 + + path.run { + reset() + // Draw bubble body + moveTo(shapeRect.left + cornerRadius, shapeRect.top) + lineTo(shapeRect.right - cornerRadius, shapeRect.top) + arcTo(RectF(shapeRect.right - 2 * cornerRadius, shapeRect.top, shapeRect.right, shapeRect.top + 2 * cornerRadius), 270f, 90f) + lineTo(shapeRect.right, shapeRect.bottom - cornerRadius) + arcTo(RectF(shapeRect.right - 2 * cornerRadius, shapeRect.bottom - 2 * cornerRadius, shapeRect.right, shapeRect.bottom), 0f, 90f) + lineTo(shapeRect.left + bubbleWidth / 2 + bubbleTailWidth, shapeRect.bottom) + lineTo(shapeRect.left + bubbleWidth / 2, shapeRect.bottom + bubbleHeight) + lineTo(shapeRect.left + bubbleWidth / 2 - bubbleTailWidth, shapeRect.bottom) + lineTo(shapeRect.left + cornerRadius, shapeRect.bottom) + arcTo(RectF(shapeRect.left, shapeRect.bottom - 2 * cornerRadius, shapeRect.left + 2 * cornerRadius, shapeRect.bottom), 90f, 90f) + lineTo(shapeRect.left, shapeRect.top + cornerRadius) + arcTo(RectF(shapeRect.left, shapeRect.top, shapeRect.left + 2 * cornerRadius, shapeRect.top + 2 * cornerRadius), 180f, 90f) + close() + } + canvas.drawPath(path, drawPaint) + } +} + diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/TickDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/TickDrawable.kt new file mode 100644 index 0000000000..3ad87107e9 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/TickDrawable.kt @@ -0,0 +1,27 @@ +package org.catrobat.paintroid.tools.drawable +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF + +private const val CONSTANT_1 = 2f +private const val CONSTANT_2 = 1.7f + +class TickDrawable : ShapeDrawable { + private val path = Path() + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + val midWidth = shapeRect.width() / 2 + val midHeight = shapeRect.height() / 2 + val height = shapeRect.height() / CONSTANT_2 + val width = shapeRect.width() / CONSTANT_1 + path.run { + reset() + moveTo(midWidth - width, midHeight + height) + lineTo(midWidth - width / 2, midHeight + height / 2) + lineTo(midWidth + width, midHeight - height) + close() + offset(shapeRect.left, shapeRect.top) + } + canvas.drawPath(path, drawPaint) + } +} diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/TriangleDrawable.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/TriangleDrawable.kt new file mode 100644 index 0000000000..b5346bb1ea --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/TriangleDrawable.kt @@ -0,0 +1,22 @@ +package org.catrobat.paintroid.tools.drawable + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.RectF +class TriangleDrawable :ShapeDrawable{ + private val path = Path() + + override fun draw(canvas: Canvas, shapeRect: RectF, drawPaint: Paint) { + path.run { + reset() + moveTo(shapeRect.left, shapeRect.bottom) + lineTo(shapeRect.right, shapeRect.bottom) + lineTo(shapeRect.centerX(), shapeRect.top) + lineTo(shapeRect.left, shapeRect.bottom) + close() + } + canvas.drawPath(path, drawPaint) + } + +} \ No newline at end of file diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/DrawingSurface.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/DrawingSurface.kt index 3a0eaecf3a..ae8512a08d 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/ui/DrawingSurface.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/DrawingSurface.kt @@ -244,6 +244,10 @@ open class DrawingSurface : SurfaceView, SurfaceHolder.Callback { drawingThread?.stop() } + fun copyBitmap() { + + } + private inner class DrawLoop : Runnable { val holder: SurfaceHolder = getHolder() override fun run() { diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultShapeToolOptionsView.kt b/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultShapeToolOptionsView.kt index 44f78af782..eecb5fb510 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultShapeToolOptionsView.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/ui/tools/DefaultShapeToolOptionsView.kt @@ -57,6 +57,19 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { private val outlineWidthEditText: AppCompatEditText private val shapeToolDialogTitle: AppCompatTextView private val shapeToolFillOutline: AppCompatTextView + private val triangleButton: AppCompatImageButton + private val pentagonButton: AppCompatImageButton + private val hexagonButton: AppCompatImageButton + private val octagonButton: AppCompatImageButton + private val arrowButton: AppCompatImageButton + private val crossButton: AppCompatImageButton + private val tickButton: AppCompatImageButton + private val moonButton: AppCompatImageButton + private val lightningButton: AppCompatImageButton + private val speechButton: AppCompatImageButton + + + init { val inflater = LayoutInflater.from(rootView.context) @@ -74,6 +87,16 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { outlineTextView = findViewById(R.id.pocketpaint_outline_view_text_view) outlineWidthSeekBar = findViewById(R.id.pocketpaint_shape_stroke_width_seek_bar) outlineWidthEditText = findViewById(R.id.pocketpaint_shape_outline_edit) + triangleButton = findViewById(R.id.pocketpaint_shapes_triangle_btn) + pentagonButton = findViewById(R.id.pocketpaint_shapes_pentagon_btn) + hexagonButton = findViewById(R.id.pocketpaint_shapes_hexagon_btn) + octagonButton = findViewById(R.id.pocketpaint_shapes_octagon_btn) + arrowButton = findViewById(R.id.pocketpaint_shapes_arrow_btn) + crossButton = findViewById(R.id.pocketpaint_shapes_cross_btn) + tickButton = findViewById(R.id.pocketpaint_shapes_tick_btn) + moonButton = findViewById(R.id.pocketpaint_shapes_moon_btn) + lightningButton = findViewById(R.id.pocketpaint_shapes_lightning_btn) + speechButton = findViewById(R.id.pocketpaint_shapes_speech_btn) } outlineWidthEditText.filters = arrayOf(DefaultNumberRangeFilter(MIN_VAL, MAX_VAL)) @@ -89,6 +112,18 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { circleButton.setOnClickListener { onShapeClicked(DrawableShape.OVAL) } heartButton.setOnClickListener { onShapeClicked(DrawableShape.HEART) } starButton.setOnClickListener { onShapeClicked(DrawableShape.STAR) } + triangleButton.setOnClickListener { onShapeClicked(DrawableShape.TRIANGLE) } + pentagonButton.setOnClickListener { onShapeClicked(DrawableShape.PENTAGON) } + hexagonButton.setOnClickListener { onShapeClicked(DrawableShape.HEXAGON) } + octagonButton.setOnClickListener { onShapeClicked(DrawableShape.OCTAGON) } + arrowButton.setOnClickListener { onShapeClicked(DrawableShape.ARROW) } + crossButton.setOnClickListener { onShapeClicked(DrawableShape.CROSS) } + tickButton.setOnClickListener { onShapeClicked(DrawableShape.TICK) } + moonButton.setOnClickListener { onShapeClicked(DrawableShape.MOON) } + lightningButton.setOnClickListener { onShapeClicked(DrawableShape.LIGHTNING) } + speechButton.setOnClickListener { onShapeClicked(DrawableShape.SPEECH) } + + fillButton.setOnClickListener { onDrawTypeClicked(DrawableStyle.FILL) } outlineButton.setOnClickListener { onDrawTypeClicked(DrawableStyle.STROKE) } outlineWidthSeekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { @@ -141,7 +176,23 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { } private fun resetShapeActivated() { - val buttons = arrayOf(squareButton, circleButton, heartButton, starButton) + //val buttons = arrayOf(squareButton, circleButton, heartButton, starButton,) + val buttons = arrayOf( + squareButton, + circleButton, + heartButton, + starButton, + triangleButton, + pentagonButton, + hexagonButton, + octagonButton, + arrowButton, + crossButton, + tickButton, + moonButton, + lightningButton, + speechButton + ) for (button in buttons) { button.isSelected = false } @@ -175,6 +226,46 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { starButton.isSelected = true setShapeToolDialogTitle(R.string.shape_tool_dialog_star_title) } + DrawableShape.TRIANGLE -> { + triangleButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_triangle_title) + } + DrawableShape.PENTAGON -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_pentagon_title) + } + DrawableShape.HEXAGON -> { + hexagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_hexagon_title) + } + DrawableShape.OCTAGON -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_octagon_title) + } + DrawableShape.ARROW -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_arrow_title) + } + DrawableShape.CROSS -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_cross_title) + } + DrawableShape.TICK -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_tick_title) + } + DrawableShape.MOON -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_moon_title) + } + DrawableShape.LIGHTNING -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_lightning_title) + } + DrawableShape.SPEECH -> { + pentagonButton.isSelected = true + setShapeToolDialogTitle(R.string.shape_tool_dialog_speech_title) + } } } @@ -184,6 +275,18 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { circleButtonResource: Int, heartButtonResource: Int, starButtonResource: Int, + triangleButtonResource: Int, + pentagonButtonResource: Int, + hexagonButtonResource: Int, + octagonButtonResource: Int, + arrowButtonResource: Int, + crossButtonResource: Int, + tickButtonResource: Int, + moonButtonResource: Int, + lightningButtonResource: Int, + speechButtonResource: Int, + + visibility: Int ) { shapeToolFillOutline.setText(fillTitle) @@ -191,6 +294,17 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { circleButton.setImageResource(circleButtonResource) heartButton.setImageResource(heartButtonResource) starButton.setImageResource(starButtonResource) + triangleButton.setImageResource(triangleButtonResource) + pentagonButton.setImageResource(pentagonButtonResource) + hexagonButton.setImageResource(hexagonButtonResource) + octagonButton.setImageResource(octagonButtonResource) + arrowButton.setImageResource(arrowButtonResource) + crossButton.setImageResource(crossButtonResource) + tickButton.setImageResource(tickButtonResource) + moonButton.setImageResource(moonButtonResource) + lightningButton.setImageResource(lightningButtonResource) + speechButton.setImageResource(speechButtonResource) + outlineWidthSeekBar.visibility = visibility outlineWidthEditText.visibility = visibility outlineView.visibility = visibility @@ -208,6 +322,17 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { R.drawable.ic_pocketpaint_circle, R.drawable.ic_pocketpaint_heart, R.drawable.ic_pocketpaint_star, + R.drawable.ic_pocketpaint_triangle, + R.drawable.ic_pocketpaint_pentagon, + R.drawable.ic_pocketpaint_hexagon, + R.drawable.ic_pocketpaint_octagon, + R.drawable.ic_pocketpaint_arrow, + R.drawable.ic_pocketpaint_cross, + R.drawable.ic_pocketpaint_tick, + R.drawable.ic_pocketpaint_moon, + R.drawable.ic_pocketpaint_lightning, + R.drawable.ic_pocketpaint_speech, + View.GONE ) } @@ -219,6 +344,17 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { R.drawable.ic_pocketpaint_circle_out, R.drawable.ic_pocketpaint_heart_out, R.drawable.ic_pocketpaint_star_out, + R.drawable.ic_pocketpaint_triangle_out, + R.drawable.ic_pocketpaint_pentagon_out, + R.drawable.ic_pocketpaint_hexagon_out, + R.drawable.ic_pocketpaint_octagon_out, + R.drawable.ic_pocketpaint_arrow_out, + R.drawable.ic_pocketpaint_cross_out, + R.drawable.ic_pocketpaint_tick_out, + R.drawable.ic_pocketpaint_moon_out, + R.drawable.ic_pocketpaint_lightning_out, + R.drawable.ic_pocketpaint_speech_out, + View.VISIBLE ) } diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_arrow.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_arrow.xml new file mode 100644 index 0000000000..904b190da9 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_arrow.xml @@ -0,0 +1,11 @@ + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_arrow_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_arrow_out.xml new file mode 100644 index 0000000000..4cc9a483d9 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_arrow_out.xml @@ -0,0 +1,19 @@ + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_cross.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_cross.xml new file mode 100644 index 0000000000..fe41d9971f --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_cross.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_cross_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_cross_out.xml new file mode 100644 index 0000000000..fff09d9a1f --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_cross_out.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon.xml new file mode 100644 index 0000000000..1d44f876f2 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon_out.xml new file mode 100644 index 0000000000..8751339730 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon_out.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_lightning.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_lightning.xml new file mode 100644 index 0000000000..dd1a2ff662 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_lightning.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_lightning_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_lightning_out.xml new file mode 100644 index 0000000000..dc3f9236ef --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_lightning_out.xml @@ -0,0 +1,12 @@ + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_moon.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_moon.xml new file mode 100644 index 0000000000..407d6b4bea --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_moon.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_moon_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_moon_out.xml new file mode 100644 index 0000000000..1b99437bb9 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_moon_out.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_octagon.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_octagon.xml new file mode 100644 index 0000000000..34de5f7291 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_octagon.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_octagon_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_octagon_out.xml new file mode 100644 index 0000000000..9e05c2eaef --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_octagon_out.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon.xml new file mode 100644 index 0000000000..cad4566cb4 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon_out.xml new file mode 100644 index 0000000000..3ce29057b6 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon_out.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_speech.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_speech.xml new file mode 100644 index 0000000000..0218ef53db --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_speech.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_speech_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_speech_out.xml new file mode 100644 index 0000000000..8e98eb5469 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_speech_out.xml @@ -0,0 +1,11 @@ + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_tick.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_tick.xml new file mode 100644 index 0000000000..a1b4a4cfe8 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_tick.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_tick_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_tick_out.xml new file mode 100644 index 0000000000..6b69f6310b --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_tick_out.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_triangle.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_triangle.xml new file mode 100644 index 0000000000..425c02b54e --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_triangle.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Paintroid/src/main/res/drawable/ic_pocketpaint_triangle_out.xml b/Paintroid/src/main/res/drawable/ic_pocketpaint_triangle_out.xml new file mode 100644 index 0000000000..2b197abfc2 --- /dev/null +++ b/Paintroid/src/main/res/drawable/ic_pocketpaint_triangle_out.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml index 3cb7da04bf..f4d85ca548 100644 --- a/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml @@ -98,4 +98,21 @@ android:clipChildren="false" android:clipToPadding="false" /> + + + + + + + + diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_save_gif_sub_dialog.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_save_gif_sub_dialog.xml new file mode 100644 index 0000000000..1c85a6521f --- /dev/null +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_save_gif_sub_dialog.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml index 53849476ed..8e7ee5e88a 100644 --- a/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml @@ -139,6 +139,99 @@ android:layout_weight="1" android:contentDescription="@string/shape_tool_dialog_star_title" android:src="@drawable/ic_pocketpaint_star" /> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paintroid/src/main/res/values/string.xml b/Paintroid/src/main/res/values/string.xml index de2ea72fb6..2a15e91bc8 100644 --- a/Paintroid/src/main/res/values/string.xml +++ b/Paintroid/src/main/res/values/string.xml @@ -128,6 +128,16 @@ Ellipse Star Heart + Cross + Octagon + Arrow + Triangle + Pentagon + Hexagon + Tick + Moon + Lightning + Speech Fill Outline diff --git a/Paintroid/src/main/res/values/strings.xml b/Paintroid/src/main/res/values/strings.xml new file mode 100644 index 0000000000..9d4b18e6b9 --- /dev/null +++ b/Paintroid/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 2c7e76738b..b5ab9e4716 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,4 +102,5 @@ dependencies { implementation project(':Paintroid') implementation 'com.android.support:support-core-utils:28.0.0' + implementation 'com.example:library:1.0.0' }