OSDN Git Service

ライブビュー画像の遅延表示機能を追加した。
authorMRSa <mrsa@myad.jp>
Sun, 7 Jun 2020 11:52:56 +0000 (20:52 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 7 Jun 2020 11:54:12 +0000 (20:54 +0900)
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/FujiXCommandPublisher.java
app/src/main/java/net/osdn/gokigen/a01d/liveview/CameraLiveImageView.java
app/src/main/java/net/osdn/gokigen/a01d/preference/IPreferencePropertyAccessor.java
app/src/main/java/net/osdn/gokigen/a01d/preference/summary/PreferenceFragmentSummary.java
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/strings.xml
app/src/main/res/xml/preferences_summary.xml

index 2428ac8..ec6ff01 100644 (file)
@@ -69,7 +69,10 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm
         // ストリームを全部閉じる
         try
         {
-            dos.close();
+            if (dos != null)
+            {
+                dos.close();
+            }
         }
         catch (Exception e)
         {
@@ -79,7 +82,10 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm
 
         try
         {
-            bufferedReader.close();
+            if (bufferedReader != null)
+            {
+                bufferedReader.close();
+            }
         }
         catch (Exception e)
         {
@@ -89,7 +95,10 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm
 
         try
         {
-            socket.close();
+            if (socket != null)
+            {
+                socket.close();
+            }
         }
         catch (Exception e)
         {
@@ -215,6 +224,13 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm
     {
         try
         {
+            if (socket == null)
+            {
+                Log.v(TAG, "SEND: SOCKET NULL ");
+                dump_bytes("MSG[" + byte_array.length + "] ", byte_array);
+                return;
+            }
+
             dos = new DataOutputStream(socket.getOutputStream());
 
             // メッセージボディを加工: 最初に4バイトのレングス長をつける
@@ -277,6 +293,11 @@ public class FujiXCommandPublisher implements IFujiXCommandPublisher, IFujiXComm
         {
             sleep(delayMs);
             byte[] byte_array = new byte[BUFFER_SIZE];
+            if (socket == null)
+            {
+                Log.v(TAG, " RECV: SOCKET NULL (ID: " + id + ")");
+                return;
+            }
             InputStream is = socket.getInputStream();
             if (is != null)
             {
index 2bab4e1..6e68192 100644 (file)
@@ -34,12 +34,16 @@ import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 
 import androidx.exifinterface.media.ExifInterface;
 
+import static net.osdn.gokigen.a01d.liveview.message.IMessageDrawer.MessageArea.LOWRIGHT;
+import static net.osdn.gokigen.a01d.liveview.message.IMessageDrawer.SIZE_STD;
+
 /**
  *   CameraLiveImageView :
  *    (OLYMPUS の ImageCaptureSample そのまま)
@@ -51,6 +55,7 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu
 
     private static final String EXIF_ORIENTATION = "Orientation";
 
+    private Context context = null;
     private boolean focusAssistFeature = false;
     private boolean showGridFeature = false;
     private ImageView.ScaleType imageScaleType;
@@ -64,12 +69,16 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu
     private IGridFrameDrawer gridFrameDrawer = null;
     private IPreviewImageConverter bitmapConverter = null;
     private IMessageHolder messageHolder;
+    private IMessageDrawer messageDrawer;
     private IStoreImage storeImage = null;
     private IFocusLockIndicator focusLockIndicator = null;
 
     private FileOutputStream outputStream = null;
     private static final int LIMIT_SAVE_COUNT = 0;  // 0なら、ダミーファイルを作らない
-    private int saveCount = 10;       // LIMIT_SAVE_COUNTより大きければダミーファイルに書かない
+    private int saveCount = 10;                     // LIMIT_SAVE_COUNTより大きければダミーファイルに書かない
+
+    private int maxCachePics = 500;
+    private ArrayList<byte[]> cachePics = null;
 
     public CameraLiveImageView(Context context)
     {
@@ -93,18 +102,25 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu
     {
         prepareFile();
         storeImage = new StoreImage(context);
-        messageHolder = new ShowMessageHolder();
+        ShowMessageHolder messageHolder =  new ShowMessageHolder();
+        this.messageHolder = messageHolder;
+        messageDrawer = messageHolder;
         imageScaleType = ImageView.ScaleType.FIT_CENTER;
-        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+        this.context = context;
 
         // Gridの表示/非表示
         int framingGridStatus = 0;
         gridFrameDrawer = GridFrameFactory.getGridFrameDrawer(framingGridStatus);
+
+        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
         showGridFeature = preferences.getBoolean(IPreferencePropertyAccessor.SHOW_GRID_STATUS, false);
 
         int converterType = 0;
         bitmapConverter = ImageConvertFactory.getImageConverter(converterType);
 
+        // liveview画面の表示遅延
+        setupLiveviewCache();
+
         // ダミーのビットマップデータ読み込み...画面表示のテスト用ロジック
         try
         {
@@ -117,6 +133,40 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu
         }
     }
 
+    /**
+     *   ライブビュー表示の遅延機能を有効にするかどうか。
+     *
+     */
+    private void setupLiveviewCache()
+    {
+        try
+        {
+            SharedPreferences preference = androidx.preference.PreferenceManager.getDefaultSharedPreferences(context);
+            if (preference != null)
+            {
+                if (preference.getBoolean(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, false))
+                {
+                    // 画像のキャッシュをする場合に new する
+                    cachePics = new ArrayList<>();
+                    String nofCachePics = preference.getString(IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES, IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE);
+                    maxCachePics = Integer.parseInt(nofCachePics);
+                }
+                else
+                {
+                    // cache 機能を無効化する。
+                    cachePics = null;
+                    System.gc();
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            maxCachePics = 500;
+        }
+    }
+
+
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
@@ -188,19 +238,59 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu
      * Sets a image to view.
      * (OlympusCameraLiveViewListenerImpl.IImageDataReceiver の実装)
      *
-     * @param data     A image of live-view.
-     * @param metadata A metadata of the image.
+     * @param receivedData  A image of live-view.
+     * @param metadata      A metadata of the image.
      */
-    public void setImageData(byte[] data, Map<String, Object> metadata)
+    public void setImageData(byte[] receivedData, Map<String, Object> metadata)
     {
         Bitmap bitmap;
         int rotationDegrees;
 
-        if (data != null)
+        if (receivedData != null)
         {
             // Create a bitmap.
             try
             {
+                byte[] data = receivedData;
+                if (cachePics != null)
+                {
+                    boolean cacheIsFull = false;
+                    try
+                    {
+                        cachePics.add(receivedData);
+                        if (cachePics.size() > maxCachePics)
+                        {
+                            cacheIsFull = true;
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        e.printStackTrace();
+                        cacheIsFull = true;
+                    }
+                    messageDrawer.setMessageToShow(LOWRIGHT, Color.LTGRAY, SIZE_STD, "CACHE : " + (cachePics.size() - 1) + " / " + maxCachePics);
+                    if (cacheIsFull)
+                    {
+                        try
+                        {
+                            // リストから一つ取り除く
+                            int index = 0; // cachePics.size() - 1;
+                            data = cachePics.get(index);
+                            cachePics.remove(index);
+                        }
+                        catch (Exception e)
+                        {
+                            e.printStackTrace();
+                        }
+                    }
+                    else
+                    {
+                        // キャッシュがたまっていない場合は、カウントだけ上げる
+                        refreshCanvas();
+                        return;
+                    }
+                }
+
                 //ByteArrayInputStream bais = new ByteArrayInputStream(data);
                 //bitmap = BitmapFactory.decodeStream(bais);
                 //bais.close();
@@ -659,12 +749,12 @@ public class CameraLiveImageView extends View implements IImageDataReceiver, IAu
         }
 
         // 画面下部右側に表示する
-        message = messageHolder.getMessage(ShowMessageHolder.MessageArea.LOWRIGHT);
+        message = messageHolder.getMessage(LOWRIGHT);
         if ((message != null)&&(message.length() > 0))
         {
             Paint paint = new Paint();
-            paint.setColor(messageHolder.getColor(ShowMessageHolder.MessageArea.LOWRIGHT));
-            paint.setTextSize(messageHolder.getSize(ShowMessageHolder.MessageArea.LOWRIGHT));
+            paint.setColor(messageHolder.getColor(LOWRIGHT));
+            paint.setTextSize(messageHolder.getSize(LOWRIGHT));
             paint.setAntiAlias(true);
             float width = paint.measureText(message);
             Paint.FontMetrics fontMetrics = paint.getFontMetrics();
index 0084d99..423c200 100644 (file)
@@ -93,6 +93,10 @@ public interface IPreferencePropertyAccessor
     String PREFERENCE_CANON_SETTINGS = "canon_settings";
     String PREFERENCE_NIKON_SETTINGS = "nikon_settings";
 
+    String CACHE_LIVEVIEW_PICTURES = "cache_liveview_pictures";
+    String NUMBER_OF_CACHE_PICTURES = "number_of_cache_pictures";
+    String NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE = "500";
+
  /*
     int CHOICE_SPLASH_SCREEN = 10;
 
index 21cbd2e..e1f696d 100644 (file)
@@ -137,6 +137,14 @@ public class PreferenceFragmentSummary extends PreferenceFragmentCompat implemen
             {
                 editor.putString(IPreferencePropertyAccessor.CONNECTION_METHOD, IPreferencePropertyAccessor.CONNECTION_METHOD_DEFAULT_VALUE);
             }
+            if (!items.containsKey(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES))
+            {
+                editor.putBoolean(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, false);
+            }
+            if (!items.containsKey(IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES))
+            {
+                editor.putString(IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES, IPreferencePropertyAccessor.NUMBER_OF_CACHE_PICTURES_DEFAULT_VALUE);
+            }
             editor.apply();
         }
         catch (Exception e)
@@ -168,6 +176,11 @@ public class PreferenceFragmentSummary extends PreferenceFragmentCompat implemen
                     Log.v(TAG, " " + key + " , " + value);
                     break;
 
+                case IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES:
+                    value = preferences.getBoolean(key, true);
+                    Log.v(TAG, " " + key + "  , " + value);
+                    break;
+
                 default:
                     String strValue = preferences.getString(key, "");
                     setListPreference(key, key, strValue);
@@ -386,6 +399,7 @@ public class PreferenceFragmentSummary extends PreferenceFragmentCompat implemen
                         // Preferenceの画面に反映させる
                         setBooleanPreference(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, defaultValue);
                         setBooleanPreference(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, defaultValue);
+                        setBooleanPreference(IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, IPreferencePropertyAccessor.CACHE_LIVEVIEW_PICTURES, false);
                     }
                     catch (Exception e)
                     {
index 2d90372..2f25026 100644 (file)
 
     <string name="pref_exit_power_off_summary">アプリ終了</string>
 
+    <string name="pref_cache_liveview_pictures">ライブビュー画像の表示を遅延</string>
+    <string name="pref_summary_cache_liveview_pictures">ライブビュー画像を溜めて表示します。(再起動後に有効)</string>
+    <string name="pref_number_of_cache_pictures">ライブビュー画像の遅延最大数</string>
+    <string name="pref_summary_number_of_cache_pictures">ライブビューを遅らせる画像の最大枚数を指定します。(初期値:500、再起動後に有効)</string>
+
 </resources>
index 21d2854..393f5a0 100644 (file)
 
     <string name="pref_exit_power_off_summary">Exit Application</string>
 
+    <string name="pref_cache_liveview_pictures">Delay liveview picture</string>
+    <string name="pref_summary_cache_liveview_pictures">This switch effects after restart. </string>
+    <string name="pref_number_of_cache_pictures">Max number of cache pictures</string>
+    <string name="pref_summary_number_of_cache_pictures">Set number of cache pictures. (Default:500, enables after restart.)</string>
+
 </resources>
index f615ba4..3962fe9 100644 (file)
             android:key="capture_both_camera_and_live_view"
             android:title="@string/pref_capture_both_camera_and_live_view" />
 
+        <CheckBoxPreference
+            android:key="cache_liveview_pictures"
+            android:title="@string/pref_cache_liveview_pictures"
+            android:summary="@string/pref_summary_cache_liveview_pictures" />
+
+        <EditTextPreference
+            android:key="number_of_cache_pictures"
+            android:title="@string/pref_number_of_cache_pictures"
+            android:defaultValue="500"
+            android:inputType="numberDecimal"
+            android:digits="0123456789"
+            android:summary="@string/pref_summary_number_of_cache_pictures" />
+
     </PreferenceCategory>
 
     <PreferenceCategory