OSDN Git Service

OPC機用のイベント受信ロジックを入れてみた。
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / liveview / image / CameraLiveViewListenerImpl.kt
index 6378a60..29443af 100644 (file)
@@ -15,16 +15,19 @@ import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
 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>()
 
@@ -44,17 +47,28 @@ class CameraLiveViewListenerImpl(private val context: Context) : IImageDataRecei
         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)
             {
@@ -253,8 +267,11 @@ class CameraLiveViewListenerImpl(private val context: Context) : IImageDataRecei
             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)
         {
@@ -275,6 +292,15 @@ class CameraLiveViewListenerImpl(private val context: Context) : IImageDataRecei
             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)
@@ -317,6 +343,11 @@ class CameraLiveViewListenerImpl(private val context: Context) : IImageDataRecei
         return (BitmapFactory.decodeResource(context.resources, ID_DRAWABLE_SPLASH_IMAGE))
     }
 
+    fun isImageReceived() : Boolean
+    {
+        return (isImageReceived)
+    }
+
     private fun refresh()
     {
         try
@@ -335,12 +366,13 @@ class CameraLiveViewListenerImpl(private val context: Context) : IImageDataRecei
     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()