OSDN Git Service

PTPIP系の接続シーケンスで、IPアドレスの特定タイミングを変更する。
[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.content.SharedPreferences;
4 import android.graphics.Color;
5 import android.util.Log;
6
7 import androidx.appcompat.app.AppCompatActivity;
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 AppCompatActivity activity;
33     private final PtpIpInterfaceProvider provider;
34     private final CanonFullImageReceiver fullImageReceiver;
35     private final ICanonImageReceiver 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(AppCompatActivity 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 CanonFullImageReceiver(activity, provider.getCommandPublisher());
80         }
81         else if (smallImageSequence == 3)
82         {
83             this.smallImageReciever = new CanonImageReceiver(activity, provider.getCommandPublisher(), smallImageSequence);
84         }
85         else
86         {
87             this.smallImageReciever = new CanonImageReceiver(activity, provider.getCommandPublisher(), smallImageSequence);
88         }
89         canonImageObjectReceiver = new CanonImageObjectReceiver(provider, delayMs);
90     }
91
92     @Override
93     public String getRawFileSuffix()
94     {
95         return (raw_suffix);
96     }
97
98     @Override
99     public void downloadContentList(IDownloadContentListCallback callback)
100     {
101         // なにもしない。(未使用)
102     }
103
104     @Override
105     public void getContentInfo(String path, String name, IContentInfoCallback callback)
106     {
107         // showFileInformation
108
109     }
110
111     @Override
112     public void updateCameraFileInfo(ICameraFileInfo info)
113     {
114         //  なにもしない
115     }
116
117     @Override
118     public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
119     {
120         Log.v(TAG, " downloadContentScreennail() " + path);
121
122         if (!useScreennailImage)
123         {
124             // Thumbnail と同じ画像を表示する
125             downloadContentThumbnail(path, callback);
126             return;
127         }
128
129         try
130         {
131             int start = 0;
132             if (path.indexOf("/") == 0)
133             {
134                 start = 1;
135             }
136             final String indexStr = path.substring(start);
137             CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
138             if (content != null)
139             {
140                 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
141                 //int storageId = content.getStorageId();
142                 int objectId = content.getId();
143
144                 // 画像表示中...のメッセージを表示する
145                 IInformationReceiver display = provider.getInformationReceiver();
146                 if (display != null)
147                 {
148                     String message = activity.getString(R.string.canon_get_image_screennail);
149                     display.updateMessage(message, false, true, Color.LTGRAY);
150                 }
151
152                 // 画像を取得する
153                 CanonScreennailImageReceiver receiver = new CanonScreennailImageReceiver(activity, objectId, publisher, callback);
154                 if (smallImageSequence == 1)
155                 {
156                     publisher.enqueueCommand(new CanonRequestInnerDevelopStart(receiver, objectId, true, objectId, objectId, 0x06, 0x02));   // 0x9141 : RequestInnerDevelopStart
157                 }
158                 else
159                 {
160                     publisher.enqueueCommand(new CanonRequestInnerDevelopStart(receiver, objectId, true, objectId, objectId, 0x0f, 0x02));   // 0x9141 : RequestInnerDevelopStart
161                 }
162             }
163         }
164         catch (Exception e)
165         {
166             e.printStackTrace();
167         }
168     }
169
170     @Override
171     public void downloadContentThumbnail(String path, final IDownloadThumbnailImageCallback callback)
172     {
173         try
174         {
175             int start = 0;
176             if (path.indexOf("/") == 0)
177             {
178                 start = 1;
179             }
180
181             final String indexStr = path.substring(start);
182             CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
183             if (content != null)
184             {
185                 int objectId = content.getId();
186                 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
187                 publisher.enqueueCommand(new PtpIpCommandGeneric(new PtpIpThumbnailImageReceiver(activity, callback), objectId, false, 0, 0x910a, 8, objectId, 0x00032000));
188             }
189         }
190         catch (Exception e)
191         {
192             e.printStackTrace();
193         }
194     }
195
196     @Override
197     public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
198     {
199         try
200         {
201             int start = 0;
202             if (path.indexOf("/") == 0)
203             {
204                 start = 1;
205             }
206             final String indexStr = path.substring(start);
207             CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
208             if (content != null)
209             {
210                 if (isSmallSize)
211                 {
212                     // スモールサイズの画像取得コマンド(シーケンス)を発行する
213                     smallImageReciever.issueCommand(content.getId(), content.getOriginalSize(), callback);
214                 }
215                 else
216                 {
217                     // オリジナル画像の取得コマンド(シーケンス)を発行する
218                     fullImageReceiver.issueCommand(content.getId(), content.getOriginalSize(), callback);
219                 }
220             }
221         }
222         catch (Throwable e)
223         {
224             e.printStackTrace();
225         }
226     }
227
228     @Override
229     public void getCameraContentList(final ICameraContentListCallback callback)
230     {
231         if (callback == null)
232         {
233             return;
234         }
235         try
236         {
237             Thread thread = new Thread(() -> canonImageObjectReceiver.getCameraContents(callback));
238             thread.start();
239         }
240         catch (Exception e)
241         {
242             e.printStackTrace();
243             callback.onErrorOccurred(e);
244         }
245     }
246
247     @Override
248     public void showPictureStarted()
249     {
250         try
251         {
252             Log.v(TAG, "   showPictureStarted() ");
253             IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
254             publisher.flushHoldQueue();
255             System.gc();
256         }
257         catch (Exception e)
258         {
259             e.printStackTrace();
260         }
261     }
262
263     @Override
264     public void showPictureFinished()
265     {
266         try
267         {
268             Log.v(TAG, "   showPictureFinished() ");
269             IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
270             publisher.flushHoldQueue();
271             System.gc();
272         }
273         catch (Exception e)
274         {
275             e.printStackTrace();
276         }
277     }
278 }