Fixed abstract product image rotation, added image compression
This commit is contained in:
		@@ -6,6 +6,7 @@ import android.content.ContextWrapper
 | 
				
			|||||||
import android.graphics.Bitmap
 | 
					import android.graphics.Bitmap
 | 
				
			||||||
import android.graphics.BitmapFactory
 | 
					import android.graphics.BitmapFactory
 | 
				
			||||||
import android.graphics.Matrix
 | 
					import android.graphics.Matrix
 | 
				
			||||||
 | 
					import android.media.ExifInterface
 | 
				
			||||||
import android.net.Uri
 | 
					import android.net.Uri
 | 
				
			||||||
import android.os.Build
 | 
					import android.os.Build
 | 
				
			||||||
import androidx.annotation.RequiresApi
 | 
					import androidx.annotation.RequiresApi
 | 
				
			||||||
@@ -42,11 +43,18 @@ fun generateThumbnailForImage(context: Context, imageHash: String) {
 | 
				
			|||||||
    val imageContent = imageFile.inputStream().readBytes()
 | 
					    val imageContent = imageFile.inputStream().readBytes()
 | 
				
			||||||
    var img = BitmapFactory.decodeByteArray(imageContent, 0, imageContent.size)
 | 
					    var img = BitmapFactory.decodeByteArray(imageContent, 0, imageContent.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    val matrix = Matrix();
 | 
					    val exif = ExifInterface(imageFile.absoluteFile.toString())
 | 
				
			||||||
    matrix.postRotate(90f)
 | 
					    val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
 | 
				
			||||||
    val scaled = Bitmap.createScaledBitmap(img, img.width/4, img.height/4, true)
 | 
					    val matrix = Matrix()
 | 
				
			||||||
    val rotated = Bitmap.createBitmap(scaled, 0, 0, scaled.width, scaled.height, matrix, true)
 | 
					
 | 
				
			||||||
    rotated.compress(Bitmap.CompressFormat.WEBP_LOSSY, 25, FileOutputStream(thumbnailFile))
 | 
					    when(orientation){
 | 
				
			||||||
 | 
					        ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90F)
 | 
				
			||||||
 | 
					        ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180F)
 | 
				
			||||||
 | 
					        ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270F)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    val rotated = Bitmap.createBitmap(img, 0, 0, img.width, img.height, matrix, true)
 | 
				
			||||||
 | 
					    val scaled = Bitmap.createScaledBitmap(rotated, rotated.width/4, rotated.height/4, true)
 | 
				
			||||||
 | 
					    scaled.compress(Bitmap.CompressFormat.WEBP_LOSSY, 25, FileOutputStream(thumbnailFile))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@OptIn(ExperimentalStdlibApi::class)
 | 
					@OptIn(ExperimentalStdlibApi::class)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,10 @@ package org.foxarmy.barcodescannerforemployees.activities
 | 
				
			|||||||
import android.content.DialogInterface
 | 
					import android.content.DialogInterface
 | 
				
			||||||
import android.content.Intent
 | 
					import android.content.Intent
 | 
				
			||||||
import android.content.SharedPreferences
 | 
					import android.content.SharedPreferences
 | 
				
			||||||
 | 
					import android.graphics.Bitmap
 | 
				
			||||||
 | 
					import android.graphics.BitmapFactory
 | 
				
			||||||
 | 
					import android.graphics.Matrix
 | 
				
			||||||
 | 
					import android.media.ExifInterface
 | 
				
			||||||
import android.os.Build
 | 
					import android.os.Build
 | 
				
			||||||
import android.os.Bundle
 | 
					import android.os.Bundle
 | 
				
			||||||
import android.util.Log
 | 
					import android.util.Log
 | 
				
			||||||
@@ -25,6 +29,7 @@ import org.foxarmy.barcodescannerforemployees.database.CategoryDAO
 | 
				
			|||||||
import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
					import org.foxarmy.barcodescannerforemployees.database.DBStorageController
 | 
				
			||||||
import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
					import org.foxarmy.barcodescannerforemployees.dataclasses.AbstractProduct
 | 
				
			||||||
import java.io.File
 | 
					import java.io.File
 | 
				
			||||||
 | 
					import java.io.FileOutputStream
 | 
				
			||||||
import java.nio.file.Files
 | 
					import java.nio.file.Files
 | 
				
			||||||
import java.nio.file.StandardCopyOption
 | 
					import java.nio.file.StandardCopyOption
 | 
				
			||||||
import kotlin.concurrent.thread
 | 
					import kotlin.concurrent.thread
 | 
				
			||||||
@@ -276,6 +281,28 @@ class AddAbstractProductActivity : AppCompatActivity() {
 | 
				
			|||||||
            pictureFile = File(picturesPath, "$imageHash.png")
 | 
					            pictureFile = File(picturesPath, "$imageHash.png")
 | 
				
			||||||
            Files.move(tempfile.toPath(), pictureFile.toPath(), StandardCopyOption.REPLACE_EXISTING)
 | 
					            Files.move(tempfile.toPath(), pictureFile.toPath(), StandardCopyOption.REPLACE_EXISTING)
 | 
				
			||||||
            tempfile.delete()
 | 
					            tempfile.delete()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            val imageContent = pictureFile.inputStream().readBytes()
 | 
				
			||||||
 | 
					            var img = BitmapFactory.decodeByteArray(imageContent, 0, imageContent.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            val exif = ExifInterface(pictureFile.absoluteFile.toString())
 | 
				
			||||||
 | 
					            val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
 | 
				
			||||||
 | 
					            val matrix = Matrix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            when(orientation){
 | 
				
			||||||
 | 
					                ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90F)
 | 
				
			||||||
 | 
					                ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180F)
 | 
				
			||||||
 | 
					                ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270F)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            val rotated = Bitmap.createBitmap(img, 0, 0, img.width, img.height, matrix, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            val compressionFactor = sharedPreferences.getInt("compression", 1)
 | 
				
			||||||
 | 
					            rotated.compress(
 | 
				
			||||||
 | 
					                Bitmap.CompressFormat.WEBP_LOSSY,
 | 
				
			||||||
 | 
					                100 * (15 / (16 - compressionFactor)),
 | 
				
			||||||
 | 
					                FileOutputStream(pictureFile)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            generateThumbnailForImage(this, imageHash)
 | 
					            generateThumbnailForImage(this, imageHash)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            imageView.setImageURI(getImageUri(this, pictureFile))
 | 
					            imageView.setImageURI(getImageUri(this, pictureFile))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ class SettingsActivity : AppCompatActivity() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        binding.saveButton.setOnClickListener {
 | 
					        binding.saveButton.setOnClickListener {
 | 
				
			||||||
            sharedPreferences.edit().putString("currentGroup", net.getGroupId(binding.currentGroupSpinner.selectedItem.toString())).apply()
 | 
					            sharedPreferences.edit().putString("currentGroup", net.getGroupId(binding.currentGroupSpinner.selectedItem.toString())).apply()
 | 
				
			||||||
            sharedPreferences.edit().putInt("imageCompression", binding.imageCompressionFactorSeekBar.progress)
 | 
					            sharedPreferences.edit().putInt("imageCompression", binding.imageCompressionFactorSeekBar.progress + 1).apply()
 | 
				
			||||||
            setResult(Activity.RESULT_OK)
 | 
					            setResult(Activity.RESULT_OK)
 | 
				
			||||||
            finish()
 | 
					            finish()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -63,8 +63,8 @@ class SettingsActivity : AppCompatActivity() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun setUpImageCompressionSeekBar() {
 | 
					    private fun setUpImageCompressionSeekBar() {
 | 
				
			||||||
        val compressionFactor = sharedPreferences.getInt("imageCompression", 0)
 | 
					        val compressionFactor = sharedPreferences.getInt("imageCompression", 1)
 | 
				
			||||||
        binding.imageCompressionFactorSeekBar.progress = compressionFactor
 | 
					        binding.imageCompressionFactorSeekBar.progress = compressionFactor - 1
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun fillUpCurrentGroupSpinner() {
 | 
					    private fun fillUpCurrentGroupSpinner() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@
 | 
				
			|||||||
            app:layout_constraintStart_toStartOf="parent" android:id="@+id/imageCompressionSetting"
 | 
					            app:layout_constraintStart_toStartOf="parent" android:id="@+id/imageCompressionSetting"
 | 
				
			||||||
            android:layout_marginTop="16dp">
 | 
					            android:layout_marginTop="16dp">
 | 
				
			||||||
        <TextView
 | 
					        <TextView
 | 
				
			||||||
                android:text="@string/image_scale_factor"
 | 
					                android:text="@string/image_compress_factor"
 | 
				
			||||||
                android:layout_width="187dp"
 | 
					                android:layout_width="187dp"
 | 
				
			||||||
                android:layout_height="30dp" android:id="@+id/imageCompressionFactorTextView" android:textSize="20sp"
 | 
					                android:layout_height="30dp" android:id="@+id/imageCompressionFactorTextView" android:textSize="20sp"
 | 
				
			||||||
                android:textAlignment="center"
 | 
					                android:textAlignment="center"
 | 
				
			||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
                style="@style/Widget.AppCompat.SeekBar.Discrete"
 | 
					                style="@style/Widget.AppCompat.SeekBar.Discrete"
 | 
				
			||||||
                android:layout_width="219dp"
 | 
					                android:layout_width="219dp"
 | 
				
			||||||
                android:layout_height="wrap_content"
 | 
					                android:layout_height="wrap_content"
 | 
				
			||||||
                android:max="16"
 | 
					                android:max="15"
 | 
				
			||||||
                android:progress="0"
 | 
					                android:progress="0"
 | 
				
			||||||
                android:id="@+id/imageCompressionFactorSeekBar"
 | 
					                android:id="@+id/imageCompressionFactorSeekBar"
 | 
				
			||||||
                android:tickMark="@drawable/seekbar_tick"
 | 
					                android:tickMark="@drawable/seekbar_tick"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,7 +111,7 @@
 | 
				
			|||||||
    <string name="leave_group">Leave group</string>
 | 
					    <string name="leave_group">Leave group</string>
 | 
				
			||||||
    <string name="rename_group">Rename group</string>
 | 
					    <string name="rename_group">Rename group</string>
 | 
				
			||||||
    <string name="join_or_create_group">Join or create a group</string>
 | 
					    <string name="join_or_create_group">Join or create a group</string>
 | 
				
			||||||
    <string name="image_scale_factor">Image scale factor\n</string>
 | 
					    <string name="image_compress_factor">Image compression factor</string>
 | 
				
			||||||
    <string name="current_group">Current group</string>
 | 
					    <string name="current_group">Current group</string>
 | 
				
			||||||
    <string name="cancel">Cancel</string>
 | 
					    <string name="cancel">Cancel</string>
 | 
				
			||||||
    <string-array name="languages">
 | 
					    <string-array name="languages">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -109,7 +109,7 @@
 | 
				
			|||||||
    <string name="leave_group">Leave group</string>
 | 
					    <string name="leave_group">Leave group</string>
 | 
				
			||||||
    <string name="rename_group">Rename group</string>
 | 
					    <string name="rename_group">Rename group</string>
 | 
				
			||||||
    <string name="join_or_create_group">Join or create a group</string>
 | 
					    <string name="join_or_create_group">Join or create a group</string>
 | 
				
			||||||
    <string name="image_scale_factor">Image scale factor\n</string>
 | 
					    <string name="image_compress_factor">Image compression factor</string>
 | 
				
			||||||
    <string name="current_group">Current group</string>
 | 
					    <string name="current_group">Current group</string>
 | 
				
			||||||
    <string name="cancel">Cancel</string>
 | 
					    <string name="cancel">Cancel</string>
 | 
				
			||||||
    <string-array name="languages">
 | 
					    <string-array name="languages">
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user