Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PAINTROID-708- Added GIF format to image saving options #1333

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt
Original file line number Diff line number Diff line change
@@ -104,7 +104,8 @@ object FileIO {
PNG("png"),
JPG("jpg"),
ORA("ora"),
CATROBAT("catrobat-image");
CATROBAT("catrobat-image"),


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
Original file line number Diff line number Diff line change
@@ -18,17 +18,26 @@
*/
package org.catrobat.paintroid


import android.graphics.Bitmap
import java.io.File
import java.lang.IllegalArgumentException


@SuppressWarnings("ThrowingExceptionsWithoutMessageOrCause")
class PaintroidApplication private constructor() {
companion object {
@JvmStatic
var cacheDir: File? = null
}

init {
throw IllegalArgumentException()
init {
throw IllegalArgumentException()
}
}
}






Original file line number Diff line number Diff line change
@@ -308,6 +308,7 @@ interface MainActivityContracts {
fun checkForTemporaryFile(): Boolean

fun setColorHistoryAfterLoadImage(colorHistory: ColorHistory?)

}

interface Model {
Original file line number Diff line number Diff line change
@@ -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
@@ -41,14 +42,30 @@ 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,
@@ -118,6 +135,7 @@ class SaveInformationDialog :
FileIO.storeImageUri = null
if (FileIO.checkFileExists(FileIO.fileType, FileIO.defaultFileName, requireContext().contentResolver)) {
presenter.showOverwriteDialog(permission, isExport)

} else {
presenter.switchBetweenVersions(permission, isExport)
}
@@ -127,8 +145,12 @@ class SaveInformationDialog :
.create()
}



private fun initViews(customLayout: View) {
initSpecificFormatLayout(customLayout)


initJpgView()
initSeekBar()
initPercentage()
@@ -141,6 +163,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,11 +194,14 @@ 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 }
@@ -204,6 +233,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 +242,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 +258,6 @@ class SaveInformationDialog :
override fun onStartTrackingTouch(seekBar: SeekBar) = Unit
override fun onStopTrackingTouch(seekBar: SeekBar) = Unit
}



Original file line number Diff line number Diff line change
@@ -25,6 +25,9 @@ class DrawableFactory {
DrawableShape.OVAL -> OvalDrawable()
DrawableShape.HEART -> HeartDrawable()
DrawableShape.STAR -> StarDrawable()
DrawableShape.PENTAGON -> PentagonDrawable()
DrawableShape.TRIANGLE -> TriangleDrawable()
DrawableShape.HEXAGON -> HexagonDrawable()
}
}
}
Original file line number Diff line number Diff line change
@@ -19,5 +19,5 @@
package org.catrobat.paintroid.tools.drawable

enum class DrawableShape {
RECTANGLE, OVAL, HEART, STAR
RECTANGLE, OVAL, HEART, STAR , PENTAGON, TRIANGLE, HEXAGON
}
Original file line number Diff line number Diff line change
@@ -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)
}
}

Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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)
}

}
Original file line number Diff line number Diff line change
@@ -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() {
Original file line number Diff line number Diff line change
@@ -57,6 +57,9 @@ 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

init {
val inflater = LayoutInflater.from(rootView.context)
@@ -74,6 +77,9 @@ 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)
}
outlineWidthEditText.filters =
arrayOf<InputFilter>(DefaultNumberRangeFilter(MIN_VAL, MAX_VAL))
@@ -89,6 +95,10 @@ 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) }

fillButton.setOnClickListener { onDrawTypeClicked(DrawableStyle.FILL) }
outlineButton.setOnClickListener { onDrawTypeClicked(DrawableStyle.STROKE) }
outlineWidthSeekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
@@ -141,7 +151,16 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView {
}

private fun resetShapeActivated() {
val buttons = arrayOf<View>(squareButton, circleButton, heartButton, starButton)
//val buttons = arrayOf<View>(squareButton, circleButton, heartButton, starButton,)
val buttons = arrayOf<View>(
squareButton,
circleButton,
heartButton,
starButton,
triangleButton,
pentagonButton,
hexagonButton
)
for (button in buttons) {
button.isSelected = false
}
@@ -175,6 +194,18 @@ 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)
}
}
}

@@ -184,13 +215,21 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView {
circleButtonResource: Int,
heartButtonResource: Int,
starButtonResource: Int,
triangleButtonResource: Int,
pentagonButtonResource: Int,
hexagonButtonResource: Int,

visibility: Int
) {
shapeToolFillOutline.setText(fillTitle)
squareButton.setImageResource(squareButtonResource)
circleButton.setImageResource(circleButtonResource)
heartButton.setImageResource(heartButtonResource)
starButton.setImageResource(starButtonResource)
triangleButton.setImageResource(triangleButtonResource)
pentagonButton.setImageResource(pentagonButtonResource)
hexagonButton.setImageResource(hexagonButtonResource)

outlineWidthSeekBar.visibility = visibility
outlineWidthEditText.visibility = visibility
outlineView.visibility = visibility
@@ -208,6 +247,9 @@ 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,
View.GONE
)
}
@@ -219,6 +261,9 @@ 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,
View.VISIBLE
)
}
10 changes: 10 additions & 0 deletions Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="2048"
android:viewportHeight="2048">
<path
android:pathData="M264.8,1008.7l183.2,-317.3l0.1,0l183.2,-317.2l8.9,-15.4l17.5,0l366.4,0l366.4,0l17.5,0l8.9,15.4l183.2,317.2l0,-0l183.2,317.3l8.8,15.3l-8.8,15.3l-183.2,317.3l-0,-0l-183.2,317.2l-8.9,15.4l-17.5,0l-366.4,0l-366.4,0l-17.5,0l-8.9,-15.4l-183.2,-317.2l-0.1,0l-183.2,-317.3l-8.8,-15.3z"
android:fillColor="#000"/>
</vector>
11 changes: 11 additions & 0 deletions Paintroid/src/main/res/drawable/ic_pocketpaint_hexagon_out.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="485.69"
android:viewportHeight="485.69">
<path
android:pathData="M364.27,453.15H121.42L0,242.84L121.42,32.53h242.85l121.42,210.31L364.27,453.15zM131.9,435h221.88l110.94,-192.15L353.78,50.69H131.9L20.97,242.84L131.9,435z"
android:fillColor="#000"
android:strokeWidth="70"/>
</vector>
10 changes: 10 additions & 0 deletions Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="2048"
android:viewportHeight="2048">
<path
android:pathData="M1041.9,306.5l366.1,266l366.1,266l17.9,13l-6.8,21.1l-139.8,430.4l-139.8,430.4l-6.8,21.1l-22.1,0l-452.5,0l-452.5,0l-22.1,0l-6.9,-21.1l-139.8,-430.4l-139.8,-430.4l-6.8,-21.1l17.9,-13l366.1,-266l366.1,-266l17.9,-13z"
android:fillColor="#000"/>
</vector>
13 changes: 13 additions & 0 deletions Paintroid/src/main/res/drawable/ic_pocketpaint_pentagon_out.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="1200"
android:viewportHeight="1200">
<path
android:pathData="M600,104l500,379.3L909,1096.9L291,1096.9L100,483.3Z"
android:strokeWidth="70"
android:fillColor="#00000000"
android:fillType="evenOdd"
android:strokeColor="#000"/>
</vector>
10 changes: 10 additions & 0 deletions Paintroid/src/main/res/drawable/ic_pocketpaint_triangle.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M24,22h-24l12,-20z"/>
</vector>
13 changes: 13 additions & 0 deletions Paintroid/src/main/res/drawable/ic_pocketpaint_triangle_out.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="1200"
android:viewportHeight="1200">
<path
android:pathData="M600,100l500,997H100Z"
android:strokeWidth="70"
android:fillColor="#00000000"
android:fillType="evenOdd"
android:strokeColor="#000"/>
</vector>
17 changes: 17 additions & 0 deletions Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml
Original file line number Diff line number Diff line change
@@ -98,4 +98,21 @@
android:clipChildren="false"
android:clipToPadding="false" />

<SeekBar
android:id="@+id/pocketpaint_gif_delay_seekbar_save_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="50" />

<!-- TextView to display delay -->
<TextView
android:id="@+id/pocketpaint_gif_delay_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delay: 500 ms" />
<!-- strings.xml -->



</LinearLayout>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- dialog_pocketpaint_save_gif_sub_dialog.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<!-- SeekBar for adjusting delay -->
<SeekBar
android:id="@+id/pocketpaint_gif_delay_seekbar_save_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="50" />

<!-- TextView to display delay -->
<TextView
android:id="@+id/pocketpaint_gif_delay_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delay: 500 ms" />

</LinearLayout>
27 changes: 27 additions & 0 deletions Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml
Original file line number Diff line number Diff line change
@@ -139,6 +139,33 @@
android:layout_weight="1"
android:contentDescription="@string/shape_tool_dialog_star_title"
android:src="@drawable/ic_pocketpaint_star" />
<ImageButton
android:id="@+id/pocketpaint_shapes_triangle_btn"
style="@style/PocketPaintSelectableButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:contentDescription="@string/shape_tool_dialog_triangle_title"
android:src="@drawable/ic_pocketpaint_triangle" />

<ImageButton
android:id="@+id/pocketpaint_shapes_pentagon_btn"
style="@style/PocketPaintSelectableButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:contentDescription="@string/shape_tool_dialog_pentagon_title"
android:src="@drawable/ic_pocketpaint_pentagon" />

<ImageButton
android:id="@+id/pocketpaint_shapes_hexagon_btn"
style="@style/PocketPaintSelectableButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:contentDescription="@string/shape_tool_dialog_star_title"
android:src="@drawable/ic_pocketpaint_hexagon" />

</LinearLayout>
</LinearLayout>
</ScrollView>
3 changes: 3 additions & 0 deletions Paintroid/src/main/res/values/string.xml
Original file line number Diff line number Diff line change
@@ -128,6 +128,9 @@
<string name="shape_tool_dialog_ellipse_title">Ellipse</string>
<string name="shape_tool_dialog_star_title">Star</string>
<string name="shape_tool_dialog_heart_title">Heart</string>
<string name="shape_tool_dialog_triangle_title" translatable="false">Triangle</string>
<string name="shape_tool_dialog_pentagon_title" translatable="false">Pentagon</string>
<string name="shape_tool_dialog_hexagon_title" translatable="false">Hexagon</string>
<string name="shape_tool_dialog_fill_title">Fill</string>
<string name="shape_tool_dialog_outline_title">Outline</string>

8 changes: 8 additions & 0 deletions Paintroid/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- <string name="gif_delay_text" />-->
<!-- <string name="shape_tool_dialog_triangle_title">Triangle\n</string>-->
<!-- <string name="Pentagon">shape_tool_dialog_pentagon_title</string>-->
<!-- <string name="shape_tool_dialog_pentagon_title">Pentagon</string>-->
<!-- <string name="shape_tool_dialog_hexagon_title">Hexagon</string>-->
</resources>
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -102,4 +102,5 @@ dependencies {
implementation project(':Paintroid')

implementation 'com.android.support:support-core-utils:28.0.0'

}