import jp.osdn.gokigen.gokigenassets.liveview.bitmapconvert.IPreviewImageConverter
import jp.osdn.gokigen.gokigenassets.liveview.bitmapconvert.ImageConvertFactory
import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
+import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
import java.io.ByteArrayOutputStream
import java.util.*
data class MyImageByteArray(val imageData : ByteArray, val rotationDegrees: Int)
-class CameraLiveViewListenerImpl(private val context: Context) : IImageDataReceiver, IImageProvider, ImageAnalysis.Analyzer
+class CameraLiveViewListenerImpl(private val context: Context, private val informationReceiver: IInformationReceiver, private val isDisableCache : Boolean = false) : IImageDataReceiver, IImageProvider, ImageAnalysis.Analyzer
{
private var cachePics = ArrayList<MyImageByteArray>()
+ private var isImageReceived = false
private var maxCachePics : Int = 0
+ private var cacheIsFull = false
private var bitmapConverter : IPreviewImageConverter = ImageConvertFactory().getImageConverter(0)
private val refresher = ArrayList<ILiveViewRefresher>()
setupLiveviewCache()
}
- override fun onUpdateLiveView(data: ByteArray, metadata: Map<String, Any>?)
+
+ override fun onUpdateLiveView(data: ByteArray, metadata: Map<String, Any>?, degrees : Int)
{
- refresh()
+ try
+ {
+ insertCache(data, degrees)
+ isImageReceived = true
+ refresh()
+ }
+ catch (t : Throwable)
+ {
+ t.printStackTrace()
+ }
}
- @SuppressLint("UnsafeExperimentalUsageError")
+ @SuppressLint("UnsafeExperimentalUsageError", "UnsafeOptInUsageError")
override fun analyze(imageProxy: ImageProxy)
{
try
{
val rotationDegrees = imageProxy.imageInfo.rotationDegrees
+ isImageReceived = true
if (imageProxy.image?.planes?.get(1)?.pixelStride == 1)
{
val rotationMatrix = Matrix()
rotationMatrix.postRotate(image.rotationDegrees.toFloat())
imageBitmap = BitmapFactory.decodeByteArray(image.imageData, 0, image.imageData.size)
- imageBitmap = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.width, imageBitmap.height, rotationMatrix, true)
- System.gc()
+ if (imageBitmap != null)
+ {
+ imageBitmap = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.width, imageBitmap.height, rotationMatrix, true)
+ System.gc()
+ }
}
catch (t: Throwable)
{
if ((maxCachePics > 0)&&(cachePics.size != maxCachePics))
{
Log.v(TAG, " -=-=- image cache : ${cachePics.size} / $maxCachePics")
+ informationReceiver.updateMessage("cache:${cachePics.size}/$maxCachePics")
+ }
+ else
+ {
+ if (!cacheIsFull)
+ {
+ informationReceiver.updateMessage("")
+ cacheIsFull = true
+ }
}
}
catch (e : Exception)
return (BitmapFactory.decodeResource(context.resources, ID_DRAWABLE_SPLASH_IMAGE))
}
+ fun isImageReceived() : Boolean
+ {
+ return (isImageReceived)
+ }
+
private fun refresh()
{
try
private fun setupLiveviewCache()
{
val preference = PreferenceAccessWrapper(context)
- if (!preference.getBoolean(ID_PREFERENCE_CACHE_LIVE_VIEW_PICTURES, false))
+ if ((!preference.getBoolean(ID_PREFERENCE_CACHE_LIVE_VIEW_PICTURES, false))||(isDisableCache))
{
return
}
cachePics.clear()
+ cacheIsFull = false
val nofCachePics = preference.getString(ID_PREFERENCE_NUMBER_OF_CACHE_PICTURES, ID_PREFERENCE_NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE)
maxCachePics = try {
nofCachePics.toInt()