Mercurial > cgi-bin > hgweb.cgi > SimpleResizer
annotate app/src/main/java/com/bartsent/simpleresizer/EditImage.kt @ 5:247e03baf77c
Fix rotation.
author | David Barts <n5jrn@me.com> |
---|---|
date | Wed, 10 Feb 2021 16:31:01 -0800 |
parents | b6a217c850fb |
children | e8059b166de1 |
rev | line source |
---|---|
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
1 package com.bartsent.simpleresizer |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
2 |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
3 import android.content.ContentValues |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
4 import android.graphics.Bitmap |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
5 import android.graphics.BitmapFactory |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
6 import android.graphics.Canvas |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
7 import android.graphics.Matrix |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
8 import android.net.Uri |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
9 import android.os.Bundle |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
10 import android.os.Environment |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
11 import android.provider.MediaStore |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
12 import android.provider.OpenableColumns |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
13 import android.view.MenuItem |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
14 import android.view.View |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
15 import android.widget.EditText |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
16 import androidx.appcompat.app.AlertDialog |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
17 import androidx.appcompat.app.AppCompatActivity |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
18 import androidx.appcompat.widget.PopupMenu |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
19 import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding |
5 | 20 import java.io.File |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
21 import java.io.IOException |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
22 import kotlin.math.roundToInt |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
23 |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
24 class EditImage : AppCompatActivity() { |
5 | 25 private object State { |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
26 var uri: Uri? = null |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
27 var bitmap: Bitmap? = null |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
28 } |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
29 |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
30 private val STDDIMS = arrayOf<Int>(1600, 1280, 1024, 800, 640, 512, 400, 320).apply { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
31 sort() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
32 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
33 |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
34 private lateinit var binding: ActivityEditImageBinding |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
35 |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
36 override fun onCreate(savedInstanceState: Bundle?) { |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
37 super.onCreate(savedInstanceState) |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
38 binding = ActivityEditImageBinding.inflate(layoutInflater) |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
39 setContentView(binding.root) |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
40 } |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
41 |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
42 // Cribbed from: https://stackoverflow.com/questions/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
43 private fun getFileName(uri: Uri): String? { |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
44 var result: String? = null |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
45 if (uri.scheme == "content") { |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
46 contentResolver.query(uri, null, null, null, null).use { cursor -> |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
47 if (cursor != null && cursor.moveToFirst()) |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
48 result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
49 } |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
50 } |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
51 if (result == null) { |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
52 val uriPath = uri.path |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
53 result = uriPath?.substring(uriPath.lastIndexOf('/') + 1) |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
54 } |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
55 return result |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
56 } |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
57 |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
58 private fun showError(message: String): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
59 AlertDialog.Builder(this).also { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
60 it.setMessage(message) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
61 it.setNeutralButton(R.string.ok_text) { dialog, _ -> |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
62 dialog.dismiss() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
63 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
64 it.setOnDismissListener { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
65 finish() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
66 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
67 it.create() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
68 }.show() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
69 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
70 |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
71 override fun onResume() { |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
72 super.onResume() |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
73 |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
74 // Read the URI, die if we can't. |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
75 val imageUri = intent?.data |
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
76 if (imageUri == null) { |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
77 showError(getString(R.string.error_no_uri)) |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
78 return |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
79 } |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
80 |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
81 // Being stateful stops data loss when the phone gets rotated. |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
82 if (imageUri != State.uri) { |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
83 State.uri = imageUri |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
84 State.bitmap = contentResolver.openInputStream(imageUri).use { |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
85 BitmapFactory.decodeStream(it) |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
86 } |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
87 } |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
88 if (State.bitmap == null) { |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
89 showError(getString(R.string.error_bad_image)) |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
90 return |
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
91 } |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
92 setImage(State.bitmap!!) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
93 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
94 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
95 fun setImage(image: Bitmap): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
96 binding.imageSize.text = getString(R.string.image_size_text, image.width, image.height) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
97 binding.image.setImageBitmap(image) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
98 State.bitmap = image |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
99 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
100 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
101 fun scaleClicked(view: View): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
102 val maxSize = State.bitmap!!.run { maxOf(width, height) } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
103 PopupMenu(this, view).apply { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
104 menu.run { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
105 STDDIMS.filter { it < maxSize }.forEach { add(it.toString()) } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
106 add(getString(R.string.custom_text)) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
107 add(getString(R.string.cancel_text)) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
108 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
109 setOnMenuItemClickListener(::scaleMenuItemClicked) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
110 show() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
111 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
112 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
113 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
114 fun scaleMenuItemClicked(item: MenuItem) : Boolean { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
115 val itString = item.title.toString() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
116 var itVal = itString.toIntOrNull() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
117 if (itVal == null) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
118 return when (itString) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
119 getString(R.string.cancel_text) -> true |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
120 getString(R.string.custom_text) -> { showCustomScaleDialog(); true } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
121 else -> false |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
122 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
123 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
124 doScale(itVal) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
125 return true |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
126 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
127 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
128 private fun copyColorSpace(old: Bitmap, new: Bitmap): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
129 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
130 val oldColorSpace = old.colorSpace |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
131 if (oldColorSpace != null) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
132 new.setColorSpace(oldColorSpace) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
133 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
134 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
135 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
136 fun doScale(newMax: Int): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
137 val oldBitmap = State.bitmap!! |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
138 val factor = newMax.toFloat() / maxOf(oldBitmap.width, oldBitmap.height).toFloat() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
139 if (factor >= 1.0) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
140 throw IllegalArgumentException("can only scale down") |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
141 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
142 val newBitmap = Bitmap.createBitmap((oldBitmap.width * factor).roundToInt(), (oldBitmap.height * factor).roundToInt(), oldBitmap.config) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
143 copyColorSpace(oldBitmap, newBitmap) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
144 val scaler = Matrix().apply { setScale(factor, factor) } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
145 Canvas(newBitmap).run { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
146 drawBitmap(oldBitmap, scaler, null) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
147 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
148 setImage(newBitmap) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
149 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
150 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
151 // is there any way to remember the last scale value? |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
152 // if so: should we? |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
153 |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
154 fun showCustomScaleDialog(): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
155 val image = State.bitmap!! |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
156 val curMaxDim = maxOf(image.width, image.height) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
157 val dialogView = layoutInflater.inflate(R.layout.dialog_custom_scale, null) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
158 AlertDialog.Builder(this).also { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
159 it.setPositiveButton(R.string.ok_text) { dialog, _ -> |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
160 val maxDim = dialogView.findViewById<EditText>(R.id.custom_scale)?.text.toString().toIntOrNull() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
161 dialog.dismiss() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
162 if (maxDim == null || maxDim < 8 || maxDim >= curMaxDim) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
163 AlertDialog.Builder(this).also { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
164 it.setMessage(R.string.bad_scale) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
165 it.setNeutralButton(R.string.ok_text) { dialog, _ -> |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
166 dialog.dismiss() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
167 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
168 it.create() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
169 }.show() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
170 } else { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
171 doScale(maxDim) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
172 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
173 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
174 it.setNegativeButton(R.string.cancel_text) { dialog, _ -> |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
175 dialog.dismiss() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
176 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
177 it.setView(dialogView) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
178 it.create() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
179 }.show() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
180 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
181 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
182 fun rotateClicked(view: View): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
183 PopupMenu(this, view).apply { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
184 setOnMenuItemClickListener { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
185 when(it.itemId) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
186 R.id.r_90_cw -> { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
187 doRotate(90) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
188 true |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
189 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
190 R.id.r_180 -> { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
191 doRotate(180) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
192 true |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
193 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
194 R.id.r_90_ccw -> { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
195 doRotate(270) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
196 true |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
197 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
198 R.id.r_cancel -> true |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
199 else -> false |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
200 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
201 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
202 inflate(R.menu.rotate) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
203 show() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
204 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
205 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
206 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
207 fun doRotate(deg: Int): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
208 val oldBitmap = State.bitmap!! |
5 | 209 if (deg % 90 != 0) { |
210 throw IllegalArgumentException("$deg not a multiple of 90") | |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
211 } |
5 | 212 val (w, h) = if (deg % 180 == 0) Pair(oldBitmap.width, oldBitmap.height) else Pair(oldBitmap.height, oldBitmap.width) |
213 val newBitmap = Bitmap.createBitmap(w, h, oldBitmap.config) | |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
214 copyColorSpace(oldBitmap, newBitmap) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
215 val rotater = Matrix().apply { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
216 setRotate(deg.toFloat(), oldBitmap.width.toFloat()/2.0f, oldBitmap.height.toFloat()/2.0f) |
5 | 217 postTranslate((w - oldBitmap.width).toFloat()/2.0f, (h - oldBitmap.height).toFloat()/2.0f) |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
218 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
219 Canvas(newBitmap).run { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
220 drawBitmap(oldBitmap, rotater, null) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
221 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
222 setImage(newBitmap) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
223 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
224 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
225 fun cancelClicked(view: View): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
226 State.uri = null |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
227 State.bitmap = null |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
228 finish() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
229 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
230 |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
231 fun doneClicked(view: View): Unit { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
232 val contentValues = ContentValues().apply { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
233 var fileName = getFileName(State.uri!!) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
234 if (fileName == null) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
235 val d = java.util.Date() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
236 fileName = "IMG_%tY%tm%td_%tH%tM%tS.jpg".format(d, d, d, d, d, d) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
237 } else { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
238 val dot = fileName.lastIndexOf('.') |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
239 if (dot == -1) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
240 fileName = fileName + ".jpg" |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
241 } else { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
242 val fileExt = fileName.substring(dot).toLowerCase() |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
243 if (fileExt !in setOf(".jpg", ".jpeg")) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
244 fileName = fileName.substring(0..dot) + ".jpg" |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
245 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
246 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
247 put(MediaStore.MediaColumns.DISPLAY_NAME, fileName) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
248 put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
249 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { |
5 | 250 put(MediaStore.MediaColumns.RELATIVE_PATH, |
251 File(Environment.DIRECTORY_PICTURES, getString(R.string.app_name)).getPath()) | |
2
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
252 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
253 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
254 try { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
255 val myUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
256 if (myUri == null) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
257 throw IOException(getString(R.string.error_create_mediastore)) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
258 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
259 val stream = contentResolver.openOutputStream(myUri) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
260 if (stream == null) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
261 throw IOException(getString(R.string.error_get_output)) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
262 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
263 // fixme: use quality from settings |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
264 stream.use { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
265 if (!State.bitmap!!.compress(Bitmap.CompressFormat.JPEG, 85, it)) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
266 throw IOException(getString(R.string.error_save_bitmap)) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
267 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
268 } |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
269 } catch (ioe: IOException) { |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
270 showError(ioe.message ?: getString(R.string.error_io)) |
06825e49f7aa
Got it scaling and rotating, needs settings, etc.
David Barts <n5jrn@me.com>
parents:
1
diff
changeset
|
271 } |
5 | 272 finish() |
0
13935000c2d9
Stuff Andriod Studio ignored for some reason.
David Barts <n5jrn@me.com>
parents:
diff
changeset
|
273 } |
1
f26f61a8a9ad
Make the EditImage activity stateful.
David Barts <n5jrn@me.com>
parents:
0
diff
changeset
|
274 } |