Mercurial > cgi-bin > hgweb.cgi > SimpleResizer
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)) |