From 837478b71120c4ecd6899fa1c60be107e2728854 Mon Sep 17 00:00:00 2001 From: MRSa Date: Thu, 23 Apr 2020 23:23:39 +0900 Subject: [PATCH] =?utf8?q?Fuji=E5=AF=BE=E5=BF=9C=E3=80=82=E4=BB=8A?= =?utf8?q?=E5=BA=A6=E3=81=AF=E8=A1=A8=E7=A4=BA=E5=81=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../fuji_x/wrapper/FujiXInterfaceProvider.java | 3 +- .../fuji_x/wrapper/FujiXPlaybackControl.java | 65 ----- .../wrapper/playback/FujiXFullImageReceiver.java | 64 +++++ .../wrapper/playback/FujiXImageContentInfo.java | 225 +++++++++++++++ .../wrapper/playback/FujiXPlaybackControl.java | 318 +++++++++++++++++++++ .../playback/FujiXThumbnailImageReceiver.java | 61 ++++ .../wrapper/playback/OlyCameraPlaybackControl.java | 34 ++- .../gr2control/camera/playback/ICameraContent.java | 18 ++ ...llback.java => ICameraContentListCallback.java} | 3 +- .../camera/playback/IPlaybackControl.java | 16 +- .../gr2control/camera/playback/IProgressEvent.java | 13 + .../ricohgr2/wrapper/RicohGr2PlaybackControl.java | 37 ++- .../gr2control/playback/ImageGridViewFragment.java | 7 +- .../playback/detail/ImagePagerViewFragment.java | 2 +- .../playback/detail/MyContentDownloader.java | 2 +- .../res/drawable/ic_broken_image_black_24dp.xml | 9 + 16 files changed, 777 insertions(+), 100 deletions(-) delete mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXPlaybackControl.java create mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXFullImageReceiver.java create mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXImageContentInfo.java create mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXPlaybackControl.java create mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXThumbnailImageReceiver.java create mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContent.java rename app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/{IDownloadContentListCallback.java => ICameraContentListCallback.java} (70%) create mode 100644 app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IProgressEvent.java create mode 100644 app/src/main/res/drawable/ic_broken_image_black_24dp.xml diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXInterfaceProvider.java index 53954fb..4467416 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXInterfaceProvider.java @@ -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 index 5ce5920..0000000 --- a/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/FujiXPlaybackControl.java +++ /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 index 0000000..8dfd166 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXFullImageReceiver.java @@ -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 index 0000000..ebf4fda --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXImageContentInfo.java @@ -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 index 0000000..559712c --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXPlaybackControl.java @@ -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 imageInfo; + private SparseArray 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 getCameraContentList() + { + /// ダサいけど...コンテナクラスを詰め替えて応答する + List contentList = new ArrayList<>(); + int listSize = imageContentInfo.size(); + for(int index = 0; index < listSize; index++) + { + contentList.add(imageContentInfo.valueAt(index)); + } + return (contentList); + } + + private List getCameraFileInfoList() + { + List 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 index 0000000..04e658e --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/fuji_x/wrapper/playback/FujiXThumbnailImageReceiver.java @@ -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); + } +} diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/olympus/wrapper/playback/OlyCameraPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/olympus/wrapper/playback/OlyCameraPlaybackControl.java index 677f442..fc10e1b 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/camera/olympus/wrapper/playback/OlyCameraPlaybackControl.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/olympus/wrapper/playback/OlyCameraPlaybackControl.java @@ -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 index 0000000..fdfd28c --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContent.java @@ -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); +} diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IDownloadContentListCallback.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContentListCallback.java similarity index 70% rename from app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IDownloadContentListCallback.java rename to app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContentListCallback.java index 464e31e..33069b2 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IDownloadContentListCallback.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/ICameraContentListCallback.java @@ -4,8 +4,9 @@ import net.osdn.gokigen.gr2control.camera.ICameraFileInfo; import java.util.List; -public interface IDownloadContentListCallback +public interface ICameraContentListCallback { void onCompleted(List contentList); + //void onCompleted(List contentList); void onErrorOccurred(Exception e); } diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IPlaybackControl.java index c0cc768..1dc9214 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IPlaybackControl.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IPlaybackControl.java @@ -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 index 0000000..5fb9fd7 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/playback/IProgressEvent.java @@ -0,0 +1,13 @@ +package net.osdn.gokigen.gr2control.camera.playback; + +public interface IProgressEvent +{ + float getProgress(); + boolean isCancellable(); + void requestCancellation(); + + interface CancelCallback + { + void requestCancellation(); + } +} diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/camera/ricohgr2/wrapper/RicohGr2PlaybackControl.java b/app/src/main/java/net/osdn/gokigen/gr2control/camera/ricohgr2/wrapper/RicohGr2PlaybackControl.java index 073a14e..8682faa 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/camera/ricohgr2/wrapper/RicohGr2PlaybackControl.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/camera/ricohgr2/wrapper/RicohGr2PlaybackControl.java @@ -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 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() + { + + } } diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/playback/ImageGridViewFragment.java b/app/src/main/java/net/osdn/gokigen/gr2control/playback/ImageGridViewFragment.java index dedb489..44f0884 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/playback/ImageGridViewFragment.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/playback/ImageGridViewFragment.java @@ -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 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 metadata) diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/ImagePagerViewFragment.java b/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/ImagePagerViewFragment.java index e4f3afc..235a8d8 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/ImagePagerViewFragment.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/ImagePagerViewFragment.java @@ -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 metadata) { public void onCompleted(final Bitmap bitmap, final Map metadata) { diff --git a/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/MyContentDownloader.java b/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/MyContentDownloader.java index c3f9670..f0774c6 100644 --- a/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/MyContentDownloader.java +++ b/app/src/main/java/net/osdn/gokigen/gr2control/playback/detail/MyContentDownloader.java @@ -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 index 0000000..8d563a9 --- /dev/null +++ b/app/src/main/res/drawable/ic_broken_image_black_24dp.xml @@ -0,0 +1,9 @@ + + + -- 2.11.0