OSDN Git Service

無理やりサムネイルまで。
[gokigen/Gr2Control.git] / app / src / main / java / net / osdn / gokigen / gr2control / camera / fuji_x / wrapper / playback / FujiXPlaybackControl.java
1 package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.playback;
2
3 import android.app.Activity;
4 import android.util.Log;
5 import android.util.SparseArray;
6
7 import androidx.annotation.NonNull;
8 import androidx.annotation.Nullable;
9
10 import net.osdn.gokigen.gr2control.camera.ICameraFileInfo;
11 import net.osdn.gokigen.gr2control.camera.ICameraStatus;
12 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.FujiXInterfaceProvider;
13 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
14 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandPublisher;
15 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.GetFullImage;
16 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.GetImageInfo;
17 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.GetThumbNail;
18 import net.osdn.gokigen.gr2control.camera.playback.ICameraContent;
19 import net.osdn.gokigen.gr2control.camera.playback.IContentInfoCallback;
20 import net.osdn.gokigen.gr2control.camera.playback.IDownloadContentCallback;
21 import net.osdn.gokigen.gr2control.camera.playback.ICameraContentListCallback;
22 import net.osdn.gokigen.gr2control.camera.playback.IDownloadThumbnailImageCallback;
23 import net.osdn.gokigen.gr2control.camera.playback.IPlaybackControl;
24
25 import java.util.ArrayList;
26 import java.util.List;
27
28 import static net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXCameraProperties.IMAGE_FILE_COUNT_STR_ID;
29
30 public class FujiXPlaybackControl implements IPlaybackControl, IFujiXCommandCallback
31 {
32     private final String TAG = toString();
33     private final Activity activity;
34     private final FujiXInterfaceProvider provider;
35     //private List<ICameraContent> imageInfo;
36     private SparseArray<FujiXImageContentInfo> imageContentInfo;
37
38     private int indexNumber = 0;
39     private ICameraContentListCallback finishedCallback = null;
40
41     public FujiXPlaybackControl(Activity activity, FujiXInterfaceProvider provider)
42     {
43         this.activity = activity;
44         this.provider = provider;
45         this.imageContentInfo = new SparseArray<>();
46     }
47
48     @Override
49     public String getRawFileSuffix() {
50         return (null);
51     }
52
53     @Override
54     public void downloadContentList(@NonNull final ICameraContentListCallback callback)
55     {
56         try
57         {
58             Thread thread = new Thread(new Runnable() {
59                 @Override
60                 public void run() {
61                     getCameraContents(callback);
62                 }
63             });
64             thread.start();
65         }
66         catch (Exception e)
67         {
68             e.printStackTrace();
69             callback.onErrorOccurred(e);
70         }
71     }
72
73     @Override
74     public void getContentInfo(@Nullable String path, @NonNull String name, @NonNull IContentInfoCallback callback)
75     {
76         // showFileInformation
77
78     }
79
80     @Override
81     public void updateCameraFileInfo(ICameraFileInfo info)
82     {
83         //  なにもしない
84     }
85
86     @Override
87     public void downloadContentScreennail(@Nullable String path, @NonNull String name, @NonNull IDownloadThumbnailImageCallback callback)
88     {
89         // Thumbnail と同じ画像を表示する
90         downloadContentThumbnail(path, name, callback);
91     }
92
93     @Override
94     public void downloadContentThumbnail(@Nullable String path, @NonNull String name, @NonNull IDownloadThumbnailImageCallback callback)
95     {
96         try
97         {
98             int start = 0;
99             if (name.indexOf("/") == 0)
100             {
101                 start = 1;
102             }
103             Log.v(TAG, "downloadContentThumbnail() : " + path + " " + name);
104             int index = getIndexNumber(start, name);
105             if ((index > 0)&&(index <= imageContentInfo.size()))
106             {
107                 IFujiXCommandPublisher publisher = provider.getCommandPublisher();
108                 FujiXImageContentInfo contentInfo = imageContentInfo.get(index);
109                 if (!contentInfo.isReceived())
110                 {
111                     publisher.enqueueCommand(new GetImageInfo(index, index, contentInfo));
112                 }
113                 publisher.enqueueCommand(new GetThumbNail(index, new FujiXThumbnailImageReceiver(activity, callback)));
114             }
115         }
116         catch (Exception e)
117         {
118             e.printStackTrace();
119         }
120     }
121
122     @Override
123     public void downloadContent(@Nullable String path, @NonNull String name, boolean isSmallSize, @NonNull IDownloadContentCallback callback)
124     {
125         try
126         {
127             int start = 0;
128             if (name.indexOf("/") == 0)
129             {
130                 start = 1;
131             }
132             String indexStr = name.substring(start, name.indexOf("."));
133             Log.v(TAG, "FujiX::downloadContent() : " + path + " " + name + " " + indexStr);
134             int index = Integer.parseInt(indexStr);
135             //FujiXImageContentInfo contentInfo = imageContentInfo.get(index);   // 特にデータを更新しないから大丈夫か?
136             if ((index > 0)&&(index <= imageContentInfo.size()))
137             {
138                 IFujiXCommandPublisher publisher = provider.getCommandPublisher();
139                 publisher.enqueueCommand(new GetFullImage(index, new FujiXFullImageReceiver(callback)));
140             }
141         }
142         catch (Exception e)
143         {
144             e.printStackTrace();
145         }
146     }
147
148     private int getIndexNumber(int start, @NonNull String name)
149     {
150         String indexStr = name.substring(start, name.indexOf("."));
151         int indexNo = -1;
152         try
153         {
154             indexNo = Integer.parseInt(indexStr);
155         }
156         catch (Exception e)
157         {
158             //e.printStackTrace();
159         }
160         if (indexNo >= 0)
161         {
162             return (indexNo);
163         }
164         indexStr = name.substring(start);
165         int size = imageContentInfo.size();
166         for (int index = 0; index < size; index++)
167         {
168             FujiXImageContentInfo info = imageContentInfo.valueAt(index);
169             String contentName = info.getOriginalName();
170             if (indexStr.matches(contentName))
171             {
172                 return (info.getId());
173             }
174             Log.v(TAG, " contentName : " + contentName);
175         }
176         Log.v(TAG, "index is not found : " + name + " " + indexStr);
177         return (-1);
178     }
179
180     @Override
181     public void showPictureStarted()
182     {
183
184     }
185
186     @Override
187     public void showPictureFinished()
188     {
189
190     }
191
192     private void getCameraContents(ICameraContentListCallback callback)
193     {
194         int nofFiles = -1;
195         try {
196             finishedCallback = callback;
197             ICameraStatus statusListHolder = provider.getCameraStatusListHolder();
198             if (statusListHolder != null) {
199                 String count = statusListHolder.getStatus(IMAGE_FILE_COUNT_STR_ID);
200                 nofFiles = Integer.parseInt(count);
201                 Log.v(TAG, "getCameraContents() : " + nofFiles + " (" + count + ")");
202             }
203             Log.v(TAG, "getCameraContents() : DONE.");
204             if (nofFiles > 0)
205             {
206                 // 件数ベースで取得する(情報は、後追いで反映させる...この方式だと、キューに積みまくってるが、、、)
207                 checkImageFiles(nofFiles);
208             }
209             else
210             {
211                 // 件数が不明だったら、1件づつインデックスの情報を取得する
212                 checkImageFileAll();
213             }
214         }
215         catch (Exception e)
216         {
217             e.printStackTrace();
218             finishedCallback.onErrorOccurred(e);
219             finishedCallback = null;
220         }
221     }
222
223     /**
224      *   最初から取得可能なイメージ情報を(件数ベースで)取得する
225      *
226      */
227     private void checkImageFiles(int nofFiles)
228     {
229         try
230         {
231             imageContentInfo.clear();
232             //IFujiXCommandPublisher publisher = provider.getCommandPublisher();
233             //for (int index = nofFiles; index > 0; index--)
234             for (int index = 1; index <= nofFiles; index++)
235             {
236                 // ファイル数分、仮のデータを生成する
237                 imageContentInfo.append(index, new FujiXImageContentInfo(index, null));
238
239                 //ファイル名などを取得する (メッセージを積んでおく...でも遅くなるので、ここではやらない方がよいかな。)
240                 //publisher.enqueueCommand(new GetImageInfo(index, index, info));
241             }
242
243             // インデックスデータがなくなったことを検出...データがそろったとして応答する。
244             Log.v(TAG, "IMAGE LIST : " + imageContentInfo.size() + " (" + nofFiles + ")");
245             finishedCallback.onCompleted(getCameraFileInfoList());
246             finishedCallback = null;
247         }
248         catch (Exception e)
249         {
250             e.printStackTrace();
251         }
252     }
253
254     /**
255      *   最初から取得可能なイメージ情報をすべて取得する
256      *
257      */
258     private void checkImageFileAll()
259     {
260         try
261         {
262             imageContentInfo.clear();
263             indexNumber = 1;
264             IFujiXCommandPublisher publisher = provider.getCommandPublisher();
265             publisher.enqueueCommand(new GetImageInfo(indexNumber, indexNumber, this));
266         }
267         catch (Exception e)
268         {
269             e.printStackTrace();
270         }
271     }
272
273     @Override
274     public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
275     {
276         Log.v(TAG, " " + currentBytes + "/" + totalBytes);
277     }
278
279     @Override
280     public boolean isReceiveMulti()
281     {
282         return (false);
283     }
284
285     @Override
286     public void receivedMessage(int id, byte[] rx_body)
287     {
288         // イメージ数の一覧が取得できなかった場合にここで作る。
289         if (rx_body.length < 16)
290         {
291             // インデックスデータがなくなったことを検出...データがそろったとして応答する。
292             Log.v(TAG, "IMAGE LIST : " + imageContentInfo.size());
293             finishedCallback.onCompleted(getCameraFileInfoList());
294             finishedCallback = null;
295             return;
296         }
297         try
298         {
299             Log.v(TAG, "RECEIVED IMAGE INFO : " + indexNumber);
300
301             // 受信データを保管しておく
302             imageContentInfo.append(indexNumber, new FujiXImageContentInfo(indexNumber, rx_body));
303
304             // 次のインデックスの情報を要求する
305             indexNumber++;
306             IFujiXCommandPublisher publisher = provider.getCommandPublisher();
307             publisher.enqueueCommand(new GetImageInfo(indexNumber, indexNumber, this));
308         }
309         catch (Exception e)
310         {
311             // エラーになったら、そこで終了にする
312             e.printStackTrace();
313             finishedCallback.onCompleted(getCameraFileInfoList());
314             finishedCallback = null;
315         }
316     }
317
318     private List<ICameraContent> getCameraContentList()
319     {
320         /// ダサいけど...コンテナクラスを詰め替えて応答する
321         List<ICameraContent> contentList = new ArrayList<>();
322         int listSize = imageContentInfo.size();
323         for(int index = 0; index < listSize; index++)
324         {
325             contentList.add(imageContentInfo.valueAt(index));
326         }
327         return (contentList);
328     }
329
330     private List<ICameraFileInfo> getCameraFileInfoList()
331     {
332         List<ICameraFileInfo> fileInfoList = new ArrayList<>();
333         try
334         {
335             int listSize = imageContentInfo.size();
336             for(int index = 0; index < listSize; index++)
337             {
338                 FujiXImageContentInfo info = imageContentInfo.valueAt(index);
339                 fileInfoList.add(info.getCameraFileInfo());
340             }
341         }
342         catch (Exception e)
343         {
344             e.printStackTrace();
345         }
346         return (fileInfoList);
347     }
348
349 }