comparison app/src/main/java/com/bartsent/simpleresizer/EditImage.kt @ 15:20da616dcda0

Add preferences.
author David Barts <n5jrn@me.com>
date Thu, 18 Feb 2021 22:12:19 -0800
parents 678adef4774f
children 3ed74dc0e34a
comparison
equal deleted inserted replaced
14:73beb7c973ae 15:20da616dcda0
1 package com.bartsent.simpleresizer 1 package com.bartsent.simpleresizer
2 2
3 import android.annotation.SuppressLint
3 import android.content.ContentValues 4 import android.content.ContentValues
5 import android.content.Intent
4 import android.graphics.Bitmap 6 import android.graphics.Bitmap
5 import android.graphics.BitmapFactory 7 import android.graphics.BitmapFactory
6 import android.graphics.Canvas 8 import android.graphics.Canvas
7 import android.graphics.Matrix 9 import android.graphics.Matrix
8 import android.net.Uri 10 import android.net.Uri
9 import android.os.Bundle 11 import android.os.Bundle
10 import android.os.Environment 12 import android.os.Environment
11 import android.provider.MediaStore 13 import android.provider.MediaStore
12 import android.provider.OpenableColumns 14 import android.provider.OpenableColumns
15 import android.util.Log
16 import android.view.Menu
13 import android.view.MenuItem 17 import android.view.MenuItem
14 import android.view.View 18 import android.view.View
15 import android.widget.EditText 19 import android.widget.EditText
16 import android.widget.ProgressBar 20 import android.widget.ProgressBar
17 import androidx.appcompat.app.AlertDialog 21 import androidx.appcompat.app.AlertDialog
20 import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding 24 import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding
21 import com.bartsent.simpleresizer.lib.getScaledInstance 25 import com.bartsent.simpleresizer.lib.getScaledInstance
22 import java.io.File 26 import java.io.File
23 import java.io.IOException 27 import java.io.IOException
24 import kotlin.concurrent.thread 28 import kotlin.concurrent.thread
25 import kotlin.math.roundToInt 29 import androidx.preference.PreferenceManager
26 30
27 class EditImage : AppCompatActivity() { 31 class EditImage : AppCompatActivity() {
28 private object State { 32 private object State {
29 var uri: Uri? = null 33 var uri: Uri? = null
30 var bitmap: Bitmap? = null 34 var bitmap: Bitmap? = null
38 42
39 override fun onCreate(savedInstanceState: Bundle?) { 43 override fun onCreate(savedInstanceState: Bundle?) {
40 super.onCreate(savedInstanceState) 44 super.onCreate(savedInstanceState)
41 binding = ActivityEditImageBinding.inflate(layoutInflater) 45 binding = ActivityEditImageBinding.inflate(layoutInflater)
42 setContentView(binding.root) 46 setContentView(binding.root)
47 PreferenceManager.setDefaultValues(applicationContext, R.xml.root_preferences, false)
48 }
49
50 override fun onCreateOptionsMenu(menu: Menu?): Boolean {
51 menuInflater.inflate(R.menu.menu_edit, menu)
52 return super.onCreateOptionsMenu(menu)
53 }
54
55 override fun onOptionsItemSelected(item: MenuItem): Boolean {
56 if (item.itemId == R.id.settings_item) {
57 startActivity(
58 Intent(Intent.ACTION_APPLICATION_PREFERENCES, null, this,
59 SettingsActivity::class.java))
60 return true
61 }
62 return false
43 } 63 }
44 64
45 // Cribbed from: https://stackoverflow.com/questions/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content 65 // Cribbed from: https://stackoverflow.com/questions/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content
46 private fun getFileName(uri: Uri): String? { 66 private fun getFileName(uri: Uri): String? {
47 var result: String? = null 67 var result: String? = null
140 val oldBitmap = State.bitmap!! 160 val oldBitmap = State.bitmap!!
141 val factor = newMax.toDouble() / maxOf(oldBitmap.width, oldBitmap.height).toDouble() 161 val factor = newMax.toDouble() / maxOf(oldBitmap.width, oldBitmap.height).toDouble()
142 if (factor >= 1.0) { 162 if (factor >= 1.0) {
143 throw IllegalArgumentException("can only scale down") 163 throw IllegalArgumentException("can only scale down")
144 } 164 }
165 val scaleType = PreferenceManager.getDefaultSharedPreferences(applicationContext).getString(
166 "scale_type", "speed" )
167 Log.d("EditImage", "scaling, scale_type = $scaleType")
145 binding.progressBar.visibility = ProgressBar.VISIBLE 168 binding.progressBar.visibility = ProgressBar.VISIBLE
146 thread { 169 thread {
147 val newBitmap = oldBitmap.getScaledInstance( 170 val newWidth = (oldBitmap.width.toDouble() * factor + 0.5).toInt()
148 (oldBitmap.width.toDouble() * factor + 0.5).toInt(), 171 val newHeight = (oldBitmap.height.toDouble() * factor + 0.5).toInt()
149 (oldBitmap.height.toDouble() * factor + 0.5).toInt()) 172 val newBitmap = if (scaleType == "quality")
173 oldBitmap.getScaledInstance(newWidth, newHeight)
174 else
175 Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true)
150 runOnUiThread { 176 runOnUiThread {
151 binding.progressBar.visibility = ProgressBar.INVISIBLE 177 binding.progressBar.visibility = ProgressBar.INVISIBLE
152 setImage(newBitmap) 178 setImage(newBitmap)
153 } 179 }
154 } 180 }
270 } 296 }
271 val stream = contentResolver.openOutputStream(myUri) 297 val stream = contentResolver.openOutputStream(myUri)
272 if (stream == null) { 298 if (stream == null) {
273 throw IOException(getString(R.string.error_get_output)) 299 throw IOException(getString(R.string.error_get_output))
274 } 300 }
275 // fixme: use quality from settings 301 val quality = maxOf(0, minOf(100,
302 PreferenceManager.getDefaultSharedPreferences(applicationContext).getInt(
303 "jpeg_quality", 85)))
304 Log.d("EditImage", "saving, jpeg_quality = $quality")
276 stream.use { 305 stream.use {
277 if (!State.bitmap!!.compress(Bitmap.CompressFormat.JPEG, 85, it)) { 306 if (!State.bitmap!!.compress(Bitmap.CompressFormat.JPEG, quality, it)) {
278 throw IOException(getString(R.string.error_save_bitmap)) 307 throw IOException(getString(R.string.error_save_bitmap))
279 } 308 }
280 } 309 }
281 } catch (ioe: IOException) { 310 } catch (ioe: IOException) {
282 showError(ioe.message ?: getString(R.string.error_io)) 311 showError(ioe.message ?: getString(R.string.error_io))