view app/src/main/java/com/bartsent/simpleresizer/EditImage.kt @ 1:f26f61a8a9ad

Make the EditImage activity stateful.
author David Barts <n5jrn@me.com>
date Mon, 01 Feb 2021 08:30:12 -0800
parents 13935000c2d9
children 06825e49f7aa
line wrap: on
line source

package com.bartsent.simpleresizer

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.OpenableColumns
import android.text.Html
import android.text.Spanned
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.databinding.DataBindingUtil
import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding


class EditImage : AppCompatActivity() {
    object State {
        var uri: Uri? = null
        var bitmap: Bitmap? = null
    }

    private lateinit var binding: ActivityEditImageBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityEditImageBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }

    private fun item(title: String, value: Any?): String =
        if (value == null)
            ""
        else
            "<b>${title}:</b> ${Html.escapeHtml(value.toString())}<br/>"

    private fun fromHtml(input: String): Spanned =
        if (android.os.Build.VERSION.SDK_INT >= 24) {
            Html.fromHtml(input, Html.FROM_HTML_MODE_COMPACT)
        } else {
            Html.fromHtml(input)
        }

    // Cribbed from: https://stackoverflow.com/questions/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content
    private fun getFileName(uri: Uri): String? {
        var result: String? = null
        if (uri.scheme == "content") {
            contentResolver.query(uri, null, null, null, null).use { cursor ->
                if (cursor != null && cursor.moveToFirst())
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
            }
        }
        if (result == null) {
            val uriPath = uri.path
            result = uriPath?.substring(uriPath.lastIndexOf('/') + 1)
        }
        return result
    }

    override fun onResume() {
        super.onResume()

        // Read the URI, die if we can't.
        val imageUri = intent?.data
        if (imageUri == null) {
            binding.imageStatusReport.text = fromHtml("<b>Error:</b> no URI supplied!")
            return
        }

        // Being stateful stops data loss when the phone gets rotated.
        if (imageUri != State.uri) {
            State.uri = imageUri
            State.bitmap = contentResolver.openInputStream(imageUri).use {
                BitmapFactory.decodeStream(it)
            }
        }
        if (State.bitmap == null) {
            binding.imageStatusReport.text = fromHtml("<b>Error:</b> bad image!")
            return
        }
        val imageBitmap = State.bitmap!!

        // OK, we have the Bitmap; operate on it.
        binding.imageStatusReport.text = fromHtml(
                item("Uri", imageUri) +
                        item("File-Name", getFileName((imageUri))) +
                        item("Byte-Count", imageBitmap.byteCount) +
                        item("Density", imageBitmap.density) +
                        item("Height", imageBitmap.height) +
                        item("Width", imageBitmap.width) +
                        item("Has-Alpha", imageBitmap.hasAlpha())
        )
    }
}