Merge pull request #288 from fatihergin/feature/viewbinding-and-sdk-34-migration

Feature/viewbinding and sdk 34 migration
This commit is contained in:
Tibor Kaputa 2023-08-21 20:55:32 +02:00 committed by GitHub
commit d09b75d4b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 205 additions and 152 deletions

View File

@ -1,6 +1,5 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
@ -9,12 +8,13 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 33
namespace "com.simplemobiletools.draw.pro"
compileSdk 34
defaultConfig {
applicationId "com.simplemobiletools.draw.pro"
minSdkVersion 23
targetSdkVersion 33
minSdk 23
targetSdk 34
versionCode 79
versionName "6.9.3"
setProperty("archivesBaseName", "draw")
@ -32,6 +32,11 @@ android {
}
}
buildFeatures {
buildConfig true
viewBinding true
}
buildTypes {
debug {
applicationIdSuffix ".debug"
@ -45,7 +50,16 @@ android {
}
}
flavorDimensions "variants"
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
flavorDimensions = ["variants"]
productFlavors {
core {}
fdroid {}
@ -63,6 +77,6 @@ android {
}
dependencies {
implementation 'com.github.SimpleMobileTools:Simple-Commons:4c83ec8740'
implementation 'com.github.SimpleMobileTools:Simple-Commons:0e173dc5ad'
implementation "androidx.print:print:1.0.0"
}

View File

@ -28,6 +28,7 @@ import com.simplemobiletools.commons.models.FileDirItem
import com.simplemobiletools.commons.models.Release
import com.simplemobiletools.draw.pro.BuildConfig
import com.simplemobiletools.draw.pro.R
import com.simplemobiletools.draw.pro.databinding.ActivityMainBinding
import com.simplemobiletools.draw.pro.dialogs.SaveImageDialog
import com.simplemobiletools.draw.pro.extensions.config
import com.simplemobiletools.draw.pro.helpers.EyeDropper
@ -36,19 +37,22 @@ import com.simplemobiletools.draw.pro.helpers.PNG
import com.simplemobiletools.draw.pro.helpers.SVG
import com.simplemobiletools.draw.pro.interfaces.CanvasListener
import com.simplemobiletools.draw.pro.models.Svg
import kotlinx.android.synthetic.main.activity_main.*
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.OutputStream
class MainActivity : SimpleActivity(), CanvasListener {
private val PICK_IMAGE_INTENT = 1
private val SAVE_IMAGE_INTENT = 2
companion object {
private const val PICK_IMAGE_INTENT = 1
private const val SAVE_IMAGE_INTENT = 2
private val FOLDER_NAME = "images"
private val FILE_NAME = "simple-draw.png"
private val BITMAP_PATH = "bitmap_path"
private val URI_TO_LOAD = "uri_to_load"
private const val FOLDER_NAME = "images"
private const val FILE_NAME = "simple-draw.png"
private const val BITMAP_PATH = "bitmap_path"
private const val URI_TO_LOAD = "uri_to_load"
}
private val binding by lazy(LazyThreadSafetyMode.NONE) { ActivityMainBinding.inflate(layoutInflater) }
private lateinit var eyeDropper: EyeDropper
@ -71,17 +75,17 @@ class MainActivity : SimpleActivity(), CanvasListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
setupOptionsMenu()
refreshMenuItems()
eyeDropper = EyeDropper(my_canvas) { selectedColor ->
eyeDropper = EyeDropper(binding.myCanvas) { selectedColor ->
setColor(selectedColor)
}
my_canvas.mListener = this
stroke_width_bar.onSeekBarChangeListener { progress ->
binding.myCanvas.mListener = this
binding.strokeWidthBar.onSeekBarChangeListener { progress ->
brushSize = Math.max(progress.toFloat(), 5f)
updateBrushSize()
}
@ -93,37 +97,39 @@ class MainActivity : SimpleActivity(), CanvasListener {
brushSize = config.brushSize
updateBrushSize()
stroke_width_bar.progress = brushSize.toInt()
binding.strokeWidthBar.progress = brushSize.toInt()
color_picker.setOnClickListener { pickColor() }
undo.setOnClickListener { my_canvas.undo() }
undo.setOnLongClickListener {
toast(R.string.undo)
true
}
binding.apply {
colorPicker.setOnClickListener { pickColor() }
undo.setOnClickListener { myCanvas.undo() }
undo.setOnLongClickListener {
toast(R.string.undo)
true
}
eraser.setOnClickListener { eraserClicked() }
eraser.setOnLongClickListener {
toast(R.string.eraser)
true
}
eraser.setOnClickListener { eraserClicked() }
eraser.setOnLongClickListener {
toast(R.string.eraser)
true
}
redo.setOnClickListener { my_canvas.redo() }
redo.setOnLongClickListener {
toast(R.string.redo)
true
}
redo.setOnClickListener { myCanvas.redo() }
redo.setOnLongClickListener {
toast(R.string.redo)
true
}
eye_dropper.setOnClickListener { eyeDropperClicked() }
eye_dropper.setOnLongClickListener {
toast(R.string.eyedropper)
true
}
eyeDropper.setOnClickListener { eyeDropperClicked() }
eyeDropper.setOnLongClickListener {
toast(R.string.eyedropper)
true
}
bucket_fill.setOnClickListener { bucketFillClicked() }
bucket_fill.setOnLongClickListener {
toast(R.string.bucket_fill)
true
bucketFill.setOnClickListener { bucketFillClicked() }
bucketFill.setOnLongClickListener {
toast(R.string.bucket_fill)
true
}
}
checkIntents()
@ -138,15 +144,17 @@ class MainActivity : SimpleActivity(), CanvasListener {
override fun onResume() {
super.onResume()
setupToolbar(main_toolbar, statusBarColor = getProperBackgroundColor())
setupToolbar(binding.mainToolbar, statusBarColor = getProperBackgroundColor())
val isShowBrushSizeEnabled = config.showBrushSize
stroke_width_bar.beVisibleIf(isShowBrushSizeEnabled)
stroke_width_preview.beVisibleIf(isShowBrushSizeEnabled)
my_canvas.setAllowZooming(config.allowZoomingCanvas)
updateTextColors(main_holder)
if (isBlackAndWhiteTheme()) {
stroke_width_bar.setColors(0, config.canvasBackgroundColor.getContrastColor(), 0)
binding.apply {
val isShowBrushSizeEnabled = config.showBrushSize
strokeWidthBar.beVisibleIf(isShowBrushSizeEnabled)
strokeWidthPreview.beVisibleIf(isShowBrushSizeEnabled)
myCanvas.setAllowZooming(config.allowZoomingCanvas)
updateTextColors(mainHolder)
if (isBlackAndWhiteTheme()) {
strokeWidthBar.setColors(0, config.canvasBackgroundColor.getContrastColor(), 0)
}
}
if (config.preventPhoneFromSleeping) {
@ -169,11 +177,11 @@ class MainActivity : SimpleActivity(), CanvasListener {
override fun onDestroy() {
super.onDestroy()
my_canvas.mListener = null
binding.myCanvas.mListener = null
}
private fun refreshMenuItems() {
main_toolbar.menu.apply {
binding.mainToolbar.menu.apply {
findItem(R.id.menu_confirm).isVisible = isImageCaptureIntent || isEditIntent
findItem(R.id.menu_save).isVisible = !isImageCaptureIntent && !isEditIntent
findItem(R.id.menu_share).isVisible = !isImageCaptureIntent && !isEditIntent
@ -183,7 +191,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
}
private fun setupOptionsMenu() {
main_toolbar.setOnMenuItemClickListener { menuItem ->
binding.mainToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_confirm -> confirmImage()
R.id.menu_save -> trySaveImage()
@ -202,7 +210,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
}
override fun onBackPressed() {
val hasUnsavedChanges = savedPathsHash != my_canvas.getDrawingHashCode()
val hasUnsavedChanges = savedPathsHash != binding.myCanvas.getDrawingHashCode()
if (hasUnsavedChanges && System.currentTimeMillis() - lastSavePromptTS > SAVE_DISCARD_PROMPT_INTERVAL) {
lastSavePromptTS = System.currentTimeMillis()
ConfirmationAdvancedDialog(this, "", R.string.save_before_closing, R.string.save, R.string.discard) {
@ -244,11 +252,11 @@ class MainActivity : SimpleActivity(), CanvasListener {
} else if (requestCode == SAVE_IMAGE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
val outputStream = contentResolver.openOutputStream(resultData.data!!)
if (defaultExtension == SVG) {
Svg.saveToOutputStream(this, outputStream, my_canvas)
Svg.saveToOutputStream(this, outputStream, binding.myCanvas)
} else {
saveToOutputStream(outputStream, defaultExtension.getCompressionFormat(), false)
}
savedPathsHash = my_canvas.getDrawingHashCode()
savedPathsHash = binding.myCanvas.getDrawingHashCode()
}
}
@ -318,26 +326,30 @@ class MainActivity : SimpleActivity(), CanvasListener {
uriToLoad = uri
openPath(uri.path!!)
}
uri.scheme == "content" -> {
uriToLoad = uri
openUri(uri, intent)
}
else -> false
}
private fun openPath(path: String) = when {
path.endsWith(".svg") -> {
my_canvas.mBackgroundBitmap = null
Svg.loadSvg(this, File(path), my_canvas)
binding.myCanvas.mBackgroundBitmap = null
Svg.loadSvg(this, File(path), binding.myCanvas)
defaultExtension = SVG
true
}
File(path).isImageSlow() -> {
lastBitmapPath = path
my_canvas.drawBitmap(this, path)
binding.myCanvas.drawBitmap(this, path)
defaultExtension = JPG
true
}
else -> {
toast(R.string.invalid_file_format)
false
@ -349,16 +361,18 @@ class MainActivity : SimpleActivity(), CanvasListener {
val type = mime.getExtensionFromMimeType(contentResolver.getType(uri)) ?: intent.type ?: contentResolver.getType(uri)
return when (type) {
"svg", "image/svg+xml" -> {
my_canvas.mBackgroundBitmap = null
Svg.loadSvg(this, uri, my_canvas)
binding.myCanvas.mBackgroundBitmap = null
Svg.loadSvg(this, uri, binding.myCanvas)
defaultExtension = SVG
true
}
"jpg", "jpeg", "png", "gif", "image/jpg", "image/png", "image/gif", "webp" -> {
my_canvas.drawBitmap(this, uri)
binding.myCanvas.drawBitmap(this, uri)
defaultExtension = JPG
true
}
else -> {
toast(R.string.invalid_file_format)
false
@ -379,11 +393,11 @@ class MainActivity : SimpleActivity(), CanvasListener {
private fun updateEraserState() {
updateButtonStates()
my_canvas.toggleEraser(isEraserOn)
binding.myCanvas.toggleEraser(isEraserOn)
}
private fun changeBackgroundClicked() {
val oldColor = (my_canvas.background as ColorDrawable).color
val oldColor = (binding.myCanvas.background as ColorDrawable).color
ColorPickerDialog(this, oldColor) { wasPositivePressed, color ->
if (wasPositivePressed) {
config.canvasBackgroundColor = color
@ -423,7 +437,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
isBucketFillOn = !isBucketFillOn
updateButtonStates()
my_canvas.toggleBucketFill(isBucketFillOn)
binding.myCanvas.toggleBucketFill(isBucketFillOn)
}
private fun updateButtonStates() {
@ -431,9 +445,11 @@ class MainActivity : SimpleActivity(), CanvasListener {
hideBrushSettings(isEyeDropperOn || isBucketFillOn)
}
updateButtonColor(eraser, isEraserOn)
updateButtonColor(eye_dropper, isEyeDropperOn)
updateButtonColor(bucket_fill, isBucketFillOn)
binding.apply {
updateButtonColor(eraser, isEraserOn)
updateButtonColor(eyeDropper, isEyeDropperOn)
updateButtonColor(bucketFill, isBucketFillOn)
}
}
private fun updateButtonColor(view: ImageView, enabled: Boolean) {
@ -447,7 +463,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
}
private fun hideBrushSettings(hide: Boolean) {
arrayOf(stroke_width_bar, stroke_width_preview).forEach {
arrayOf(binding.strokeWidthBar, binding.strokeWidthPreview).forEach {
it.beGoneIf(hide)
}
}
@ -462,10 +478,12 @@ class MainActivity : SimpleActivity(), CanvasListener {
showErrorToast(e)
}
}
intentUri?.scheme == "content" -> {
val outputStream = contentResolver.openOutputStream(intentUri!!)
saveToOutputStream(outputStream, defaultPath.getCompressionFormat(), true)
}
else -> handlePermission(PERMISSION_WRITE_STORAGE) {
val fileDirItem = FileDirItem(defaultPath, defaultPath.getFilenameFromPath())
getFileOutputStream(fileDirItem, true) {
@ -488,7 +506,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
}
outputStream.use {
my_canvas.getBitmap().compress(format, quality, it)
binding.myCanvas.getBitmap().compress(format, quality, it)
}
if (finishAfterSaving) {
@ -529,7 +547,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
private fun saveImage() {
SaveImageDialog(this, defaultPath, defaultFilename, defaultExtension, false) { fullPath, filename, extension ->
savedPathsHash = my_canvas.getDrawingHashCode()
savedPathsHash = binding.myCanvas.getDrawingHashCode()
saveFile(fullPath)
defaultPath = fullPath.getParentPath()
defaultFilename = filename
@ -541,7 +559,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
private fun saveFile(path: String) {
when (path.getFilenameExtension()) {
SVG -> Svg.saveSvg(this, path, my_canvas)
SVG -> Svg.saveSvg(this, path, binding.myCanvas)
else -> saveImageFile(path)
}
rescanPaths(arrayListOf(path)) {}
@ -561,12 +579,12 @@ class MainActivity : SimpleActivity(), CanvasListener {
private fun writeToOutputStream(path: String, out: OutputStream) {
out.use {
my_canvas.getBitmap().compress(path.getCompressionFormat(), 70, out)
binding.myCanvas.getBitmap().compress(path.getCompressionFormat(), 70, out)
}
}
private fun shareImage() {
getImagePath(my_canvas.getBitmap()) {
getImagePath(binding.myCanvas.getBitmap()) {
if (it != null) {
sharePathIntent(it, BuildConfig.APPLICATION_ID)
} else {
@ -606,7 +624,7 @@ class MainActivity : SimpleActivity(), CanvasListener {
private fun clearCanvas() {
uriToLoad = null
my_canvas.clearCanvas()
binding.myCanvas.clearCanvas()
defaultExtension = PNG
defaultPath = ""
lastBitmapPath = ""
@ -629,40 +647,42 @@ class MainActivity : SimpleActivity(), CanvasListener {
eyeDropperClicked()
}
val contrastColor = pickedColor.getContrastColor()
undo.applyColorFilter(contrastColor)
eraser.applyColorFilter(contrastColor)
redo.applyColorFilter(contrastColor)
eye_dropper.applyColorFilter(contrastColor)
bucket_fill.applyColorFilter(contrastColor)
if (isBlackAndWhiteTheme()) {
stroke_width_bar.setColors(0, contrastColor, 0)
}
binding.apply {
val contrastColor = pickedColor.getContrastColor()
undo.applyColorFilter(contrastColor)
eraser.applyColorFilter(contrastColor)
redo.applyColorFilter(contrastColor)
eyeDropper.applyColorFilter(contrastColor)
bucketFill.applyColorFilter(contrastColor)
if (isBlackAndWhiteTheme()) {
strokeWidthBar.setColors(0, contrastColor, 0)
}
my_canvas.updateBackgroundColor(pickedColor)
defaultExtension = PNG
getBrushPreviewView().setStroke(getBrushStrokeSize(), contrastColor)
myCanvas.updateBackgroundColor(pickedColor)
defaultExtension = PNG
getBrushPreviewView().setStroke(getBrushStrokeSize(), contrastColor)
}
}
private fun setColor(pickedColor: Int) {
color = pickedColor
color_picker.setFillWithStroke(color, config.canvasBackgroundColor, true)
my_canvas.setColor(color)
binding.colorPicker.setFillWithStroke(color, config.canvasBackgroundColor, true)
binding.myCanvas.setColor(color)
isEraserOn = false
updateEraserState()
getBrushPreviewView().setColor(color)
}
private fun getBrushPreviewView() = stroke_width_preview.background as GradientDrawable
private fun getBrushPreviewView() = binding.strokeWidthPreview.background as GradientDrawable
private fun getBrushStrokeSize() = resources.getDimension(R.dimen.preview_dot_stroke_size).toInt()
override fun toggleUndoVisibility(visible: Boolean) {
undo.beVisibleIf(visible)
binding.undo.beVisibleIf(visible)
}
override fun toggleRedoVisibility(visible: Boolean) {
redo.beVisibleIf(visible)
binding.redo.beVisibleIf(visible)
}
override fun onSaveInstanceState(outState: Bundle) {
@ -686,17 +706,19 @@ class MainActivity : SimpleActivity(), CanvasListener {
}
private fun updateBrushSize() {
my_canvas.setBrushSize(brushSize)
val scale = Math.max(0.03f, brushSize / 100f)
stroke_width_preview.scaleX = scale
stroke_width_preview.scaleY = scale
binding.apply {
myCanvas.setBrushSize(brushSize)
val scale = Math.max(0.03f, brushSize / 100f)
strokeWidthPreview.scaleX = scale
strokeWidthPreview.scaleY = scale
}
}
private fun printImage() {
val printHelper = PrintHelper(this)
printHelper.scaleMode = PrintHelper.SCALE_MODE_FIT
try {
printHelper.printBitmap(getString(R.string.app_name), my_canvas.getBitmap())
printHelper.printBitmap(getString(R.string.app_name), binding.myCanvas.getBitmap())
} catch (e: Exception) {
showErrorToast(e)
}

View File

@ -6,24 +6,27 @@ import com.simplemobiletools.commons.extensions.getProperPrimaryColor
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.NavigationIcon
import com.simplemobiletools.commons.helpers.isTiramisuPlus
import com.simplemobiletools.draw.pro.R
import com.simplemobiletools.draw.pro.databinding.ActivitySettingsBinding
import com.simplemobiletools.draw.pro.extensions.config
import kotlinx.android.synthetic.main.activity_settings.*
import java.util.*
import java.util.Locale
class SettingsActivity : SimpleActivity() {
private val binding by lazy(LazyThreadSafetyMode.NONE) { ActivitySettingsBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
setContentView(binding.root)
updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar)
binding.apply {
updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar)
}
}
override fun onResume() {
super.onResume()
setupToolbar(settings_toolbar, NavigationIcon.Arrow)
setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
setupCustomizeColors()
setupUseEnglish()
@ -32,66 +35,78 @@ class SettingsActivity : SimpleActivity() {
setupBrushSize()
setupAllowZoomingCanvas()
setupForcePortraitMode()
updateTextColors(settings_holder)
updateTextColors(binding.settingsHolder)
arrayOf(settings_color_customization_section_label, settings_general_settings_label).forEach {
arrayOf(binding.settingsColorCustomizationSectionLabel, binding.settingsGeneralSettingsLabel).forEach {
it.setTextColor(getProperPrimaryColor())
}
}
private fun setupCustomizeColors() {
settings_color_customization_holder.setOnClickListener {
binding.settingsColorCustomizationHolder.setOnClickListener {
startCustomizationActivity()
}
}
private fun setupUseEnglish() {
settings_use_english_holder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
settings_use_english.isChecked = config.useEnglish
settings_use_english_holder.setOnClickListener {
settings_use_english.toggle()
config.useEnglish = settings_use_english.isChecked
System.exit(0)
binding.apply {
settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
settingsUseEnglish.isChecked = config.useEnglish
settingsUseEnglishHolder.setOnClickListener {
settingsUseEnglish.toggle()
config.useEnglish = settingsUseEnglish.isChecked
System.exit(0)
}
}
}
private fun setupLanguage() {
settings_language.text = Locale.getDefault().displayLanguage
settings_language_holder.beVisibleIf(isTiramisuPlus())
settings_language_holder.setOnClickListener {
launchChangeAppLanguageIntent()
binding.apply {
settingsLanguage.text = Locale.getDefault().displayLanguage
settingsLanguageHolder.beVisibleIf(isTiramisuPlus())
settingsLanguageHolder.setOnClickListener {
launchChangeAppLanguageIntent()
}
}
}
private fun setupPreventPhoneFromSleeping() {
settings_prevent_phone_from_sleeping.isChecked = config.preventPhoneFromSleeping
settings_prevent_phone_from_sleeping_holder.setOnClickListener {
settings_prevent_phone_from_sleeping.toggle()
config.preventPhoneFromSleeping = settings_prevent_phone_from_sleeping.isChecked
binding.apply {
settingsPreventPhoneFromSleeping.isChecked = config.preventPhoneFromSleeping
settingsPreventPhoneFromSleepingHolder.setOnClickListener {
settingsPreventPhoneFromSleeping.toggle()
config.preventPhoneFromSleeping = settingsPreventPhoneFromSleeping.isChecked
}
}
}
private fun setupBrushSize() {
settings_show_brush_size.isChecked = config.showBrushSize
settings_show_brush_size_holder.setOnClickListener {
settings_show_brush_size.toggle()
config.showBrushSize = settings_show_brush_size.isChecked
binding.apply {
settingsShowBrushSize.isChecked = config.showBrushSize
settingsShowBrushSizeHolder.setOnClickListener {
settingsShowBrushSize.toggle()
config.showBrushSize = settingsShowBrushSize.isChecked
}
}
}
private fun setupAllowZoomingCanvas() {
settings_allow_zooming_canvas.isChecked = config.allowZoomingCanvas
settings_allow_zooming_canvas_holder.setOnClickListener {
settings_allow_zooming_canvas.toggle()
config.allowZoomingCanvas = settings_allow_zooming_canvas.isChecked
binding.apply {
settingsAllowZoomingCanvas.isChecked = config.allowZoomingCanvas
settingsAllowZoomingCanvasHolder.setOnClickListener {
settingsAllowZoomingCanvas.toggle()
config.allowZoomingCanvas = settingsAllowZoomingCanvas.isChecked
}
}
}
private fun setupForcePortraitMode() {
settings_force_portrait.isChecked = config.forcePortraitMode
settings_force_portrait_holder.setOnClickListener {
settings_force_portrait.toggle()
config.forcePortraitMode = settings_force_portrait.isChecked
binding.apply {
settingsForcePortrait.isChecked = config.forcePortraitMode
settingsForcePortraitHolder.setOnClickListener {
settingsForcePortrait.toggle()
config.forcePortraitMode = settingsForcePortrait.isChecked
}
}
}
}

View File

@ -6,10 +6,10 @@ import com.simplemobiletools.commons.dialogs.FilePickerDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.draw.pro.R
import com.simplemobiletools.draw.pro.activities.SimpleActivity
import com.simplemobiletools.draw.pro.databinding.DialogSaveImageBinding
import com.simplemobiletools.draw.pro.helpers.JPG
import com.simplemobiletools.draw.pro.helpers.PNG
import com.simplemobiletools.draw.pro.helpers.SVG
import kotlinx.android.synthetic.main.dialog_save_image.view.*
import java.io.File
class SaveImageDialog(
@ -21,9 +21,9 @@ class SaveImageDialog(
init {
val initialFilename = getInitialFilename()
var folder = if (defaultPath.isEmpty()) "${activity.internalStoragePath}/$SIMPLE_DRAW" else defaultPath
val view = activity.layoutInflater.inflate(R.layout.dialog_save_image, null).apply {
save_image_filename.setText(initialFilename)
save_image_radio_group.check(
val binding = DialogSaveImageBinding.inflate(activity.layoutInflater).apply {
saveImageFilename.setText(initialFilename)
saveImageRadioGroup.check(
when (defaultExtension) {
JPG -> R.id.save_image_radio_jpg
SVG -> R.id.save_image_radio_svg
@ -32,12 +32,12 @@ class SaveImageDialog(
)
if (hidePath) {
folder_hint.beGone()
folderHint.beGone()
} else {
folder_value.setText(activity.humanizePath(folder))
folder_value.setOnClickListener {
folderValue.setText(activity.humanizePath(folder))
folderValue.setOnClickListener {
FilePickerDialog(activity, folder, false, showFAB = true) {
folder_value.setText(activity.humanizePath(it))
folderValue.setText(activity.humanizePath(it))
folder = it
}
}
@ -48,16 +48,16 @@ class SaveImageDialog(
.setPositiveButton(R.string.ok, null)
.setNegativeButton(R.string.cancel, null)
.apply {
activity.setupDialogStuff(view, this, R.string.save_as) { alertDialog ->
alertDialog.showKeyboard(view.save_image_filename)
activity.setupDialogStuff(binding.root, this, R.string.save_as) { alertDialog ->
alertDialog.showKeyboard(binding.saveImageFilename)
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val filename = view.save_image_filename.value
val filename = binding.saveImageFilename.value
if (filename.isEmpty()) {
activity.toast(R.string.filename_cannot_be_empty)
return@setOnClickListener
}
val extension = when (view.save_image_radio_group.checkedRadioButtonId) {
val extension = when (binding.saveImageRadioGroup.checkedRadioButtonId) {
R.id.save_image_radio_png -> PNG
R.id.save_image_radio_svg -> SVG
else -> JPG

View File

@ -3,7 +3,8 @@ package com.simplemobiletools.draw.pro.helpers
import android.graphics.Bitmap
import android.graphics.Color
import com.simplemobiletools.draw.pro.models.MyPath
import java.util.*
import java.util.LinkedList
import java.util.Queue
// Original algorithm by J. Dunlap http:// www.codeproject.com/KB/GDI-plus/queuelinearflood-fill.aspx
// Java port by Owen Kaluza
@ -28,7 +29,7 @@ class VectorFloodFiller(image: Bitmap) {
width = image.width
height = image.height
pixels = IntArray(width * height)
image.getPixels(pixels, 0, width, 0, 0, width, height)
image.getPixels(pixels!!, 0, width, 0, 0, width, height)
}
private fun prepare() {

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.7.10'
ext.kotlin_version = '1.9.0'
repositories {
google()
@ -9,7 +9,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.android.tools.build:gradle:8.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong

View File

@ -1,3 +1,4 @@
android.enableJetifier=true
android.nonTransitiveRClass=false
android.useAndroidX=true
org.gradle.jvmargs=-Xmx4g

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip