OSDN Git Service

bf250b792e26aa63abaed32d805fad4a41e7aab7
[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
40     public CanonPlaybackControl(Activity activity, PtpIpInterfaceProvider provider)
41     {
42         int smallImageSequence = 0;
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                 publisher.enqueueCommand(new CanonRequestInnerDevelopStart(receiver, objectId, true, objectId, objectId, 0x0f, 0x02));   // 0x9141 : RequestInnerDevelopStart
151             }
152         }
153         catch (Exception e)
154         {
155             e.printStackTrace();
156         }
157     }
158
159     @Override
160     public void downloadContentThumbnail(String path, final IDownloadThumbnailImageCallback callback)
161     {
162         try
163         {
164             int start = 0;
165             if (path.indexOf("/") == 0)
166             {
167                 start = 1;
168             }
169
170             final String indexStr = path.substring(start);
171             CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
172             if (content != null)
173             {
174                 int objectId = content.getId();
175                 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
176                 publisher.enqueueCommand(new PtpIpCommandGeneric(new PtpIpThumbnailImageReceiver(activity, callback), objectId, false, 0, 0x910a, 8, objectId, 0x00032000));
177             }
178         }
179         catch (Exception e)
180         {
181             e.printStackTrace();
182         }
183     }
184
185     @Override
186     public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
187     {
188         try
189         {
190             int start = 0;
191             if (path.indexOf("/") == 0)
192             {
193                 start = 1;
194             }
195             final String indexStr = path.substring(start);
196             CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
197             if (content != null)
198             {
199                 if (isSmallSize)
200                 {
201                     // スモールサイズの画像取得コマンド(シーケンス)を発行する
202                     smallImageReciever.issueCommand(content.getId(), callback);
203                 }
204                 else
205                 {
206                     // オリジナル画像の取得コマンド(シーケンス)を発行する
207                     fullImageReceiver.issueCommand(content.getId(), content.getOriginalSize(), callback);
208                 }
209             }
210         }
211         catch (Throwable e)
212         {
213             e.printStackTrace();
214         }
215     }
216
217     @Override
218     public void getCameraContentList(final ICameraContentListCallback callback)
219     {
220         if (callback == null)
221         {
222             return;
223         }
224         try
225         {
226             Thread thread = new Thread(new Runnable() {
227                 @Override
228                 public void run() {
229                     canonImageObjectReceiver.getCameraContents(callback);
230                 }
231             });
232             thread.start();
233         }
234         catch (Exception e)
235         {
236             e.printStackTrace();
237             callback.onErrorOccurred(e);
238         }
239     }
240
241     @Override
242     public void showPictureStarted()
243     {
244         try
245         {
246             Log.v(TAG, "   showPictureStarted() ");
247             IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
248             publisher.flushHoldQueue();
249             System.gc();
250         }
251         catch (Exception e)
252         {
253             e.printStackTrace();
254         }
255     }
256
257     @Override
258     public void showPictureFinished()
259     {
260         try
261         {
262             Log.v(TAG, "   showPictureFinished() ");
263             IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
264             publisher.flushHoldQueue();
265             System.gc();
266         }
267         catch (Exception e)
268         {
269             e.printStackTrace();
270         }
271     }
272 }