diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt index 864f069b0c..584b3499e7 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/FileIO.kt @@ -106,6 +106,7 @@ object FileIO { ORA("ora"), CATROBAT("catrobat-image"); + fun toExtension(): String = ".$value" } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt b/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt index b93795d6d6..992c4bc8f6 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/PaintroidApplication.kt @@ -18,6 +18,8 @@ */ package org.catrobat.paintroid + + import java.io.File import java.lang.IllegalArgumentException @@ -28,7 +30,14 @@ class PaintroidApplication private constructor() { var cacheDir: File? = null } - init { - throw IllegalArgumentException() + init { + throw IllegalArgumentException() + } } -} + + + + + + + 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..cec5631c1b 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?) + } 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..fd8e0267fc 100644 --- a/Paintroid/src/main/java/org/catrobat/paintroid/dialog/SaveInformationDialog.kt +++ b/Paintroid/src/main/java/org/catrobat/paintroid/dialog/SaveInformationDialog.kt @@ -41,14 +41,28 @@ 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.R + 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 +132,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 +142,12 @@ class SaveInformationDialog : .create() } + + private fun initViews(customLayout: View) { initSpecificFormatLayout(customLayout) + + initJpgView() initSeekBar() initPercentage() @@ -141,6 +160,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 +191,14 @@ class SaveInformationDialog : JPG -> presenter.showJpgInformationDialog() ORA -> presenter.showOraInformationDialog() CATROBAT -> presenter.showCatrobatInformationDialog() + 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 +230,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 +239,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 +255,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/tools/drawable/DrawableFactory.kt b/Paintroid/src/main/java/org/catrobat/paintroid/tools/drawable/DrawableFactory.kt index 0658b7e59d..cc0828d78d 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,7 @@ class DrawableFactory { DrawableShape.OVAL -> OvalDrawable() DrawableShape.HEART -> HeartDrawable() DrawableShape.STAR -> StarDrawable() + } } } 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..6418360328 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,7 @@ open class DrawingSurface : SurfaceView, SurfaceHolder.Callback { drawingThread?.stop() } + 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..bd1f42abcf 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 @@ -58,6 +58,7 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { private val shapeToolDialogTitle: AppCompatTextView private val shapeToolFillOutline: AppCompatTextView + init { val inflater = LayoutInflater.from(rootView.context) val shapeToolView = inflater.inflate(R.layout.dialog_pocketpaint_shapes, rootView) @@ -74,6 +75,7 @@ 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) + } outlineWidthEditText.filters = arrayOf(DefaultNumberRangeFilter(MIN_VAL, MAX_VAL)) @@ -89,6 +91,8 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { circleButton.setOnClickListener { onShapeClicked(DrawableShape.OVAL) } heartButton.setOnClickListener { onShapeClicked(DrawableShape.HEART) } starButton.setOnClickListener { onShapeClicked(DrawableShape.STAR) } + + fillButton.setOnClickListener { onDrawTypeClicked(DrawableStyle.FILL) } outlineButton.setOnClickListener { onDrawTypeClicked(DrawableStyle.STROKE) } outlineWidthSeekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { @@ -141,7 +145,9 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { } private fun resetShapeActivated() { - val buttons = arrayOf(squareButton, circleButton, heartButton, starButton) + val buttons = arrayOf(squareButton, circleButton, heartButton, starButton,) + + for (button in buttons) { button.isSelected = false } @@ -175,6 +181,7 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { starButton.isSelected = true setShapeToolDialogTitle(R.string.shape_tool_dialog_star_title) } + } } @@ -184,6 +191,8 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { circleButtonResource: Int, heartButtonResource: Int, starButtonResource: Int, + + visibility: Int ) { shapeToolFillOutline.setText(fillTitle) @@ -191,6 +200,8 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { circleButton.setImageResource(circleButtonResource) heartButton.setImageResource(heartButtonResource) starButton.setImageResource(starButtonResource) + + outlineWidthSeekBar.visibility = visibility outlineWidthEditText.visibility = visibility outlineView.visibility = visibility @@ -208,6 +219,7 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { R.drawable.ic_pocketpaint_circle, R.drawable.ic_pocketpaint_heart, R.drawable.ic_pocketpaint_star, + View.GONE ) } @@ -219,6 +231,7 @@ class DefaultShapeToolOptionsView(rootView: ViewGroup) : ShapeToolOptionsView { R.drawable.ic_pocketpaint_circle_out, R.drawable.ic_pocketpaint_heart_out, R.drawable.ic_pocketpaint_star_out, + View.VISIBLE ) } diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/web/MediaGalleryWebViewClient.java b/Paintroid/src/main/java/org/catrobat/paintroid/web/MediaGalleryWebViewClient.java deleted file mode 100644 index 4690e2aa6e..0000000000 --- a/Paintroid/src/main/java/org/catrobat/paintroid/web/MediaGalleryWebViewClient.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Catroid: An on-device visual programming system for Android devices - * Copyright (C) 2010-2018 The Catrobat Team - * () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * An additional term exception under section 7 of the GNU Affero - * General Public License, version 3, is available at - * http://developer.catrobat.org/license_additional_term - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package org.catrobat.paintroid.web; - -import android.app.ProgressDialog; -import android.graphics.Bitmap; -import android.webkit.WebView; -import android.webkit.WebViewClient; - -import org.catrobat.paintroid.R; - -public class MediaGalleryWebViewClient extends WebViewClient { - private ProgressDialog webViewLoadingDialog; - private WebClientCallback callback; - - public interface WebClientCallback { - void finish(); - } - - public MediaGalleryWebViewClient(WebClientCallback callback) { - super(); - this.callback = callback; - } - - @Override - public void onPageStarted(WebView view, String urlClient, Bitmap favicon) { - if (webViewLoadingDialog == null && !urlClient.matches("https://share.catrob.at/pocketcode/")) { - webViewLoadingDialog = new ProgressDialog(view.getContext(), R.style.WebViewLoadingCircle); - webViewLoadingDialog.setCancelable(true); - webViewLoadingDialog.setCanceledOnTouchOutside(false); - webViewLoadingDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small); - webViewLoadingDialog.show(); - } else { - callback.finish(); - } - } - - @Override - public void onPageFinished(WebView view, String url) { - if (webViewLoadingDialog != null) { - webViewLoadingDialog.dismiss(); - webViewLoadingDialog = null; - } - } - - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - return false; - } - - @Override - public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - callback.finish(); - } -} diff --git a/Paintroid/src/main/java/org/catrobat/paintroid/web/MediaGalleryWebViewClient.kt b/Paintroid/src/main/java/org/catrobat/paintroid/web/MediaGalleryWebViewClient.kt new file mode 100644 index 0000000000..7faa7c66a8 --- /dev/null +++ b/Paintroid/src/main/java/org/catrobat/paintroid/web/MediaGalleryWebViewClient.kt @@ -0,0 +1,69 @@ +/* + * Catroid: An on-device visual programming system for Android devices + * Copyright (C) 2010-2018 The Catrobat Team + * () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * An additional term exception under section 7 of the GNU Affero + * General Public License, version 3, is available at + * http://developer.catrobat.org/license_additional_term + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.catrobat.paintroid.web + +import android.app.ProgressDialog +import android.graphics.Bitmap +import android.webkit.WebView +import android.webkit.WebViewClient +import org.catrobat.paintroid.R + +class MediaGalleryWebViewClient(private val callback: WebClientCallback) : WebViewClient() { + private var webViewLoadingDialog: ProgressDialog? = null + + interface WebClientCallback { + fun finish() + } + + override fun onPageStarted(view: WebView, urlClient: String, favicon: Bitmap) { + if (webViewLoadingDialog == null && !urlClient.matches("https://share.catrob.at/pocketcode/".toRegex())) { + webViewLoadingDialog = ProgressDialog(view.context, R.style.WebViewLoadingCircle) + webViewLoadingDialog!!.setCancelable(true) + webViewLoadingDialog!!.setCanceledOnTouchOutside(false) + webViewLoadingDialog!!.setProgressStyle(android.R.style.Widget_ProgressBar_Small) + webViewLoadingDialog!!.show() + } else { + callback.finish() + } + } + + override fun onPageFinished(view: WebView, url: String) { + if (webViewLoadingDialog != null) { + webViewLoadingDialog!!.dismiss() + webViewLoadingDialog = null + } + } + + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + return false + } + + override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String, + failingUrl: String + ) { + callback.finish() + } +} diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml index 3cb7da04bf..ca96ec27d0 100644 --- a/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_save.xml @@ -98,4 +98,8 @@ android:clipChildren="false" android:clipToPadding="false" /> + + + + diff --git a/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml b/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml index 53849476ed..3028d3df22 100644 --- a/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml +++ b/Paintroid/src/main/res/layout/dialog_pocketpaint_shapes.xml @@ -139,6 +139,8 @@ 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..7b92a43dc3 100644 --- a/Paintroid/src/main/res/values/string.xml +++ b/Paintroid/src/main/res/values/string.xml @@ -128,6 +128,7 @@ Ellipse Star Heart + Fill Outline diff --git a/app/build.gradle b/app/build.gradle index 2c7e76738b..dd08cd86b9 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' + }