OSDN Git Service

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