1 package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.playback;
3 import android.content.SharedPreferences;
4 import android.graphics.Color;
5 import android.util.Log;
7 import androidx.appcompat.app.AppCompatActivity;
8 import androidx.preference.PreferenceManager;
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;
29 public class CanonPlaybackControl implements IPlaybackControl
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;
41 public CanonPlaybackControl(AppCompatActivity activity, PtpIpInterfaceProvider provider)
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);
51 delayMs = Integer.parseInt(preferences.getString(IPreferencePropertyAccessor.CANON_RECEIVE_WAIT, IPreferencePropertyAccessor.CANON_RECEIVE_WAIT_DEFAULT_VALUE));
59 delayMs = 10; // 最短は 10msにする
63 smallImageSequence = Integer.parseInt(preferences.getString(IPreferencePropertyAccessor.CANON_SMALL_PICTURE_TYPE, IPreferencePropertyAccessor.CANON_SMALL_PICTURE_TYPE_DEFAULT_VALUE));
74 this.activity = activity;
75 this.provider = provider;
76 this.fullImageReceiver = new CanonFullImageReceiver(activity, provider.getCommandPublisher());
77 if (smallImageSequence == 2)
79 this.smallImageReciever = new CanonFullImageReceiver(activity, provider.getCommandPublisher());
81 else if (smallImageSequence == 3)
83 this.smallImageReciever = new CanonImageReceiver(activity, provider.getCommandPublisher(), smallImageSequence);
87 this.smallImageReciever = new CanonImageReceiver(activity, provider.getCommandPublisher(), smallImageSequence);
89 canonImageObjectReceiver = new CanonImageObjectReceiver(provider, delayMs);
93 public String getRawFileSuffix()
99 public void downloadContentList(IDownloadContentListCallback callback)
105 public void getContentInfo(String path, String name, IContentInfoCallback callback)
107 // showFileInformation
112 public void updateCameraFileInfo(ICameraFileInfo info)
118 public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
120 Log.v(TAG, " downloadContentScreennail() " + path);
122 if (!useScreennailImage)
124 // Thumbnail と同じ画像を表示する
125 downloadContentThumbnail(path, callback);
132 if (path.indexOf("/") == 0)
136 final String indexStr = path.substring(start);
137 CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
140 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
141 //int storageId = content.getStorageId();
142 int objectId = content.getId();
144 // 画像表示中...のメッセージを表示する
145 IInformationReceiver display = provider.getInformationReceiver();
148 String message = activity.getString(R.string.canon_get_image_screennail);
149 display.updateMessage(message, false, true, Color.LTGRAY);
153 CanonScreennailImageReceiver receiver = new CanonScreennailImageReceiver(activity, objectId, publisher, callback);
154 if (smallImageSequence == 1)
156 publisher.enqueueCommand(new CanonRequestInnerDevelopStart(receiver, objectId, true, objectId, objectId, 0x06, 0x02)); // 0x9141 : RequestInnerDevelopStart
160 publisher.enqueueCommand(new CanonRequestInnerDevelopStart(receiver, objectId, true, objectId, objectId, 0x0f, 0x02)); // 0x9141 : RequestInnerDevelopStart
171 public void downloadContentThumbnail(String path, final IDownloadThumbnailImageCallback callback)
176 if (path.indexOf("/") == 0)
181 final String indexStr = path.substring(start);
182 CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
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));
197 public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
202 if (path.indexOf("/") == 0)
206 final String indexStr = path.substring(start);
207 CanonImageContentInfo content = canonImageObjectReceiver.getContentObject(indexStr);
212 // スモールサイズの画像取得コマンド(シーケンス)を発行する
213 smallImageReciever.issueCommand(content.getId(), content.getOriginalSize(), callback);
217 // オリジナル画像の取得コマンド(シーケンス)を発行する
218 fullImageReceiver.issueCommand(content.getId(), content.getOriginalSize(), callback);
229 public void getCameraContentList(final ICameraContentListCallback callback)
231 if (callback == null)
237 Thread thread = new Thread(() -> canonImageObjectReceiver.getCameraContents(callback));
243 callback.onErrorOccurred(e);
248 public void showPictureStarted()
252 Log.v(TAG, " showPictureStarted() ");
253 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
254 publisher.flushHoldQueue();
264 public void showPictureFinished()
268 Log.v(TAG, " showPictureFinished() ");
269 IPtpIpCommandPublisher publisher = provider.getCommandPublisher();
270 publisher.flushHoldQueue();