OSDN Git Service

Fuji対応。今度は表示側。
authorMRSa <mrsa@myad.jp>
Thu, 23 Apr 2020 14:23:39 +0000 (23:23 +0900)
committerMRSa <mrsa@myad.jp>
Thu, 23 Apr 2020 14:23:39 +0000 (23:23 +0900)
16 files changed:
app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXInterfaceProvider.java
app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXPlaybackControl.java [deleted file]
app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXFullImageReceiver.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXImageContentInfo.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXPlaybackControl.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXThumbnailImageReceiver.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/gr2control/camera/olympus/wrapper/playback/OlyCameraPlaybackControl.java
app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContent.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContentListCallback.java [moved from app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IDownloadContentListCallback.java with 70% similarity]
app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IPlaybackControl.java
app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IProgressEvent.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/gr2control/camera/ricohgr2/wrapper/RicohGr2PlaybackControl.java
app/src/main/java/net/osdn/gokigen/gr2control/playback/ImageGridViewFragment.java
app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/ImagePagerViewFragment.java
app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/MyContentDownloader.java
app/src/main/res/drawable/ic_broken_image_black_24dp.xml [new file with mode: 0644]

index 53954fb..4467416 100644 (file)
@@ -33,6 +33,7 @@ import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCa
 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandPublisher;
 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommunication;
 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.connection.FujiXConnection;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.playback.FujiXPlaybackControl;
 import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
 import net.osdn.gokigen.gr2control.liveview.IAutoFocusFrameDisplay;
 import net.osdn.gokigen.gr2control.liveview.ICameraStatusUpdateNotify;
@@ -95,7 +96,7 @@ public class FujiXInterfaceProvider implements IFujiXInterfaceProvider, IDisplay
         zoomControl = new FujiXZoomControl();
         buttonControl = new FujiXButtonControl();
         statusChecker = new FujiXStatusChecker(context, commandPublisher);
-        playbackControl = new FujiXPlaybackControl(communicationTimeoutMs);
+        playbackControl = new FujiXPlaybackControl(context, this);
         hardwareStatus = new FujiXHardwareStatus();
         runMode = new FujiXRunMode();
     }
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXPlaybackControl.java
deleted file mode 100644 (file)
index 5ce5920..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper;
-
-import androidx.annotation.NonNull;
-
-import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
-import net.osdn.gokigen.gr2control.camera.playback.IContentInfoCallback;
-import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentCallback;
-import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentListCallback;
-import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
-import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
-
-public class FujiXPlaybackControl implements IPlaybackControl
-{
-    private final String TAG = toString();
-    private static final int DEFAULT_TIMEOUT = 5000;
-    private final int timeoutValue;
-
-    FujiXPlaybackControl(int timeoutMSec)
-    {
-        this.timeoutValue  = Math.max(DEFAULT_TIMEOUT, timeoutMSec); // (timeoutMSec < DEFAULT_TIMEOUT) ? DEFAULT_TIMEOUT : timeoutMSec;
-    }
-
-
-    @Override
-    public String getRawFileSuffix()
-    {
-        return null;
-    }
-
-    @Override
-    public void downloadContentList(@NonNull IDownloadContentListCallback callback)
-    {
-
-    }
-
-    @Override
-    public void getContentInfo(@NonNull String path, @NonNull IContentInfoCallback callback)
-    {
-
-    }
-
-    @Override
-    public void updateCameraFileInfo(ICameraFileInfo info)
-    {
-
-    }
-
-    @Override
-    public void downloadContentScreennail(@NonNull String path, @NonNull IDownloadThumbnailImageCallback callback)
-    {
-
-    }
-
-    @Override
-    public void downloadContentThumbnail(@NonNull String path, @NonNull IDownloadThumbnailImageCallback callback)
-    {
-
-    }
-
-    @Override
-    public void downloadContent(@NonNull String path, boolean isSmallSize, @NonNull IDownloadContentCallback callback)
-    {
-
-    }
-}
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXFullImageReceiver.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXFullImageReceiver.java
new file mode 100644 (file)
index 0000000..8dfd166
--- /dev/null
@@ -0,0 +1,64 @@
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.playback;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentCallback;
+import net.osdn.gokigen.gr2control.camera.playback.ProgressEvent;
+
+public class FujiXFullImageReceiver implements IFujiXCommandCallback
+{
+    private final String TAG = toString();
+    private final IDownloadContentCallback callback;
+    private int receivedLength;
+
+    FujiXFullImageReceiver( @NonNull IDownloadContentCallback callback)
+    {
+        this.callback = callback;
+        this.receivedLength = 0;
+    }
+
+    @Override
+    public void receivedMessage(int id, byte[] rx_body)
+    {
+        try
+        {
+            Log.v(TAG, " receivedMessage() : onCompleted. " + id + " (" + receivedLength + " bytes.)");
+            callback.onCompleted();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            {
+                callback.onErrorOccurred(e);
+            }
+        }
+    }
+
+    @Override
+    public void onReceiveProgress(final int currentBytes, final int totalBytes, byte[] body)
+    {
+        try
+        {
+            receivedLength = receivedLength + currentBytes;
+            //Log.v(TAG, " onReceiveProgress() " + receivedLength + "/" + totalBytes);
+            float percent = (totalBytes == 0) ? 0.0f : ((float) currentBytes / (float) totalBytes);
+
+            callback.onProgress(body, currentBytes, new ProgressEvent(percent, null));
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            callback.onErrorOccurred(e);
+        }
+    }
+
+    @Override
+    public boolean isReceiveMulti()
+    {
+        return (true);
+    }
+
+}
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXImageContentInfo.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXImageContentInfo.java
new file mode 100644 (file)
index 0000000..ebf4fda
--- /dev/null
@@ -0,0 +1,225 @@
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.playback;
+
+import android.util.Log;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.playback.CameraFileInfo;
+import net.osdn.gokigen.gr2control.camera.playback.ICameraContent;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+public class FujiXImageContentInfo implements ICameraContent, IFujiXCommandCallback
+{
+    private final String TAG = toString();
+    private final int indexNumber;
+    private boolean isReceived = false;
+    private boolean isDateValid = false;
+    private Date date = null;
+    private String realFileName = null;
+    private CameraFileInfo fileInfo = null;
+    private byte[] rx_body;
+    FujiXImageContentInfo(int indexNumber, byte[] rx_body)
+    {
+        this.indexNumber = indexNumber;
+        this.rx_body = rx_body;
+        if (this.rx_body != null)
+        {
+            updateInformation(rx_body);
+        }
+        else
+        {
+            date = new Date();
+            isDateValid = false;
+        }
+    }
+
+    @Override
+    public String getCameraId()
+    {
+        return ("FujiX");
+    }
+
+    @Override
+    public String getCardId()
+    {
+        return ("sd1");
+    }
+
+    @Override
+    public String getContentPath()
+    {
+        return ("");
+    }
+
+    @Override
+    public String getContentName()
+    {
+        try
+        {
+            if ((realFileName != null)&&(realFileName.contains(".MOV")))
+            {
+                return ("" + indexNumber + ".MOV");
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return ("" + indexNumber + ".JPG");
+    }
+
+    @Override
+    public String getOriginalName()
+    {
+        if (realFileName != null)
+        {
+            return (realFileName);
+        }
+        return (getContentName());
+    }
+
+    @Override
+    public boolean isRaw()
+    {
+        try
+        {
+            if ((realFileName != null)&&(realFileName.contains(".RAF")))
+            {
+                return (true);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (false);
+    }
+
+    @Override
+    public boolean isMovie()
+    {
+        try
+        {
+            if ((realFileName != null)&&(realFileName.contains(".MOV")))
+            {
+                return (true);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (false);
+    }
+
+    @Override
+    public boolean isDateValid()
+    {
+        return (isDateValid);
+    }
+
+    @Override
+    public boolean isContentNameValid()
+    {
+        return (false);
+    }
+
+    @Override
+    public Date getCapturedDate()
+    {
+        return (date);
+    }
+
+    @Override
+    public void setCapturedDate(Date date)
+    {
+        try
+        {
+            this.date = date;
+            isDateValid = true;
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+    {
+        Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+    }
+
+    @Override
+    public boolean isReceiveMulti()
+    {
+        return (false);
+    }
+
+    @Override
+    public void receivedMessage(int id, byte[] rx_body)
+    {
+        Log.v(TAG, "RX : " + indexNumber + "(" + id + ") " + rx_body.length + " bytes.");
+        this.rx_body = rx_body;
+        updateInformation(rx_body);
+
+    }
+
+    public int getId()
+    {
+        return (indexNumber);
+    }
+
+    boolean isReceived()
+    {
+        return (isReceived);
+    }
+
+    CameraFileInfo getCameraFileInfo()
+    {
+        if (fileInfo != null)
+        {
+            return (fileInfo);
+        }
+        return (new CameraFileInfo(getContentPath(), getOriginalName()));
+    }
+
+    private void updateInformation(byte[] rx_body)
+    {
+        try
+        {
+            if (rx_body.length >= 166)
+            {
+                // データの切り出し
+                realFileName = new String(pickupString(rx_body, 65, 12));
+                String dateString = new String(pickupString(rx_body, 92, 15));
+                //char orientation = Character.(rx_body[151]);
+                Log.v(TAG, "[" + indexNumber + "] FILE NAME : " + realFileName + "  DATE : '" + dateString + "'");
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH);
+                date = dateFormat.parse(dateString);
+                isDateValid = true;
+                isReceived = true;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *   文字列を無理やり切り出す...
+     *
+     */
+    private byte[] pickupString(byte[] data, int start, int length)
+    {
+        byte[] result = new byte[length];
+        for (int index = 0; index < length; index++)
+        {
+            result[index] = data[start + index * 2];
+        }
+        return (result);
+    }
+}
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXPlaybackControl.java
new file mode 100644 (file)
index 0000000..559712c
--- /dev/null
@@ -0,0 +1,318 @@
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.playback;
+
+import android.app.Activity;
+import android.util.Log;
+import android.util.SparseArray;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
+import net.osdn.gokigen.gr2control.camera.ICameraStatus;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.FujiXInterfaceProvider;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandPublisher;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.GetFullImage;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.GetImageInfo;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.GetThumbNail;
+import net.osdn.gokigen.gr2control.camera.playback.ICameraContent;
+import net.osdn.gokigen.gr2control.camera.playback.IContentInfoCallback;
+import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentCallback;
+import net.osdn.gokigen.gr2control.camera.playback.ICameraContentListCallback;
+import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
+import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXCameraProperties.IMAGE_FILE_COUNT_STR_ID;
+
+public class FujiXPlaybackControl implements IPlaybackControl, IFujiXCommandCallback
+{
+    private final String TAG = toString();
+    private final Activity activity;
+    private final FujiXInterfaceProvider provider;
+    //private List<ICameraContent> imageInfo;
+    private SparseArray<FujiXImageContentInfo> imageContentInfo;
+
+    private int indexNumber = 0;
+    private ICameraContentListCallback finishedCallback = null;
+
+    public FujiXPlaybackControl(Activity activity, FujiXInterfaceProvider provider)
+    {
+        this.activity = activity;
+        this.provider = provider;
+        this.imageContentInfo = new SparseArray<>();
+    }
+
+    @Override
+    public String getRawFileSuffix() {
+        return (null);
+    }
+
+    @Override
+    public void downloadContentList(@NonNull final ICameraContentListCallback callback)
+    {
+        try
+        {
+            Thread thread = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    getCameraContents(callback);
+                }
+            });
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            callback.onErrorOccurred(e);
+        }
+    }
+
+    @Override
+    public void getContentInfo(@Nullable String path, @NonNull String name, @NonNull IContentInfoCallback callback)
+    {
+        // showFileInformation
+
+    }
+
+    @Override
+    public void updateCameraFileInfo(ICameraFileInfo info)
+    {
+        //  なにもしない
+    }
+
+    @Override
+    public void downloadContentScreennail(@Nullable String path, @NonNull String name, @NonNull IDownloadThumbnailImageCallback callback)
+    {
+        // Thumbnail と同じ画像を表示する
+        downloadContentThumbnail(path, name, callback);
+    }
+
+    @Override
+    public void downloadContentThumbnail(@Nullable String path, @NonNull String name, @NonNull IDownloadThumbnailImageCallback callback)
+    {
+        try
+        {
+            int start = 0;
+            if (path.indexOf("/") == 0)
+            {
+                start = 1;
+            }
+            String indexStr = path.substring(start, path.indexOf("."));
+            Log.v(TAG, "downloadContentThumbnail() : " + path + " " + indexStr);
+            int index = Integer.parseInt(indexStr);
+            if ((index > 0)&&(index <= imageContentInfo.size()))
+            {
+                IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+                FujiXImageContentInfo contentInfo = imageContentInfo.get(index);
+                if (!contentInfo.isReceived())
+                {
+                    publisher.enqueueCommand(new GetImageInfo(index, index, contentInfo));
+                }
+                publisher.enqueueCommand(new GetThumbNail(index, new FujiXThumbnailImageReceiver(activity, callback)));
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void downloadContent(@Nullable String path, @NonNull String name, boolean isSmallSize, @NonNull IDownloadContentCallback callback)
+    {
+        try
+        {
+            int start = 0;
+            if (path.indexOf("/") == 0)
+            {
+                start = 1;
+            }
+            String indexStr = path.substring(start, path.indexOf("."));
+            Log.v(TAG, "FujiX::downloadContent() : " + path + " " + indexStr);
+            int index = Integer.parseInt(indexStr);
+            //FujiXImageContentInfo contentInfo = imageContentInfo.get(index);   // 特にデータを更新しないから大丈夫か?
+            if ((index > 0)&&(index <= imageContentInfo.size()))
+            {
+                IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+                publisher.enqueueCommand(new GetFullImage(index, new FujiXFullImageReceiver(callback)));
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void showPictureStarted()
+    {
+
+    }
+
+    @Override
+    public void showPictureFinished()
+    {
+
+    }
+
+    private void getCameraContents(ICameraContentListCallback callback)
+    {
+        int nofFiles = -1;
+        try {
+            finishedCallback = callback;
+            ICameraStatus statusListHolder = provider.getCameraStatusListHolder();
+            if (statusListHolder != null) {
+                String count = statusListHolder.getStatus(IMAGE_FILE_COUNT_STR_ID);
+                nofFiles = Integer.parseInt(count);
+                Log.v(TAG, "getCameraContents() : " + nofFiles + " (" + count + ")");
+            }
+            Log.v(TAG, "getCameraContents() : DONE.");
+            if (nofFiles > 0)
+            {
+                // 件数ベースで取得する(情報は、後追いで反映させる...この方式だと、キューに積みまくってるが、、、)
+                checkImageFiles(nofFiles);
+            }
+            else
+            {
+                // 件数が不明だったら、1件づつインデックスの情報を取得する
+                checkImageFileAll();
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            finishedCallback.onErrorOccurred(e);
+            finishedCallback = null;
+        }
+    }
+
+    /**
+     *   最初から取得可能なイメージ情報を(件数ベースで)取得する
+     *
+     */
+    private void checkImageFiles(int nofFiles)
+    {
+        try
+        {
+            imageContentInfo.clear();
+            //IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+            //for (int index = nofFiles; index > 0; index--)
+            for (int index = 1; index <= nofFiles; index++)
+            {
+                // ファイル数分、仮のデータを生成する
+                imageContentInfo.append(index, new FujiXImageContentInfo(index, null));
+
+                //ファイル名などを取得する (メッセージを積んでおく...でも遅くなるので、ここではやらない方がよいかな。)
+                //publisher.enqueueCommand(new GetImageInfo(index, index, info));
+            }
+
+            // インデックスデータがなくなったことを検出...データがそろったとして応答する。
+            Log.v(TAG, "IMAGE LIST : " + imageContentInfo.size() + " (" + nofFiles + ")");
+            finishedCallback.onCompleted(getCameraFileInfoList());
+            finishedCallback = null;
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *   最初から取得可能なイメージ情報をすべて取得する
+     *
+     */
+    private void checkImageFileAll()
+    {
+        try
+        {
+            imageContentInfo.clear();
+            indexNumber = 1;
+            IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+            publisher.enqueueCommand(new GetImageInfo(indexNumber, indexNumber, this));
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+    {
+        Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+    }
+
+    @Override
+    public boolean isReceiveMulti()
+    {
+        return (false);
+    }
+
+    @Override
+    public void receivedMessage(int id, byte[] rx_body)
+    {
+        // イメージ数の一覧が取得できなかった場合にここで作る。
+        if (rx_body.length < 16)
+        {
+            // インデックスデータがなくなったことを検出...データがそろったとして応答する。
+            Log.v(TAG, "IMAGE LIST : " + imageContentInfo.size());
+            finishedCallback.onCompleted(getCameraFileInfoList());
+            finishedCallback = null;
+            return;
+        }
+        try
+        {
+            Log.v(TAG, "RECEIVED IMAGE INFO : " + indexNumber);
+
+            // 受信データを保管しておく
+            imageContentInfo.append(indexNumber, new FujiXImageContentInfo(indexNumber, rx_body));
+
+            // 次のインデックスの情報を要求する
+            indexNumber++;
+            IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+            publisher.enqueueCommand(new GetImageInfo(indexNumber, indexNumber, this));
+        }
+        catch (Exception e)
+        {
+            // エラーになったら、そこで終了にする
+            e.printStackTrace();
+            finishedCallback.onCompleted(getCameraFileInfoList());
+            finishedCallback = null;
+        }
+    }
+
+    private List<ICameraContent> getCameraContentList()
+    {
+        /// ダサいけど...コンテナクラスを詰め替えて応答する
+        List<ICameraContent> contentList = new ArrayList<>();
+        int listSize = imageContentInfo.size();
+        for(int index = 0; index < listSize; index++)
+        {
+            contentList.add(imageContentInfo.valueAt(index));
+        }
+        return (contentList);
+    }
+
+    private List<ICameraFileInfo> getCameraFileInfoList()
+    {
+        List<ICameraFileInfo> fileInfoList = new ArrayList<>();
+        try
+        {
+            int listSize = imageContentInfo.size();
+            for(int index = 0; index < listSize; index++)
+            {
+                FujiXImageContentInfo info = imageContentInfo.valueAt(index);
+                fileInfoList.add(info.getCameraFileInfo());
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (fileInfoList);
+    }
+
+}
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXThumbnailImageReceiver.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXThumbnailImageReceiver.java
new file mode 100644 (file)
index 0000000..04e658e
--- /dev/null
@@ -0,0 +1,61 @@
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.playback;
+
+import android.content.Context;
+import android.graphics.BitmapFactory;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.R;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
+
+public class FujiXThumbnailImageReceiver  implements IFujiXCommandCallback
+{
+    private final String TAG = toString();
+    private final Context context;
+    private final IDownloadThumbnailImageCallback callback;
+
+    FujiXThumbnailImageReceiver(Context context, @NonNull IDownloadThumbnailImageCallback callback)
+    {
+        this.context = context;
+        this.callback = callback;
+    }
+
+    @Override
+    public void receivedMessage(int id, byte[] rx_body)
+    {
+        try
+        {
+            int offset = 12;
+            if (rx_body.length > offset)
+            {
+                callback.onCompleted(BitmapFactory.decodeByteArray(rx_body, offset, rx_body.length - offset), null);
+            }
+            else
+            {
+                Log.v(TAG, "BITMAP IS NONE... : " + rx_body.length);
+                callback.onCompleted(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_broken_image_black_24dp), null);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            {
+                callback.onErrorOccurred(e);
+            }
+        }
+    }
+
+    @Override
+    public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+    {
+        Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+    }
+
+    @Override
+    public boolean isReceiveMulti()
+    {
+        return (false);
+    }
+}
index 677f442..fc10e1b 100644 (file)
@@ -7,7 +7,7 @@ import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
 import net.osdn.gokigen.gr2control.camera.playback.CameraFileInfo;
 import net.osdn.gokigen.gr2control.camera.playback.IContentInfoCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentCallback;
-import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentListCallback;
+import net.osdn.gokigen.gr2control.camera.playback.ICameraContentListCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
 import net.osdn.gokigen.gr2control.camera.playback.ProgressEvent;
@@ -17,6 +17,8 @@ import java.util.List;
 import java.util.Map;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import jp.co.olympus.camerakit.OLYCamera;
 import jp.co.olympus.camerakit.OLYCameraFileInfo;
 
@@ -38,7 +40,7 @@ public class OlyCameraPlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentList(@NonNull final IDownloadContentListCallback callback)
+    public void downloadContentList(@NonNull final ICameraContentListCallback callback)
     {
         try
         {
@@ -71,12 +73,12 @@ public class OlyCameraPlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void getContentInfo(@NonNull String path, @NonNull IContentInfoCallback callback)
+    public void getContentInfo(@Nullable String path, @NonNull String name, @NonNull IContentInfoCallback callback)
     {
         try
         {
             // ここは使っていないから何もしない
-            Log.v(TAG, "getContentInfo() : " + path);
+            Log.v(TAG, "getContentInfo() : " + name);
         }
         catch (Exception e)
         {
@@ -99,11 +101,11 @@ public class OlyCameraPlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentScreennail(@NonNull String path, @NonNull final IDownloadThumbnailImageCallback callback)
+    public void downloadContentScreennail(@Nullable String path, @NonNull String name, @NonNull final IDownloadThumbnailImageCallback callback)
     {
         try
         {
-            camera.downloadContentScreennail(path, new OLYCamera.DownloadImageCallback() {
+            camera.downloadContentScreennail(name, new OLYCamera.DownloadImageCallback() {
                 @Override
                 public void onProgress(OLYCamera.ProgressEvent progressEvent)
                 {
@@ -139,11 +141,11 @@ public class OlyCameraPlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentThumbnail(@NonNull String path, @NonNull final IDownloadThumbnailImageCallback callback)
+    public void downloadContentThumbnail(@Nullable String path, @NonNull String name, @NonNull final IDownloadThumbnailImageCallback callback)
     {
         try
         {
-            camera.downloadContentThumbnail(path, new OLYCamera.DownloadImageCallback() {
+            camera.downloadContentThumbnail(name, new OLYCamera.DownloadImageCallback() {
                 @Override
                 public void onProgress(OLYCamera.ProgressEvent progressEvent)
                 {
@@ -179,11 +181,11 @@ public class OlyCameraPlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContent(@NonNull String path, boolean isSmallSize, @NonNull final IDownloadContentCallback callback)
+    public void downloadContent(@Nullable String path,  @NonNull String name, boolean isSmallSize, @NonNull final IDownloadContentCallback callback)
     {
         try
         {
-            camera.downloadLargeContent(path, new OLYCamera.DownloadLargeContentCallback() {
+            camera.downloadLargeContent(name, new OLYCamera.DownloadLargeContentCallback() {
                 @Override
                 public void onProgress(byte[] bytes, OLYCamera.ProgressEvent progressEvent)
                 {
@@ -230,4 +232,16 @@ public class OlyCameraPlaybackControl implements IPlaybackControl
             callback.onErrorOccurred(e);
         }
     }
+
+    @Override
+    public void showPictureStarted()
+    {
+
+    }
+
+    @Override
+    public void showPictureFinished()
+    {
+
+    }
 }
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContent.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContent.java
new file mode 100644 (file)
index 0000000..fdfd28c
--- /dev/null
@@ -0,0 +1,18 @@
+package net.osdn.gokigen.gr2control.camera.playback;
+
+        import java.util.Date;
+
+public interface ICameraContent
+{
+    String getCameraId();
+    String getCardId();
+    String getContentPath();
+    String getContentName();
+    String getOriginalName();
+    boolean isRaw();
+    boolean isMovie();
+    boolean isDateValid();
+    boolean isContentNameValid();
+    Date getCapturedDate();
+    void setCapturedDate(Date date);
+}
@@ -4,8 +4,9 @@ import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
 
 import java.util.List;
 
-public interface IDownloadContentListCallback
+public interface ICameraContentListCallback
 {
     void onCompleted(List<ICameraFileInfo> contentList);
+    //void onCompleted(List<ICameraContent> contentList);
     void onErrorOccurred(Exception  e);
 }
index c0cc768..1dc9214 100644 (file)
@@ -4,6 +4,7 @@ package net.osdn.gokigen.gr2control.camera.playback;
 import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 /**
  *   画像再生・取得用インタフェース
@@ -12,11 +13,16 @@ import androidx.annotation.NonNull;
 public interface IPlaybackControl
 {
     String getRawFileSuffix();
-    void downloadContentList(@NonNull IDownloadContentListCallback callback);
-    void getContentInfo(@NonNull String  path, @NonNull IContentInfoCallback  callback);
+    void downloadContentList(@NonNull ICameraContentListCallback callback);
+    void getContentInfo(@Nullable String  path, @NonNull String  name, @NonNull IContentInfoCallback  callback);
+
     void updateCameraFileInfo(ICameraFileInfo info);
 
-    void downloadContentScreennail(@NonNull String  path, @NonNull IDownloadThumbnailImageCallback callback);
-    void downloadContentThumbnail(@NonNull String path, @NonNull IDownloadThumbnailImageCallback callback);
-    void downloadContent(@NonNull String  path, boolean isSmallSize, @NonNull IDownloadContentCallback callback);
+    void downloadContentScreennail(@Nullable String  path, @NonNull String  name, @NonNull IDownloadThumbnailImageCallback callback);
+    void downloadContentThumbnail(@Nullable String path, @NonNull String  name, @NonNull IDownloadThumbnailImageCallback callback);
+    void downloadContent(@Nullable String  path, @NonNull String  name, boolean isSmallSize, @NonNull IDownloadContentCallback callback);
+
+    void showPictureStarted();
+    void showPictureFinished();
+
 }
diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IProgressEvent.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IProgressEvent.java
new file mode 100644 (file)
index 0000000..5fb9fd7
--- /dev/null
@@ -0,0 +1,13 @@
+package net.osdn.gokigen.gr2control.camera.playback;
+
+public interface IProgressEvent
+{
+    float getProgress();
+    boolean isCancellable();
+    void requestCancellation();
+
+    interface CancelCallback
+    {
+        void requestCancellation();
+    }
+}
index 073a14e..8682faa 100644 (file)
@@ -6,7 +6,7 @@ import android.util.Log;
 import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
 import net.osdn.gokigen.gr2control.camera.playback.CameraFileInfo;
 import net.osdn.gokigen.gr2control.camera.playback.IContentInfoCallback;
-import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentListCallback;
+import net.osdn.gokigen.gr2control.camera.playback.ICameraContentListCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
@@ -21,6 +21,7 @@ import java.util.HashMap;
 import java.util.List;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 /**
  *
@@ -58,7 +59,7 @@ public class RicohGr2PlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentList(@NonNull IDownloadContentListCallback callback)
+    public void downloadContentList(@NonNull ICameraContentListCallback callback)
     {
         List<ICameraFileInfo> fileList = new ArrayList<>();
         String imageListurl = "http://192.168.0.1/v1/photos?limit=3000";
@@ -155,9 +156,9 @@ public class RicohGr2PlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void getContentInfo(@NonNull String path, @NonNull IContentInfoCallback callback)
+    public void getContentInfo(@Nullable String path, @NonNull String name, @NonNull IContentInfoCallback callback)
     {
-        String url = getPhotoUrl + path + "/info";
+        String url = getPhotoUrl + name + "/info";
         Log.v(TAG, "getContentInfo() GET URL : " + url);
         try
         {
@@ -174,11 +175,11 @@ public class RicohGr2PlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentScreennail(@NonNull String path, @NonNull IDownloadThumbnailImageCallback callback)
+    public void downloadContentScreennail(@Nullable String path, @NonNull String name, @NonNull IDownloadThumbnailImageCallback callback)
     {
         //Log.v(TAG, "downloadContentScreennail() : " + path);
         String suffix = "?size=view";
-        String url = getPhotoUrl + path + suffix;
+        String url = getPhotoUrl + name + suffix;
         Log.v(TAG, "downloadContentScreennail() GET URL : " + url);
         try
         {
@@ -194,15 +195,15 @@ public class RicohGr2PlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentThumbnail(@NonNull String path, @NonNull IDownloadThumbnailImageCallback callback)
+    public void downloadContentThumbnail(@Nullable String path, @NonNull String name, @NonNull IDownloadThumbnailImageCallback callback)
     {
         //Log.v(TAG, "downloadContentThumbnail() : " + path);
         String suffix = "?size=view";
-        if (path.contains(".JPG"))
+        if (name.contains(".JPG"))
         {
             suffix = "?size=thumb";
         }
-        String url = getPhotoUrl + path + suffix;
+        String url = getPhotoUrl + name + suffix;
         Log.v(TAG, "downloadContentThumbnail() GET URL : " + url);
         try
         {
@@ -219,15 +220,15 @@ public class RicohGr2PlaybackControl implements IPlaybackControl
    }
 
     @Override
-    public void downloadContent(@NonNull String  path, boolean isSmallSize, @NonNull final IDownloadContentCallback callback)
+    public void downloadContent(@Nullable String path, @NonNull String  name, boolean isSmallSize, @NonNull final IDownloadContentCallback callback)
     {
-        Log.v(TAG, "downloadContent() : " + path);
+        Log.v(TAG, "downloadContent() : " + name);
         String suffix = "?size=full";
         if (isSmallSize)
         {
             suffix = "?size=view";
         }
-        String url = getPhotoUrl + path + suffix;
+        String url = getPhotoUrl + name + suffix;
         Log.v(TAG, "downloadContent() GET URL : " + url);
         try
         {
@@ -255,4 +256,16 @@ public class RicohGr2PlaybackControl implements IPlaybackControl
             e.printStackTrace();
         }
     }
+
+    @Override
+    public void showPictureStarted()
+    {
+
+    }
+
+    @Override
+    public void showPictureFinished()
+    {
+
+    }
 }
index dedb489..44f0884 100644 (file)
@@ -2,7 +2,6 @@ package net.osdn.gokigen.gr2control.playback;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -38,7 +37,7 @@ import android.widget.ProgressBar;
 import net.osdn.gokigen.gr2control.R;
 import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
 import net.osdn.gokigen.gr2control.camera.ICameraRunMode;
-import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentListCallback;
+import net.osdn.gokigen.gr2control.camera.playback.ICameraContentListCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
 import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
 import net.osdn.gokigen.gr2control.playback.detail.ImageContentInfoEx;
@@ -291,7 +290,7 @@ public class ImageGridViewFragment extends Fragment
                contentList = null;
                Log.v(TAG, "refreshImpl() start");
 
-               playbackControl.downloadContentList(new IDownloadContentListCallback() {
+               playbackControl.downloadContentList(new ICameraContentListCallback() {
                        @Override
                        public void onCompleted(List<ICameraFileInfo> list) {
                                // Sort contents in chronological order (or alphabetical order).
@@ -755,7 +754,7 @@ public class ImageGridViewFragment extends Fragment
                        }
                        final Box box = new Box();
 
-                       playbackControl.downloadContentThumbnail(path, new IDownloadThumbnailImageCallback()
+                       playbackControl.downloadContentThumbnail(null, path, new IDownloadThumbnailImageCallback()
             {
                                @Override
                                public void onCompleted(final Bitmap thumbnail, Map<String, Object> metadata)
index e4f3afc..235a8d8 100644 (file)
@@ -422,7 +422,7 @@ public class ImagePagerViewFragment extends Fragment
             }
 
             // Download the image.
-            playbackControl.downloadContentScreennail(path, new IDownloadThumbnailImageCallback() {
+            playbackControl.downloadContentScreennail(null, path, new IDownloadThumbnailImageCallback() {
                 @Override
                                //public void onCompleted(final byte[] data, final Map<String, Object> metadata) {
                 public void onCompleted(final Bitmap bitmap, final Map<String, Object> metadata) {
index c3f9670..f0774c6 100644 (file)
@@ -154,7 +154,7 @@ public class MyContentDownloader implements IDownloadContentCallback
                 });
             }
             Log.v(TAG, "downloadContent : " + path + " (small: " + isSmallSize + ")");
-            playbackControl.downloadContent(path, isSmallSize, this);
+            playbackControl.downloadContent(null, path, isSmallSize, this);
         }
         catch (Exception ex)
         {
diff --git a/app/src/main/res/drawable/ic_broken_image_black_24dp.xml b/app/src/main/res/drawable/ic_broken_image_black_24dp.xml
new file mode 100644 (file)
index 0000000..8d563a9
--- /dev/null
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M21,5v6.59l-3,-3.01 -4,4.01 -4,-4 -4,4 -3,-3.01L3,5c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2zM18,11.42l3,3.01L21,19c0,1.1 -0.9,2 -2,2L5,21c-1.1,0 -2,-0.9 -2,-2v-6.58l3,2.99 4,-4 4,4 4,-3.99z"/>
+</vector>