OSDN Git Service

なんどか取得に失敗するのに対策中。
[gokigen/PKRemote.git] / app / src / main / java / net / osdn / gokigen / pkremote / camera / vendor / ptpip / wrapper / playback / PtpIpPlaybackControl.java
1 package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.playback;
2
3 import android.app.Activity;
4 import android.content.SharedPreferences;
5 import android.util.Log;
6
7 import androidx.preference.PreferenceManager;
8
9 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContentListCallback;
10 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraFileInfo;
11 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IContentInfoCallback;
12 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentCallback;
13 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentListCallback;
14 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadThumbnailImageCallback;
15 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IPlaybackControl;
16 import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.PtpIpInterfaceProvider;
17 import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommandPublisher;
18 import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.PtpIpCommandGeneric;
19 import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.specific.CanonRequestInnerDevelopStart;
20 import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor;
21
22 /**
23  *
24  *
25  */
26 public class PtpIpPlaybackControl implements IPlaybackControl
27 {
28     private final String TAG = toString();
29     private final Activity activity;
30     private final PtpIpInterfaceProvider provider;
31     private final PtpIpFullImageReceiver fullImageReceiver;
32     private final PtpIpSmallImageReceiver smallImageReciever;
33     private String raw_suffix = "CR2";
34     private boolean use_screennail_image = false;
35     private CanonImageObjectReceiver canonImageObjectReceiver;
36
37     public PtpIpPlaybackControl(Activity activity, PtpIpInterfaceProvider provider)
38     {
39         this.activity = activity;
40         this.provider = provider;
41         this.fullImageReceiver = new PtpIpFullImageReceiver(activity, provider.getCommandPublisher());
42         this.smallImageReciever = new PtpIpSmallImageReceiver(activity, provider.getCommandPublisher());
43         canonImageObjectReceiver = new CanonImageObjectReceiver(provider);
44
45         try
46         {
47             SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
48             raw_suffix = preferences.getString(IPreferencePropertyAccessor.CANON_RAW_SUFFIX, IPreferencePropertyAccessor.CANON_RAW_SUFFIX_DEFAULT_VALUE);
49             use_screennail_image = preferences.getBoolean(IPreferencePropertyAccessor.CANON_USE_SCREENNAIL_AS_SMALL, false);
50         }
51         catch (Exception e)
52         {
53             e.printStackTrace();
54         }
55     }
56
57     @Override
58     public String getRawFileSuffix()
59     {
60         return (raw_suffix);
61     }
62
63     @Override
64     public void downloadContentList(IDownloadContentListCallback callback)
65     {
66         // なにもしない。(未使用)
67     }
68
69     @Override
70     public void getContentInfo(String path, String name, IContentInfoCallback callback)
71     {
72         // showFileInformation
73
74     }
75
76     @Override
77     public void updateCameraFileInfo(ICameraFileInfo info)
78     {
79         //  なにもしない
80     }
81
82     @Override
83     public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
84     {
85         Log.v(TAG, " downloadContentScreennail() " + path);
86
87         if (!use_screennail_image)
88         {
89             // Thumbnail と同じ画像を表示する
90             downloadContentThumbnail(path, callback);
91             return;
92         }
93
94         try
95         {
96             int start = 0;
97             if (path.indexOf("/") == 0)
98             {
99                 start = 1;
100             }
101             final String indexStr = path.substring(start);
102             PtpIpImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
103             if (content != null)
104             {
105                 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
106                 //int storageId = content.getStorageId();
107                 int objectId = content.getId();
108                 // Log.v(TAG, "downloadContentThumbnail() " + indexStr + " [" + objectId + "] (" + storageId + ")");
109
110                 // 画像を取得する
111                 PtpIpScreennailImageReceiver receiver = new PtpIpScreennailImageReceiver(activity, objectId, publisher, callback);
112                 publisher.enqueueCommand(new CanonRequestInnerDevelopStart(receiver, objectId, true, objectId, objectId));   // 0x9141 : RequestInnerDevelopStart
113             }
114         }
115         catch (Exception e)
116         {
117             e.printStackTrace();
118         }
119     }
120
121     @Override
122     public void downloadContentThumbnail(String path, final IDownloadThumbnailImageCallback callback)
123     {
124         try
125         {
126             int start = 0;
127             if (path.indexOf("/") == 0)
128             {
129                 start = 1;
130             }
131             //String indexStr = path.substring(start, path.indexOf("."));
132             final String indexStr = path.substring(start);
133             //Log.v(TAG, "downloadContentThumbnail() : [" + path + "] " + indexStr);
134
135             PtpIpImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
136             if (content != null)
137             {
138                 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
139                 //int storageId = content.getStorageId();
140                 int objectId = content.getId();
141                 // Log.v(TAG, "downloadContentThumbnail() " + indexStr + " [" + objectId + "] (" + storageId + ")");
142                 publisher.enqueueCommand(new PtpIpCommandGeneric(new PtpIpThumbnailImageReceiver(activity, callback), objectId, false, 0, 0x910a, 8, objectId, 0x00032000));
143             }
144         }
145         catch (Exception e)
146         {
147             e.printStackTrace();
148         }
149     }
150
151     @Override
152     public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
153     {
154         try
155         {
156             int start = 0;
157             if (path.indexOf("/") == 0)
158             {
159                 start = 1;
160             }
161             final String indexStr = path.substring(start);
162             PtpIpImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
163             if (content != null)
164             {
165                 if (isSmallSize)
166                 {
167                     // スモールサイズの画像取得コマンド(シーケンス)を発行する
168                     smallImageReciever.issueCommand(content.getId(), callback);
169                 }
170                 else
171                 {
172                     // オリジナル画像の取得コマンド(シーケンス)を発行する
173                     fullImageReceiver.issueCommand(content.getId(), content.getOriginalSize(), callback);
174                 }
175             }
176         }
177         catch (Throwable e)
178         {
179             e.printStackTrace();
180         }
181     }
182
183     @Override
184     public void getCameraContentList(final ICameraContentListCallback callback)
185     {
186         if (callback == null)
187         {
188             return;
189         }
190
191         try
192         {
193             Thread thread = new Thread(new Runnable() {
194                 @Override
195                 public void run() {
196                     canonImageObjectReceiver.getCameraContents(callback);
197                 }
198             });
199             thread.start();
200         }
201         catch (Exception e)
202         {
203             e.printStackTrace();
204             callback.onErrorOccurred(e);
205         }
206     }
207
208     @Override
209     public void showPictureStarted()
210     {
211         try
212         {
213             Log.v(TAG, "   showPictureStarted() ");
214
215             IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
216             publisher.flushHoldQueue();
217             System.gc();
218         }
219         catch (Exception e)
220         {
221             e.printStackTrace();
222         }
223     }
224
225     @Override
226     public void showPictureFinished()
227     {
228         try
229         {
230             Log.v(TAG, "   showPictureFinished() ");
231
232             IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
233             publisher.flushHoldQueue();
234             System.gc();
235         }
236         catch (Exception e)
237         {
238             e.printStackTrace();
239         }
240     }
241
242 }