From 3c410f361c94625686fa8b4718b48cd3d4edf8ce Mon Sep 17 00:00:00 2001 From: MRSa Date: Sat, 5 Aug 2023 14:59:47 +0900 Subject: [PATCH] =?utf8?q?PTPIP=E7=B3=BB=E3=81=AE=E6=8E=A5=E7=B6=9A?= =?utf8?q?=E3=82=B7=E3=83=BC=E3=82=B1=E3=83=B3=E3=82=B9=E3=81=A7=E3=80=81I?= =?utf8?q?P=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=81=AE=E7=89=B9=E5=AE=9A?= =?utf8?q?=E3=82=BF=E3=82=A4=E3=83=9F=E3=83=B3=E3=82=B0=E3=82=92=E5=A4=89?= =?utf8?q?=E6=9B=B4=E3=81=99=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../vendor/nikon/INikonInterfaceProvider.java | 4 + .../nikon/wrapper/NikonInterfaceProvider.java | 130 +++++++++++++++------ .../nikon/wrapper/status/NikonStatusChecker.java | 35 +++--- .../vendor/ptpip/IPtpIpInterfaceProvider.java | 4 + .../ptpip/wrapper/PtpIpInterfaceProvider.java | 57 +++++---- .../ptpip/wrapper/command/IPtpIpCommunication.java | 4 +- .../command/PtpIpAsyncResponseReceiver.java | 37 +++--- .../ptpip/wrapper/command/PtpIpCommandPublisher.kt | 47 ++++---- .../wrapper/command/PtpIpCommandPublisher0.java | 53 ++++----- .../CanonCameraConnectSequenceForPlayback.java | 79 +++++-------- .../CanonCameraConnectSequenceForPlaybackType1.kt | 15 ++- .../connection/CanonCameraDisconnectSequence.java | 6 +- .../ptpip/wrapper/connection/CanonConnection.java | 71 +++++------ .../NikonCameraConnectSequenceForPlayback.java | 68 ++++------- .../ptpip/wrapper/connection/NikonConnection.java | 60 ++++------ .../wrapper/liveview/PtpIpLiveViewControl.java | 50 ++++---- .../ptpip/wrapper/playback/CanonImageReceiver.kt | 64 +++++----- .../wrapper/playback/CanonPlaybackControl.java | 13 +-- .../ptpip/wrapper/status/PtpIpStatusChecker.java | 36 +++--- .../ptpip/wrapper/status/PtpIpStatusHolder.java | 4 +- 20 files changed, 415 insertions(+), 422 deletions(-) diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/INikonInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/INikonInterfaceProvider.java index 8380910..8f823ec 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/INikonInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/INikonInterfaceProvider.java @@ -54,4 +54,8 @@ public interface INikonInterfaceProvider IInformationReceiver getInformationReceiver(); void setAsyncEventReceiver(@NonNull IPtpIpCommandCallback receiver); + + String getIpAddress(); + int getControlPortNumber(); + int getEventPortNumber(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/NikonInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/NikonInterfaceProvider.java index d4ecb6a..0c688a6 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/NikonInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/NikonInterfaceProvider.java @@ -1,10 +1,16 @@ package net.osdn.gokigen.pkremote.camera.vendor.nikon.wrapper; -import android.app.Activity; +import android.content.Context; import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.LinkProperties; +import android.net.Network; +import android.net.RouteInfo; +import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; import net.osdn.gokigen.pkremote.IInformationReceiver; @@ -42,9 +48,10 @@ import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.PtpIpComman import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection.NikonConnection; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.liveview.PtpIpLiveViewControl; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.status.IPtpIpRunModeHolder; +import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor; -import static net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor.NIKON_CAMERA_IP_ADDRESS; -import static net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor.NIKON_CAMERA_IP_ADDRESS_DEFAULT_VALUE; +import java.net.InetAddress; +import java.util.List; public class NikonInterfaceProvider implements INikonInterfaceProvider, IDisplayInjector { @@ -54,51 +61,88 @@ public class NikonInterfaceProvider implements INikonInterfaceProvider, IDisplay private static final int ASYNC_RESPONSE_PORT = 15741; // ?? private static final int CONTROL_PORT = 15740; private static final int EVENT_PORT = 15740; - private static final String DEFAULT_CAMERA_IP_ADDR = "192.168.1.1"; - private final Activity activity; - private final PtpIpRunMode runmode; + private final AppCompatActivity activity; + private final PtpIpRunMode runMode; private final PtpIpHardwareStatus hardwareStatus; - private PtpIpButtonControl ptpIpButtonControl; - private NikonConnection nikonConnection; - private PtpIpCommandPublisher0 commandPublisher; - private PtpIpLiveViewControl liveViewControl; - private PtpIpAsyncResponseReceiver asyncReceiver; - private PtpIpZoomControl zoomControl; + private final PtpIpButtonControl ptpIpButtonControl; + private final NikonConnection nikonConnection; + private final PtpIpCommandPublisher0 commandPublisher; + private final PtpIpLiveViewControl liveViewControl; + private final PtpIpAsyncResponseReceiver asyncReceiver; + private final PtpIpZoomControl zoomControl; //private PtpIpCaptureControl captureControl; //private PtpIpFocusingControl focusingControl; - private NikonStatusChecker statusChecker; - private ICameraStatusUpdateNotify statusListener; - private NikonPlaybackControl playbackControl; - private IInformationReceiver informationReceiver; + private final NikonStatusChecker statusChecker; + private final ICameraStatusUpdateNotify statusListener; + private final NikonPlaybackControl playbackControl; + private final IInformationReceiver informationReceiver; - public NikonInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull ICameraStatusUpdateNotify statusListener, @NonNull IInformationReceiver informationReceiver) + public NikonInterfaceProvider(@NonNull AppCompatActivity context, @NonNull ICameraStatusReceiver provider, @NonNull ICameraStatusUpdateNotify statusListener, @NonNull IInformationReceiver informationReceiver) { this.activity = context; - String ipAddress = DEFAULT_CAMERA_IP_ADDR; - try - { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity); - ipAddress = preferences.getString(NIKON_CAMERA_IP_ADDRESS, NIKON_CAMERA_IP_ADDRESS_DEFAULT_VALUE); - } - catch (Exception e) - { - e.printStackTrace(); - } - commandPublisher = new PtpIpCommandPublisher0(ipAddress, CONTROL_PORT); - liveViewControl = new PtpIpLiveViewControl(context, ipAddress, STREAM_PORT); - asyncReceiver = new PtpIpAsyncResponseReceiver(ipAddress, ASYNC_RESPONSE_PORT); - statusChecker = new NikonStatusChecker(activity, commandPublisher, ipAddress, EVENT_PORT); + commandPublisher = new PtpIpCommandPublisher0(); + liveViewControl = new PtpIpLiveViewControl(context, false); + asyncReceiver = new PtpIpAsyncResponseReceiver(); + statusChecker = new NikonStatusChecker(activity, this); nikonConnection = new NikonConnection(context, provider, this, statusChecker); zoomControl = new PtpIpZoomControl(); this.statusListener = statusListener; - this.runmode = new PtpIpRunMode(); + this.runMode = new PtpIpRunMode(); this.hardwareStatus = new PtpIpHardwareStatus(); this.ptpIpButtonControl = new PtpIpButtonControl(); this.playbackControl = new NikonPlaybackControl(activity, this); this.informationReceiver = informationReceiver; } + private String getHostAddress(@NonNull AppCompatActivity context) + { + String ipAddress = IPreferencePropertyAccessor.NIKON_CAMERA_IP_ADDRESS; + try + { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + boolean autoDetactHostIp = preferences.getBoolean(IPreferencePropertyAccessor.NIKON_AUTO_DETECT_HOST_IP, true); + ipAddress = preferences.getString(IPreferencePropertyAccessor.NIKON_CAMERA_IP_ADDRESS, IPreferencePropertyAccessor.NIKON_CAMERA_IP_ADDRESS); + if ((autoDetactHostIp)&&(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) + { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + Network activeNetwork = connectivityManager.getActiveNetwork(); + if (activeNetwork == null) + { + return (ipAddress); + } + LinkProperties linkProperties = connectivityManager.getLinkProperties(activeNetwork); + if (linkProperties == null) + { + return (ipAddress); + } + List routes = linkProperties.getRoutes(); + for (RouteInfo route: routes) + { + try + { + InetAddress gateway = route.getGateway(); + if ((route.isDefaultRoute())&&(gateway != null)) + { + ipAddress = gateway.toString().replace("/",""); + Log.v(TAG, " --------- default Gateway : ipAddress --------- "); + break; + } + } + catch (Exception ee) + { + ee.printStackTrace(); + } + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + return (ipAddress); + } + @Override public void injectDisplay(IAutoFocusFrameDisplay frameDisplayer, IIndicatorControl indicator, IFocusingModeNotify focusingModeNotify) { @@ -158,7 +202,7 @@ public class NikonInterfaceProvider implements INikonInterfaceProvider, IDisplay @Override public IPtpIpRunModeHolder getRunModeHolder() { - return (runmode); + return (runMode); } @Override @@ -229,7 +273,7 @@ public class NikonInterfaceProvider implements INikonInterfaceProvider, IDisplay @Override public ICameraRunMode getCameraRunMode() { - return (runmode); + return (runMode); } @Override @@ -245,4 +289,22 @@ public class NikonInterfaceProvider implements INikonInterfaceProvider, IDisplay asyncReceiver.setEventSubscriber(receiver); } + @Override + public String getIpAddress() + { + return getHostAddress(activity); + } + + @Override + public int getControlPortNumber() + { + return (CONTROL_PORT); + } + + @Override + public int getEventPortNumber() + { + return (EVENT_PORT); + } + } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/status/NikonStatusChecker.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/status/NikonStatusChecker.java index e135d24..a170240 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/status/NikonStatusChecker.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/nikon/wrapper/status/NikonStatusChecker.java @@ -1,19 +1,18 @@ package net.osdn.gokigen.pkremote.camera.vendor.nikon.wrapper.status; -import android.app.Activity; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.camera.interfaces.liveview.ICameraStatusUpdateNotify; import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatus; import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatusWatcher; +import net.osdn.gokigen.pkremote.camera.vendor.nikon.INikonInterfaceProvider; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommand; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommandCallback; -import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommandPublisher; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpMessages; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.specific.NikonInitEventRequest; -import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.specific.StatusRequestMessage; import java.io.BufferedReader; import java.io.DataOutputStream; @@ -31,27 +30,24 @@ public class NikonStatusChecker implements IPtpIpCommandCallback, ICameraStatusW private static final int BUFFER_SIZE = 1024 * 1024 + 8; private static final int STATUS_MESSAGE_HEADER_SIZE = 14; - private int sleepMs; - private final IPtpIpCommandPublisher issuer; + private final INikonInterfaceProvider interfaceProvider; private ICameraStatusUpdateNotify notifier = null; - private NikonStatusHolder statusHolder; + private final NikonStatusHolder statusHolder; private boolean whileFetching = false; - private boolean logcat = false; - private final String ipAddress; - private final int portNumber; + private final boolean logcat = false; + //private final String ipAddress; + //private final int portNumber; private Socket socket = null; private DataOutputStream dos = null; private BufferedReader bufferedReader = null; private int eventConnectionNumber = 0; - public NikonStatusChecker(@NonNull Activity activity, @NonNull IPtpIpCommandPublisher issuer, @NonNull String ip, int portNumber) + public NikonStatusChecker(@NonNull AppCompatActivity activity, @NonNull INikonInterfaceProvider interfaceProvider) { - this.issuer = issuer; + this.interfaceProvider = interfaceProvider; this.statusHolder = new NikonStatusHolder(); - this.ipAddress = ip; - this.portNumber = portNumber; - Log.v(TAG, "POLLING WAIT : " + sleepMs); + Log.v(TAG, "NikonStatusChecker() "); } @Override @@ -165,18 +161,21 @@ public class NikonStatusChecker implements IPtpIpCommandCallback, ICameraStatusW } try { - final IPtpIpCommandCallback callback = this; this.notifier = notifier; whileFetching = true; + String ipAddress = interfaceProvider.getIpAddress(); + int portNumber = interfaceProvider.getEventPortNumber(); + // セッションをオープンする - boolean isConnect = connect(); + boolean isConnect = connect(ipAddress, portNumber); if (!isConnect) { Log.v(TAG, " CONNECT FAIL...(EVENT) : " + ipAddress + " " + portNumber); } issueCommand(new NikonInitEventRequest(this, eventConnectionNumber)); /* + final IPtpIpCommandCallback callback = this; Thread thread = new Thread(new Runnable() { @Override @@ -213,7 +212,7 @@ public class NikonStatusChecker implements IPtpIpCommandCallback, ICameraStatusW @Override public void stopStatusWatch() { - Log.v(TAG, "stoptStatusWatch()"); + Log.v(TAG, "stopStatusWatch()"); whileFetching = false; this.notifier = null; } @@ -226,7 +225,7 @@ public class NikonStatusChecker implements IPtpIpCommandCallback, ICameraStatusW } } - private boolean connect() + private boolean connect(@NonNull String ipAddress, int portNumber) { try { diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/IPtpIpInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/IPtpIpInterfaceProvider.java index dbc9973..80e0521 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/IPtpIpInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/IPtpIpInterfaceProvider.java @@ -55,4 +55,8 @@ public interface IPtpIpInterfaceProvider IInformationReceiver getInformationReceiver(); void setAsyncEventReceiver(@NonNull IPtpIpCommandCallback receiver); + + String getIpAddress(); + int getControlPortNumber(); + int getEventPortNumber(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/PtpIpInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/PtpIpInterfaceProvider.java index 3ff7e7a..1283a07 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/PtpIpInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/PtpIpInterfaceProvider.java @@ -11,6 +11,7 @@ import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; import net.osdn.gokigen.pkremote.IInformationReceiver; @@ -60,13 +61,12 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay private static final int EVENT_PORT = 15740; //private static final String CAMERA_IP = "192.168.0.1"; - //private final Activity activity; + private final Activity activity; - private final PtpIpRunMode runmode; + private final PtpIpRunMode runMode; private final PtpIpHardwareStatus hardwareStatus; private final PtpIpButtonControl ptpIpButtonControl; private final CanonConnection canonConnection; - //private final PtpIpCommandPublisher0 commandPublisher; private final PtpIpCommandPublisher commandPublisher; private final PtpIpLiveViewControl liveViewControl; private final PtpIpAsyncResponseReceiver asyncReceiver; @@ -78,14 +78,13 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay private final CanonPlaybackControl playbackControl; private final IInformationReceiver informationReceiver; - public PtpIpInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull ICameraStatusUpdateNotify statusListener, @NonNull IInformationReceiver informationReceiver) + public PtpIpInterfaceProvider(@NonNull AppCompatActivity context, @NonNull ICameraStatusReceiver provider, @NonNull ICameraStatusUpdateNotify statusListener, @NonNull IInformationReceiver informationReceiver) { - //this.activity = context; - String ipAddress; // "192.168.0.1"; + this.activity = context; + //String ipAddress = getHostAddress(context); int sequenceType = 0; try { - ipAddress = getHostAddress(context); try { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); @@ -100,18 +99,15 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay catch (Exception e) { e.printStackTrace(); - ipAddress = "192.168.0.1"; } - - commandPublisher = new PtpIpCommandPublisher(ipAddress, CONTROL_PORT, false, false); - //commandPublisher = new PtpIpCommandPublisher0(ipAddress, CONTROL_PORT); - liveViewControl = new PtpIpLiveViewControl(context, ipAddress, STREAM_PORT); - asyncReceiver = new PtpIpAsyncResponseReceiver(ipAddress, ASYNC_RESPONSE_PORT); - statusChecker = new PtpIpStatusChecker(context, commandPublisher, ipAddress, EVENT_PORT); - canonConnection = new CanonConnection(context, provider, this, statusChecker, ipAddress, sequenceType); + commandPublisher = new PtpIpCommandPublisher(false, false); + liveViewControl = new PtpIpLiveViewControl(context, false); + asyncReceiver = new PtpIpAsyncResponseReceiver(); + statusChecker = new PtpIpStatusChecker(context, this, false); + canonConnection = new CanonConnection(context, provider, this, statusChecker, sequenceType); zoomControl = new PtpIpZoomControl(); this.statusListener = statusListener; - this.runmode = new PtpIpRunMode(); + this.runMode = new PtpIpRunMode(); this.hardwareStatus = new PtpIpHardwareStatus(); this.ptpIpButtonControl = new PtpIpButtonControl(); this.playbackControl = new CanonPlaybackControl(context, this); @@ -120,13 +116,13 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay private String getHostAddress(@NonNull Activity context) { - String ipAddress = "192.168.0.1"; + String ipAddress = IPreferencePropertyAccessor.CANON_HOST_IP_DEFAULT_VALUE; try { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); - boolean autoDetactHostIp = preferences.getBoolean(IPreferencePropertyAccessor.CANON_AUTO_DETECT_HOST_IP, true); + boolean autoDetectHostIp = preferences.getBoolean(IPreferencePropertyAccessor.CANON_AUTO_DETECT_HOST_IP, true); ipAddress = preferences.getString(IPreferencePropertyAccessor.CANON_HOST_IP, IPreferencePropertyAccessor.CANON_HOST_IP_DEFAULT_VALUE); - if ((autoDetactHostIp)&&(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) + if ((autoDetectHostIp)&&(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); Network activeNetwork = connectivityManager.getActiveNetwork(); @@ -171,8 +167,6 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay public void injectDisplay(IAutoFocusFrameDisplay frameDisplayer, IIndicatorControl indicator, IFocusingModeNotify focusingModeNotify) { Log.v(TAG, "injectDisplay()"); - //captureControl = new FujiXCaptureControl(commandPublisher, frameDisplayer); - //focusingControl = new FujiXFocusingControl(activity, commandPublisher, frameDisplayer, indicator); } @Override @@ -226,7 +220,7 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay @Override public IPtpIpRunModeHolder getRunModeHolder() { - return (runmode); + return (runMode); } @Override @@ -297,7 +291,7 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay @Override public ICameraRunMode getCameraRunMode() { - return (runmode); + return (runMode); } @Override @@ -313,4 +307,21 @@ public class PtpIpInterfaceProvider implements IPtpIpInterfaceProvider, IDisplay asyncReceiver.setEventSubscriber(receiver); } + @Override + public String getIpAddress() + { + return (getHostAddress(activity)); + } + + @Override + public int getControlPortNumber() + { + return (CONTROL_PORT); + } + + @Override + public int getEventPortNumber() + { + return (EVENT_PORT); + } } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/IPtpIpCommunication.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/IPtpIpCommunication.java index 163db1d..a9c0fd5 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/IPtpIpCommunication.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/IPtpIpCommunication.java @@ -1,7 +1,9 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command; +import androidx.annotation.NonNull; + public interface IPtpIpCommunication { - boolean connect(); + boolean connect(@NonNull String ipAddress, int portNumber); void disconnect(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpAsyncResponseReceiver.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpAsyncResponseReceiver.java index c27036f..5c64c75 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpAsyncResponseReceiver.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpAsyncResponseReceiver.java @@ -10,18 +10,16 @@ import java.net.Socket; public class PtpIpAsyncResponseReceiver implements IPtpIpCommunication { private final String TAG = toString(); - private final String ipAddress; - private final int portNumber; + private static final int ASYNC_RESPONSE_PORT = 15741; // ?? private static final int BUFFER_SIZE = 1280 + 8; private static final int WAIT_MS = 250; // 250ms private static final int ERROR_LIMIT = 30; private IPtpIpCommandCallback receiver = null; private boolean isStart = false; - public PtpIpAsyncResponseReceiver(@NonNull String ip, int portNumber) + public PtpIpAsyncResponseReceiver() { - this.ipAddress = ip; - this.portNumber = portNumber; + // } public void setEventSubscriber(@NonNull IPtpIpCommandCallback receiver) @@ -30,9 +28,9 @@ public class PtpIpAsyncResponseReceiver implements IPtpIpCommunication } @Override - public boolean connect() + public boolean connect(@NonNull String ipAddress, int portNumber) { - start(); + start(ipAddress, portNumber); return (true); } @@ -42,7 +40,7 @@ public class PtpIpAsyncResponseReceiver implements IPtpIpCommunication isStart = false; } - public void start() + public void start(@NonNull String ipAddress, int portNumber) { if (isStart) { @@ -50,21 +48,16 @@ public class PtpIpAsyncResponseReceiver implements IPtpIpCommunication return; } isStart = true; - Thread thread = new Thread(new Runnable() - { - @Override - public void run() + Thread thread = new Thread(() -> { + try { - try - { - Socket socket = new Socket(ipAddress, portNumber); - startReceive(socket); - } - catch (Exception e) - { - Log.v(TAG, " IP : " + ipAddress + " port : " + portNumber); - e.printStackTrace(); - } + Socket socket = new Socket(ipAddress, portNumber); + startReceive(socket); + } + catch (Exception e) + { + Log.v(TAG, " IP : " + ipAddress + " port : " + portNumber); + e.printStackTrace(); } }); try diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher.kt b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher.kt index 71fdae6..1123ff2 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher.kt +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher.kt @@ -10,7 +10,7 @@ import java.net.InetSocketAddress import java.net.Socket import java.util.* -class PtpIpCommandPublisher(private val ipAddress : String, private val portNumber : Int, private val tcpNoDelay : Boolean, private val waitForever: Boolean) : IPtpIpCommandPublisher, IPtpIpCommunication +class PtpIpCommandPublisher(private val tcpNoDelay : Boolean, private val waitForever: Boolean) : IPtpIpCommandPublisher, IPtpIpCommunication { private var isConnected = false private var isStart = false @@ -36,7 +36,7 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb return (isConnected) } - override fun connect(): Boolean + override fun connect(ipAddress: String, portNumber: Int): Boolean { try { @@ -67,6 +67,7 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb Log.v(TAG, " SOCKET (SEND:${socket?.sendBufferSize}, RECV:${socket?.receiveBufferSize}) oob:${socket?.oobInline} SO_TIMEOUT:${socket?.soTimeout}ms trafficClass:${socket?.trafficClass}") } socket?.connect(InetSocketAddress(ipAddress, portNumber), 0) + Log.v(TAG, " connect -> IP : $ipAddress port : $portNumber") isConnected = true } catch (e: Exception) @@ -74,6 +75,7 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb e.printStackTrace() isConnected = false socket = null + Log.v(TAG, "<<<<< IP : $ipAddress port : $portNumber >>>>>") } return (isConnected) } @@ -137,7 +139,6 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb } catch (e: Exception) { - Log.v(TAG, "<<<<< IP : $ipAddress port : $portNumber >>>>>") e.printStackTrace() } } @@ -308,7 +309,7 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb * カメラにコマンドを送信する(メイン部分) * */ - private fun sendToCamera(isDumpReceiveLog: Boolean, byte_array: ByteArray, useSequenceNumber: Boolean, embeddedSequenceIndex: Int) + private fun sendToCamera(isDumpReceiveLog: Boolean, byteArray: ByteArray, useSequenceNumber: Boolean, embeddedSequenceIndex: Int) { try { @@ -319,12 +320,12 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb } // メッセージボディを加工: 最初に4バイトのレングス長をつける - val sendData = ByteArray(byte_array.size + 4) - sendData[0] = (byte_array.size + 4).toByte() + val sendData = ByteArray(byteArray.size + 4) + sendData[0] = (byteArray.size + 4).toByte() sendData[1] = 0x00 sendData[2] = 0x00 sendData[3] = 0x00 - System.arraycopy(byte_array, 0, sendData, 4, byte_array.size) + System.arraycopy(byteArray, 0, sendData, 4, byteArray.size) if (useSequenceNumber) { // Sequence Number を反映させる @@ -535,7 +536,9 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb { if (receivedLength > 0) { - SimpleLogDumper.dump_bytes("WRONG DATA : ", byteArray.copyOfRange(0, Math.min(receivedLength, 64))) + SimpleLogDumper.dump_bytes("WRONG DATA : ", byteArray.copyOfRange(0, + receivedLength.coerceAtMost(64) + )) } Log.v(TAG, " WRONG LENGTH. : $targetLength READ : $receivedLength bytes.") } @@ -636,23 +639,23 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb return (false) } - private fun parseDataLength(byte_array: ByteArray, read_bytes: Int): Int + private fun parseDataLength(byteArray: ByteArray, readBytes: Int): Int { var offset = 0 - var lenlen = 0 + var dateLength = 0 try { - if (read_bytes > 20) + if (readBytes > 20) { - if (byte_array[offset + 4].toUByte().toInt() == 0x07) + if (byteArray[offset + 4].toUByte().toInt() == 0x07) { // 前の応答が入っていると考える... レングスバイト分読み飛ばす - offset = byte_array[offset].toUByte().toInt() + offset = byteArray[offset].toUByte().toInt() } - if (byte_array[offset + 4].toUByte().toInt() == 0x09) + if (byteArray[offset + 4].toUByte().toInt() == 0x09) { // データバイト... (Start Data Packet で データレングスを特定する - lenlen = (byte_array[offset + 15].toUByte().toInt() and 0xff shl 24) + (byte_array[offset + 14].toUByte().toInt() and 0xff shl 16) + (byte_array[offset + 13].toUByte().toInt() and 0xff shl 8) + (byte_array[offset + 12].toUByte().toInt() and 0xff) + dateLength = (byteArray[offset + 15].toUByte().toInt() and 0xff shl 24) + (byteArray[offset + 14].toUByte().toInt() and 0xff shl 16) + (byteArray[offset + 13].toUByte().toInt() and 0xff shl 8) + (byteArray[offset + 12].toUByte().toInt() and 0xff) } } } @@ -660,7 +663,7 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb { e.printStackTrace() } - return (lenlen) + return (dateLength) } private fun cutHeader(receivedBuffer: ByteArrayOutputStream): ByteArrayOutputStream @@ -669,7 +672,7 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb { val byteArray = receivedBuffer.toByteArray() val limit = byteArray.size - var lenlen = 0 + var dataLength = 0 val len = (byteArray[3].toUByte().toInt() and 0xff shl 24) + (byteArray[2].toUByte().toInt() and 0xff shl 16) + (byteArray[1].toUByte().toInt() and 0xff shl 8) + (byteArray[0].toUByte().toInt() and 0xff) val packetType = byteArray[4].toUByte().toInt() and 0xff if ((limit == len)||(limit < 16384)) @@ -680,10 +683,10 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb if (packetType == 0x09) { - lenlen = (byteArray[15].toUByte().toInt() and 0xff shl 24) + (byteArray[14].toUByte().toInt() and 0xff shl 16) + (byteArray[13].toUByte().toInt() and 0xff shl 8) + (byteArray[12].toUByte().toInt() and 0xff) + dataLength = (byteArray[15].toUByte().toInt() and 0xff shl 24) + (byteArray[14].toUByte().toInt() and 0xff shl 16) + (byteArray[13].toUByte().toInt() and 0xff shl 8) + (byteArray[12].toUByte().toInt() and 0xff) } - if (lenlen == 0) + if (dataLength == 0) { // データとしては変なので、なにもしない return receivedBuffer @@ -692,11 +695,11 @@ class PtpIpCommandPublisher(private val ipAddress : String, private val portNumb var position = 20 // ヘッダ込の先頭 while (position < limit) { - lenlen = (byteArray[position + 3].toUByte().toInt() and 0xff shl 24) + (byteArray[position + 2].toUByte().toInt() and 0xff shl 16) + (byteArray[position + 1].toUByte().toInt() and 0xff shl 8) + (byteArray[position].toUByte().toInt() and 0xff) + dataLength = (byteArray[position + 3].toUByte().toInt() and 0xff shl 24) + (byteArray[position + 2].toUByte().toInt() and 0xff shl 16) + (byteArray[position + 1].toUByte().toInt() and 0xff shl 8) + (byteArray[position].toUByte().toInt() and 0xff) - val copyByte = Math.min(limit - (position + 12), lenlen - 12) + val copyByte = (limit - (position + 12)).coerceAtMost(dataLength - 12) outputStream.write(byteArray, position + 12, copyByte) - position += lenlen + position += dataLength } return (outputStream) } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher0.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher0.java index 7a09616..fd2671d 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher0.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/command/PtpIpCommandPublisher0.java @@ -25,8 +25,8 @@ public class PtpIpCommandPublisher0 implements IPtpIpCommandPublisher, IPtpIpCom private static final int COMMAND_SEND_RECEIVE_DURATION_MAX = 1000; private static final int COMMAND_POLL_QUEUE_MS = 5; - private final String ipAddress; - private final int portNumber; + //private final String ipAddress; + //private final int portNumber; private boolean isStart = false; private boolean isHold = false; @@ -38,10 +38,8 @@ public class PtpIpCommandPublisher0 implements IPtpIpCommandPublisher, IPtpIpCom private final Queue commandQueue; private final Queue holdCommandQueue; - public PtpIpCommandPublisher0(@NonNull String ip, int portNumber) + public PtpIpCommandPublisher0() { - this.ipAddress = ip; - this.portNumber = portNumber; this.commandQueue = new ArrayDeque<>(); this.holdCommandQueue = new ArrayDeque<>(); commandQueue.clear(); @@ -55,10 +53,11 @@ public class PtpIpCommandPublisher0 implements IPtpIpCommandPublisher, IPtpIpCom } @Override - public boolean connect() + public boolean connect(@NonNull String ipAddress, int portNumber) { try { + Log.v(TAG, "PtpIpCommandPublisher0::connect() " + ipAddress + " " + portNumber); socket = new Socket(ipAddress, portNumber); return (true); } @@ -128,36 +127,30 @@ public class PtpIpCommandPublisher0 implements IPtpIpCommandPublisher, IPtpIpCom } isStart = true; - Thread thread = new Thread(new Runnable() - { - @Override - public void run() + Thread thread = new Thread(() -> { + try { - try + dos = new DataOutputStream(socket.getOutputStream()); + while (isStart) { - dos = new DataOutputStream(socket.getOutputStream()); - while (isStart) + try { - try - { - IPtpIpCommand command = commandQueue.poll(); - if (command != null) - { - issueCommand(command); - } - Thread.sleep(COMMAND_POLL_QUEUE_MS); - } - catch (Exception e) + IPtpIpCommand command = commandQueue.poll(); + if (command != null) { - e.printStackTrace(); + issueCommand(command); } + Thread.sleep(COMMAND_POLL_QUEUE_MS); + } + catch (Exception e) + { + e.printStackTrace(); } } - catch (Exception e) - { - Log.v(TAG, "<<<<< IP : " + ipAddress + " port : " + portNumber + " >>>>>"); - e.printStackTrace(); - } + } + catch (Exception e) + { + e.printStackTrace(); } }); try @@ -607,7 +600,7 @@ public class PtpIpCommandPublisher0 implements IPtpIpCommandPublisher, IPtpIpCom { Log.v(TAG, " <><><> PACKET TYPE : " + packetType + " LENGTH : " + lenlen); } - int copyByte = ((lenlen - 12) > (limit - (position + 12))) ? (limit - (position + 12)) : (lenlen - 12); + int copyByte = Math.min((lenlen - 12), (limit - (position + 12))); outputStream.write(byte_array, (position + 12), copyByte); position = position + lenlen; } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlayback.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlayback.java index fce4b1f..29db0f1 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlayback.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlayback.java @@ -1,10 +1,10 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection; -import android.app.Activity; import android.graphics.Color; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.R; import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection; @@ -20,16 +20,15 @@ import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.status.PtpIpStatusC public class CanonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCommandCallback, IPtpIpMessages { private final String TAG = this.toString(); - - private final Activity context; + private final AppCompatActivity context; private final ICameraConnection cameraConnection; private final ICameraStatusReceiver cameraStatusReceiver; private final IPtpIpInterfaceProvider interfaceProvider; private final IPtpIpCommandPublisher commandIssuer; private final PtpIpStatusChecker statusChecker; - private boolean isDumpLog = false; + private final boolean isDumpLog; - CanonCameraConnectSequenceForPlayback(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull PtpIpStatusChecker statusChecker) + CanonCameraConnectSequenceForPlayback(@NonNull AppCompatActivity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull PtpIpStatusChecker statusChecker, boolean isDumpLog) { Log.v(TAG, " CanonCameraConnectSequenceForPlayback"); this.context = context; @@ -38,8 +37,10 @@ public class CanonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo this.interfaceProvider = interfaceProvider; this.commandIssuer = interfaceProvider.getCommandPublisher(); this.statusChecker = statusChecker; + this.isDumpLog = isDumpLog; } + @Override public void run() { @@ -49,7 +50,7 @@ public class CanonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo IPtpIpCommandPublisher issuer = interfaceProvider.getCommandPublisher(); if (!issuer.isConnected()) { - if (!interfaceProvider.getCommandCommunication().connect()) + if (!interfaceProvider.getCommandCommunication().connect(interfaceProvider.getIpAddress(), interfaceProvider.getControlPortNumber())) { // 接続失敗... interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.dialog_title_connect_failed_canon), false, true, Color.RED); @@ -96,57 +97,44 @@ public class CanonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo @Override public void receivedMessage(int id, byte[] rx_body) { - switch (id) - { - case SEQ_REGISTRATION: - if (checkRegistrationMessage(rx_body)) - { + switch (id) { + case SEQ_REGISTRATION -> { + if (checkRegistrationMessage(rx_body)) { sendInitEventRequest(rx_body); - } - else - { + } else { onConnectError(context.getString(R.string.connect_error_message)); } - break; - - case SEQ_EVENT_INITIALIZE: - if (checkEventInitialize(rx_body)) - { + } + case SEQ_EVENT_INITIALIZE -> { + if (checkEventInitialize(rx_body)) { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting1), false, false, 0); commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_OPEN_SESSION, isDumpLog, 0, 0x1002, 4, 0x41)); - } - else - { + } else { onConnectError(context.getString(R.string.connect_error_message)); } - break; - - case SEQ_OPEN_SESSION: + } + case SEQ_OPEN_SESSION -> { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting2), false, false, 0); commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_INIT_SESSION, isDumpLog, 0, 0x902f)); - break; - - case SEQ_INIT_SESSION: + } + case SEQ_INIT_SESSION -> { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting3), false, false, 0); commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_CHANGE_REMOTE, isDumpLog, 0, 0x9114, 4, 0x15)); - break; - - case SEQ_CHANGE_REMOTE: + } + case SEQ_CHANGE_REMOTE -> { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting4), false, false, 0); commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_SET_EVENT_MODE, isDumpLog, 0, 0x902f, 4, 0x02)); - break; - - case SEQ_SET_EVENT_MODE: + } + case SEQ_SET_EVENT_MODE -> { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting5), false, false, 0); interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connect_finished), false, false, 0); connectFinished(); Log.v(TAG, "CHANGED PLAYBACK MODE : DONE."); - break; - - default: + } + default -> { Log.v(TAG, "RECEIVED UNKNOWN ID : " + id); onConnectError(context.getString(R.string.connect_receive_unknown_message)); - break; + } } } @@ -218,16 +206,11 @@ public class CanonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo { try { - final Thread thread = new Thread(new Runnable() - { - @Override - public void run() - { - // カメラとの接続確立を通知する - cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected)); - cameraStatusReceiver.onCameraConnected(); - Log.v(TAG, " onConnectNotify()"); - } + final Thread thread = new Thread(() -> { + // カメラとの接続確立を通知する + cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected)); + cameraStatusReceiver.onCameraConnected(); + Log.v(TAG, " onConnectNotify()"); }); thread.start(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlaybackType1.kt b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlaybackType1.kt index ac5ee58..ffce026 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlaybackType1.kt +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraConnectSequenceForPlaybackType1.kt @@ -1,8 +1,8 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection -import android.app.Activity import android.graphics.Color import android.util.Log +import androidx.appcompat.app.AppCompatActivity import net.osdn.gokigen.pkremote.R import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatusReceiver @@ -12,9 +12,8 @@ import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpMessa import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.PtpIpCommandGeneric import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.status.PtpIpStatusChecker -class CanonCameraConnectSequenceForPlaybackType1(val context: Activity, val cameraStatusReceiver: ICameraStatusReceiver, val cameraConnection: ICameraConnection, val interfaceProvider: IPtpIpInterfaceProvider, val statusChecker: PtpIpStatusChecker) : Runnable, IPtpIpCommandCallback, IPtpIpMessages +class CanonCameraConnectSequenceForPlaybackType1(val context: AppCompatActivity, val cameraStatusReceiver: ICameraStatusReceiver, val cameraConnection: ICameraConnection, val interfaceProvider: IPtpIpInterfaceProvider, val statusChecker: PtpIpStatusChecker, private val isDumpLog: Boolean = true) : Runnable, IPtpIpCommandCallback, IPtpIpMessages { - private val isDumpLog = true private val commandIssuer = interfaceProvider.commandPublisher //private var requestMessageCount = 0 @@ -28,7 +27,7 @@ class CanonCameraConnectSequenceForPlaybackType1(val context: Activity, val came val issuer = interfaceProvider.commandPublisher if (!issuer.isConnected) { - if (!interfaceProvider.commandCommunication.connect()) + if (!interfaceProvider.commandCommunication.connect(interfaceProvider.ipAddress, interfaceProvider.controlPortNumber)) { // 接続失敗... interfaceProvider.informationReceiver.updateMessage(context.getString(R.string.dialog_title_connect_failed_canon), false, true, Color.RED) @@ -65,16 +64,16 @@ class CanonCameraConnectSequenceForPlaybackType1(val context: Activity, val came } //@ExperimentalUnsignedTypes - override fun receivedMessage(id: Int, rx_body: ByteArray) + override fun receivedMessage(id: Int, rxBody: ByteArray) { when (id) { - IPtpIpMessages.SEQ_REGISTRATION -> if (checkRegistrationMessage(rx_body)) { - sendInitEventRequest(rx_body) + IPtpIpMessages.SEQ_REGISTRATION -> if (checkRegistrationMessage(rxBody)) { + sendInitEventRequest(rxBody) } else { cameraConnection.alertConnectingFailed(context.getString(R.string.connect_error_message)) } - IPtpIpMessages.SEQ_EVENT_INITIALIZE -> if (checkEventInitialize(rx_body)) { + IPtpIpMessages.SEQ_EVENT_INITIALIZE -> if (checkEventInitialize(rxBody)) { interfaceProvider.informationReceiver.updateMessage(context.getString(R.string.canon_connect_connecting1), false, false, 0) commandIssuer.enqueueCommand(PtpIpCommandGeneric(this, IPtpIpMessages.SEQ_OPEN_SESSION, isDumpLog, 0, 0x1002, 4, 0x41)) } else { diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraDisconnectSequence.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraDisconnectSequence.java index 3647d5c..7bab861 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraDisconnectSequence.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonCameraDisconnectSequence.java @@ -1,9 +1,9 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection; -import android.app.Activity; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.IPtpIpInterfaceProvider; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommunication; @@ -12,12 +12,12 @@ import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommu class CanonCameraDisconnectSequence implements Runnable { private final String TAG = this.toString(); - private final Activity activity; + private final AppCompatActivity activity; private final IPtpIpCommunication command; private final IPtpIpCommunication async; private final IPtpIpCommunication liveview; - CanonCameraDisconnectSequence(Activity activity, @NonNull IPtpIpInterfaceProvider interfaceProvider) + CanonCameraDisconnectSequence(AppCompatActivity activity, @NonNull IPtpIpInterfaceProvider interfaceProvider) { this.activity = activity; this.command = interfaceProvider.getCommandCommunication(); diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonConnection.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonConnection.java index 24f037b..d0c6f11 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonConnection.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/CanonConnection.java @@ -1,9 +1,7 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; @@ -14,6 +12,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.R; import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection; @@ -27,24 +26,22 @@ import java.util.concurrent.Executors; public class CanonConnection implements ICameraConnection { private final String TAG = toString(); - private final Activity context; + private final AppCompatActivity context; private final ICameraStatusReceiver statusReceiver; private final IPtpIpInterfaceProvider interfaceProvider; private final BroadcastReceiver connectionReceiver; private final Executor cameraExecutor = Executors.newFixedThreadPool(1); private final PtpIpStatusChecker statusChecker; - private final String ipAddress; private final int sequenceType; private CameraConnectionStatus connectionStatus = CameraConnectionStatus.UNKNOWN; - public CanonConnection(@NonNull final Activity context, @NonNull final ICameraStatusReceiver statusReceiver, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull PtpIpStatusChecker statusChecker, @NonNull String ipAddress, int sequenceType) + public CanonConnection(@NonNull final AppCompatActivity context, @NonNull final ICameraStatusReceiver statusReceiver, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull PtpIpStatusChecker statusChecker, int sequenceType) { Log.v(TAG, "CanonConnection()"); this.context = context; this.statusReceiver = statusReceiver; this.interfaceProvider = interfaceProvider; this.statusChecker = statusChecker; - this.ipAddress = ipAddress; this.sequenceType = sequenceType; connectionReceiver = new BroadcastReceiver() { @@ -62,10 +59,9 @@ public class CanonConnection implements ICameraConnection */ private void onReceiveBroadcastOfConnection(Context context, Intent intent) { - interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_check_wifi) + " : " + ipAddress, false, false, 0); - statusReceiver.onStatusNotify(context.getString(R.string.connect_check_wifi) + " " + ipAddress); - - Log.v(TAG, context.getString(R.string.connect_check_wifi) + " : " + ipAddress); + interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_check_wifi) + " : CanonConnection", false, false, 0); + statusReceiver.onStatusNotify(context.getString(R.string.connect_check_wifi) + " CanonConnection"); + Log.v(TAG, context.getString(R.string.connect_check_wifi) + " : CanonConnection"); String action = intent.getAction(); if (action == null) @@ -148,45 +144,30 @@ public class CanonConnection implements ICameraConnection final AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle(context.getString(R.string.dialog_title_connect_failed_canon)) .setMessage(message) - .setPositiveButton(context.getString(R.string.dialog_title_button_retry), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) + .setPositiveButton(context.getString(R.string.dialog_title_button_retry), (dialog, which) -> { + disconnect(false); + connect(); + }) + .setNeutralButton(R.string.dialog_title_button_network_settings, (dialog, which) -> { + try { - disconnect(false); - connect(); + // Wifi 設定画面を表示する + context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); } - }) - .setNeutralButton(R.string.dialog_title_button_network_settings, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) + catch (android.content.ActivityNotFoundException ex) { - try - { - // Wifi 設定画面を表示する - context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); - } - catch (android.content.ActivityNotFoundException ex) - { - // Activity が存在しなかった...設定画面が起動できなかった - Log.v(TAG, "android.content.ActivityNotFoundException..."); + // Activity が存在しなかった...設定画面が起動できなかった + Log.v(TAG, "android.content.ActivityNotFoundException..."); - // この場合は、再試行と等価な動きとする - connect(); - } - catch (Exception e) - { - e.printStackTrace(); - } + // この場合は、再試行と等価な動きとする + connect(); + } + catch (Exception e) + { + e.printStackTrace(); } }); - context.runOnUiThread(new Runnable() - { - @Override - public void run() - { - builder.show(); - } - }); + context.runOnUiThread(builder::show); } @Override @@ -231,12 +212,12 @@ public class CanonConnection implements ICameraConnection /* if (sequenceType == 1) { - cameraExecutor.execute(new CanonCameraConnectSequenceForPlaybackType1(context, statusReceiver, this, interfaceProvider, statusChecker)); + cameraExecutor.execute(new CanonCameraConnectSequenceForPlaybackType1(context, statusReceiver, this, interfaceProvider, statusChecker, ipAddress, portNumber, false)); } else */ { - cameraExecutor.execute(new CanonCameraConnectSequenceForPlayback(context, statusReceiver, this, interfaceProvider, statusChecker)); + cameraExecutor.execute(new CanonCameraConnectSequenceForPlayback(context, statusReceiver, this, interfaceProvider, statusChecker, false)); } } catch (Exception e) diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonCameraConnectSequenceForPlayback.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonCameraConnectSequenceForPlayback.java index dc16f73..88a79eb 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonCameraConnectSequenceForPlayback.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonCameraConnectSequenceForPlayback.java @@ -1,10 +1,10 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection; -import android.app.Activity; import android.graphics.Color; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.R; import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection; @@ -21,15 +21,15 @@ public class NikonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo { private final String TAG = this.toString(); - private final Activity context; + private final AppCompatActivity context; private final ICameraConnection cameraConnection; private final ICameraStatusReceiver cameraStatusReceiver; private final INikonInterfaceProvider interfaceProvider; private final IPtpIpCommandPublisher commandIssuer; private final NikonStatusChecker statusChecker; - private boolean isDumpLog = false; + private final boolean isDumpLog = false; - NikonCameraConnectSequenceForPlayback(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull INikonInterfaceProvider interfaceProvider, @NonNull NikonStatusChecker statusChecker) + NikonCameraConnectSequenceForPlayback(@NonNull AppCompatActivity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull INikonInterfaceProvider interfaceProvider, @NonNull NikonStatusChecker statusChecker) { Log.v(TAG, " NikonCameraConnectSequenceForPlayback"); this.context = context; @@ -49,7 +49,7 @@ public class NikonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo IPtpIpCommandPublisher issuer = interfaceProvider.getCommandPublisher(); if (!issuer.isConnected()) { - if (!interfaceProvider.getCommandCommunication().connect()) + if (!interfaceProvider.getCommandCommunication().connect(interfaceProvider.getIpAddress(), interfaceProvider.getControlPortNumber())) { // 接続失敗... interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.dialog_title_connect_failed_nikon), false, true, Color.RED); @@ -96,51 +96,38 @@ public class NikonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo @Override public void receivedMessage(int id, byte[] rx_body) { - switch (id) - { - case SEQ_REGISTRATION: - if (checkRegistrationMessage(rx_body)) - { + switch (id) { + case SEQ_REGISTRATION -> { + if (checkRegistrationMessage(rx_body)) { sendInitEventRequest(rx_body); - } - else - { + } else { onConnectError(context.getString(R.string.connect_error_message)); } - break; - - case SEQ_EVENT_INITIALIZE: - if (checkEventInitialize(rx_body)) - { + } + case SEQ_EVENT_INITIALIZE -> { + if (checkEventInitialize(rx_body)) { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting1), false, false, 0); commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_OPEN_SESSION, 50, isDumpLog, 0, 0x1002, 4, 0x41, 0, 0, 0)); // OpenSession - } - else - { + } else { onConnectError(context.getString(R.string.connect_error_message)); } - break; - - case SEQ_OPEN_SESSION: + } + case SEQ_OPEN_SESSION -> { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting2), false, false, 0); commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_INIT_SESSION, 50, isDumpLog, 0, 0x1001, 0, 0, 0, 0, 0)); // GetDeviceInfo - break; - - case SEQ_INIT_SESSION: - case SEQ_CHANGE_REMOTE: - case SEQ_SET_EVENT_MODE: + } + case SEQ_INIT_SESSION, SEQ_CHANGE_REMOTE, SEQ_SET_EVENT_MODE -> { interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting3), false, false, 0); interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting4), false, false, 0); interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting5), false, false, 0); interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connect_finished), false, false, 0); connectFinished(); Log.v(TAG, "CHANGED PLAYBACK MODE : DONE."); - break; - - default: + } + default -> { Log.v(TAG, "RECEIVED UNKNOWN ID : " + id); onConnectError(context.getString(R.string.connect_receive_unknown_message)); - break; + } } } @@ -212,16 +199,11 @@ public class NikonCameraConnectSequenceForPlayback implements Runnable, IPtpIpCo { try { - final Thread thread = new Thread(new Runnable() - { - @Override - public void run() - { - // カメラとの接続確立を通知する - cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected)); - cameraStatusReceiver.onCameraConnected(); - Log.v(TAG, " onConnectNotify()"); - } + final Thread thread = new Thread(() -> { + // カメラとの接続確立を通知する + cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected)); + cameraStatusReceiver.onCameraConnected(); + Log.v(TAG, " onConnectNotify()"); }); thread.start(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonConnection.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonConnection.java index d7d7d69..4590e95 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonConnection.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/connection/NikonConnection.java @@ -1,9 +1,7 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.connection; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; @@ -14,6 +12,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.R; import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection; @@ -27,7 +26,7 @@ import java.util.concurrent.Executors; public class NikonConnection implements ICameraConnection { private final String TAG = toString(); - private final Activity context; + private final AppCompatActivity context; private final ICameraStatusReceiver statusReceiver; private final INikonInterfaceProvider interfaceProvider; private final BroadcastReceiver connectionReceiver; @@ -38,7 +37,7 @@ public class NikonConnection implements ICameraConnection private final NikonCameraConnectSequenceForPlayback connectSequence; private final NikonCameraDisconnectSequence disconnectSequence; - public NikonConnection(@NonNull final Activity context, @NonNull final ICameraStatusReceiver statusReceiver, @NonNull INikonInterfaceProvider interfaceProvider, @NonNull NikonStatusChecker statusChecker) + public NikonConnection(@NonNull final AppCompatActivity context, @NonNull final ICameraStatusReceiver statusReceiver, @NonNull INikonInterfaceProvider interfaceProvider, @NonNull NikonStatusChecker statusChecker) { Log.v(TAG, "NikonConnection()"); this.context = context; @@ -148,45 +147,30 @@ public class NikonConnection implements ICameraConnection final AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle(context.getString(R.string.dialog_title_connect_failed_nikon)) .setMessage(message) - .setPositiveButton(context.getString(R.string.dialog_title_button_retry), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) + .setPositiveButton(context.getString(R.string.dialog_title_button_retry), (dialog, which) -> { + disconnect(false); + connect(); + }) + .setNeutralButton(R.string.dialog_title_button_network_settings, (dialog, which) -> { + try { - disconnect(false); - connect(); + // Wifi 設定画面を表示する + context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); } - }) - .setNeutralButton(R.string.dialog_title_button_network_settings, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) + catch (android.content.ActivityNotFoundException ex) { - try - { - // Wifi 設定画面を表示する - context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); - } - catch (android.content.ActivityNotFoundException ex) - { - // Activity が存在しなかった...設定画面が起動できなかった - Log.v(TAG, "android.content.ActivityNotFoundException..."); + // Activity が存在しなかった...設定画面が起動できなかった + Log.v(TAG, "android.content.ActivityNotFoundException..."); - // この場合は、再試行と等価な動きとする - connect(); - } - catch (Exception e) - { - e.printStackTrace(); - } + // この場合は、再試行と等価な動きとする + connect(); + } + catch (Exception e) + { + e.printStackTrace(); } }); - context.runOnUiThread(new Runnable() - { - @Override - public void run() - { - builder.show(); - } - }); + context.runOnUiThread(builder::show); } @Override @@ -208,7 +192,7 @@ public class NikonConnection implements ICameraConnection */ private void disconnectFromCamera(final boolean powerOff) { - Log.v(TAG, " disconnectFromCamera()"); + Log.v(TAG, " disconnectFromCamera()" + powerOff); try { cameraExecutor.execute(disconnectSequence); diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/liveview/PtpIpLiveViewControl.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/liveview/PtpIpLiveViewControl.java index 29f0ea5..549c75a 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/liveview/PtpIpLiveViewControl.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/liveview/PtpIpLiveViewControl.java @@ -1,16 +1,17 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.liveview; -import android.app.Activity; import android.content.SharedPreferences; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; import net.osdn.gokigen.pkremote.camera.interfaces.liveview.ILiveViewControl; import net.osdn.gokigen.pkremote.camera.interfaces.liveview.ILiveViewListener; import net.osdn.gokigen.pkremote.camera.liveview.CameraLiveViewListenerImpl; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommunication; +import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor; import java.io.InputStream; import java.net.Socket; @@ -22,20 +23,23 @@ import static net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor.F public class PtpIpLiveViewControl implements ILiveViewControl, IPtpIpCommunication { private final String TAG = toString(); - private final String ipAddress; - private final int portNumber; + private static final int STREAM_PORT_DEFAULT = 15742; // ?? + + private String ipAddress = IPreferencePropertyAccessor.CANON_HOST_IP_DEFAULT_VALUE; + private int portNumber = STREAM_PORT_DEFAULT; private final CameraLiveViewListenerImpl liveViewListener; private int waitMs = 0; private static final int DATA_HEADER_OFFSET = 18; private static final int BUFFER_SIZE = 2048 * 1280; private static final int ERROR_LIMIT = 30; private boolean isStart = false; - private boolean logcat = false; + private final boolean logcat; - public PtpIpLiveViewControl(@NonNull Activity activity, String ip, int portNumber) + public PtpIpLiveViewControl(@NonNull AppCompatActivity activity, boolean logcat) { - this.ipAddress = ip; - this.portNumber = portNumber; + //this.ipAddress = ip; + //this.portNumber = portNumber; + this.logcat = logcat; liveViewListener = new CameraLiveViewListenerImpl(); try @@ -66,21 +70,16 @@ public class PtpIpLiveViewControl implements ILiveViewControl, IPtpIpCommunicati return; } isStart = true; - Thread thread = new Thread(new Runnable() - { - @Override - public void run() + Thread thread = new Thread(() -> { + try { - try - { - Socket socket = new Socket(ipAddress, portNumber); - startReceive(socket); - } - catch (Exception e) - { - Log.v(TAG, " IP : " + ipAddress + " port : " + portNumber); - e.printStackTrace(); - } + Socket socket = new Socket(ipAddress, portNumber); + startReceive(socket); + } + catch (Exception e) + { + Log.v(TAG, " IP : " + ipAddress + " port : " + portNumber); + e.printStackTrace(); } }); try @@ -221,8 +220,10 @@ public class PtpIpLiveViewControl implements ILiveViewControl, IPtpIpCommunicati } @Override - public boolean connect() + public boolean connect(@NonNull String ipAddress, int portNumber) { + this.ipAddress = ipAddress; + this.portNumber = portNumber; return (true); } @@ -245,12 +246,11 @@ public class PtpIpLiveViewControl implements ILiveViewControl, IPtpIpCommunicati } int index = 0; - StringBuffer message; if (dumpBytes <= 0) { dumpBytes = 24; } - message = new StringBuffer(); + StringBuilder message = new StringBuilder(); for (int point = 0; point < dumpBytes; point++) { byte item = data[point]; @@ -260,7 +260,7 @@ public class PtpIpLiveViewControl implements ILiveViewControl, IPtpIpCommunicati { Log.v(TAG, header + " " + message); index = 0; - message = new StringBuffer(); + message = new StringBuilder(); } } if (index != 0) diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonImageReceiver.kt b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonImageReceiver.kt index 02102f7..84260b8 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonImageReceiver.kt +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonImageReceiver.kt @@ -1,7 +1,7 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.playback -import android.app.Activity import android.util.Log +import androidx.appcompat.app.AppCompatActivity import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentCallback import net.osdn.gokigen.pkremote.camera.interfaces.playback.IProgressEvent import net.osdn.gokigen.pkremote.camera.utils.SimpleLogDumper @@ -14,7 +14,7 @@ import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.sp import java.io.ByteArrayOutputStream import java.util.* -class CanonImageReceiver(private val activity: Activity, private val publisher: IPtpIpCommandPublisher, private val sequenceType : Int) : IPtpIpCommandCallback, ICanonImageReceiver +class CanonImageReceiver(private val activity: AppCompatActivity, private val publisher: IPtpIpCommandPublisher, private val sequenceType : Int) : IPtpIpCommandCallback, ICanonImageReceiver { private val mine = this private val isDumpLog = false @@ -40,7 +40,7 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: publisher.enqueueCommand(PtpIpCommandGeneric(this, objectId + 7, isDumpLog, objectId, 0x902f)) } - override fun receivedMessage(id: Int, rx_body: ByteArray?) + override fun receivedMessage(id: Int, rxBody: ByteArray?) { try { @@ -57,7 +57,7 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: } } (objectId + 1) -> { - sendTransferComplete(rx_body) + sendTransferComplete(rxBody) } (objectId + 2) -> { Log.v(TAG, " requestInnerDevelopEnd() : $objectId") @@ -79,10 +79,10 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: System.gc() } (objectId + 5) -> { - requestGetPartialObject(rx_body) + requestGetPartialObject(rxBody) } (objectId + 8) -> { - checkReplyInnerDevelopStart(rx_body) + checkReplyInnerDevelopStart(rxBody) } else -> { Log.v(TAG, " RECEIVED UNKNOWN ID : $id") @@ -96,9 +96,9 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: } } - override fun onReceiveProgress(currentBytes: Int, totalBytes: Int, rx_body: ByteArray?) + override fun onReceiveProgress(currentBytes: Int, totalBytes: Int, rxBody: ByteArray?) { - val body = cutHeader(rx_body) + val body = cutHeader(rxBody) val length = body?.size ?: 0 Log.v(TAG, " onReceiveProgress() $currentBytes/$totalBytes ($length bytes.)") callback?.onProgress(body, length, object : IProgressEvent @@ -109,13 +109,13 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: }) } - private fun cutHeader(rx_body: ByteArray?): ByteArray? + private fun cutHeader(rxBody: ByteArray?): ByteArray? { - if (rx_body == null) + if (rxBody == null) { return (null) } - val length = rx_body.size + val length = rxBody.size var dataPosition = 0 val byteStream = ByteArrayOutputStream() if (!receivedFirstData) @@ -124,7 +124,7 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: receivedFirstData = true // データを最初に読んだとき。ヘッダ部分を読み飛ばす - dataPosition = rx_body[0].toUByte().toInt() and 0xff + dataPosition = rxBody[0].toUByte().toInt() and 0xff } else if (receivedRemainBytes > 0) { @@ -136,22 +136,22 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: { // 全部コピーする、足りないバイト数は残す receivedRemainBytes = receivedRemainBytes - length - receivedTotalBytes = receivedTotalBytes + rx_body.size - return rx_body + receivedTotalBytes = receivedTotalBytes + rxBody.size + return rxBody } else { - byteStream.write(rx_body, dataPosition, receivedRemainBytes) + byteStream.write(rxBody, dataPosition, receivedRemainBytes) dataPosition = receivedRemainBytes receivedRemainBytes = 0 } } while (dataPosition <= length - 12) { - val bodySize: Int = (rx_body[dataPosition].toUByte().toInt() and 0xff) + (rx_body[dataPosition + 1].toUByte().toInt() and 0xff shl 8) + (rx_body[dataPosition + 2].toUByte().toInt() and 0xff shl 16) + (rx_body[dataPosition + 3].toUByte().toInt() and 0xff shl 24) + val bodySize: Int = (rxBody[dataPosition].toUByte().toInt() and 0xff) + (rxBody[dataPosition + 1].toUByte().toInt() and 0xff shl 8) + (rxBody[dataPosition + 2].toUByte().toInt() and 0xff shl 16) + (rxBody[dataPosition + 3].toUByte().toInt() and 0xff shl 24) if (bodySize <= 12) { - Log.v(TAG, " BODY SIZE IS SMALL : " + dataPosition + " (" + bodySize + ") [" + receivedRemainBytes + "] " + rx_body.size + " ") + Log.v(TAG, " BODY SIZE IS SMALL : " + dataPosition + " (" + bodySize + ") [" + receivedRemainBytes + "] " + rxBody.size + " ") //int startpos = (data_position > 48) ? (data_position - 48) : 0; //SimpleLogDumper.dump_bytes("[xxx]", Arrays.copyOfRange(rx_body, startpos, (data_position + 48))); break @@ -162,16 +162,16 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: if (dataPosition + bodySize > length) { // データがすべてバッファ内になかったときは、バッファすべてコピーして残ったサイズを記憶しておく。 - val copysize = length - (dataPosition + 12) - byteStream.write(rx_body, dataPosition + 12, copysize) - receivedRemainBytes = bodySize - copysize - 12 // マイナス12は、ヘッダ分 - receivedTotalBytes = receivedTotalBytes + copysize - // Log.v(TAG, " --- copy : " + (data_position + 12) + " " + copysize + " remain : " + received_remain_bytes + " body size : " + body_size); + val copySize = length - (dataPosition + 12) + byteStream.write(rxBody, dataPosition + 12, copySize) + receivedRemainBytes = bodySize - copySize - 12 // マイナス12は、ヘッダ分 + receivedTotalBytes = receivedTotalBytes + copySize + // Log.v(TAG, " --- copy : " + (data_position + 12) + " " + copySize + " remain : " + received_remain_bytes + " body size : " + body_size); break } try { - byteStream.write(rx_body, dataPosition + 12, bodySize - 12) + byteStream.write(rxBody, dataPosition + 12, bodySize - 12) dataPosition = dataPosition + bodySize receivedTotalBytes = receivedTotalBytes + 12 //Log.v(TAG, " --- COPY : " + (data_position + 12) + " " + (body_size - 12) + " remain : " + received_remain_bytes); @@ -190,27 +190,27 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: return (isReceiveMulti) } - private fun checkReplyInnerDevelopStart(rx_body: ByteArray?) + private fun checkReplyInnerDevelopStart(rxBody: ByteArray?) { - Log.v(TAG, " getRequestStatusEvent : $objectId (" + (rx_body?.size ?: 0) + ") ") + Log.v(TAG, " getRequestStatusEvent : $objectId (" + (rxBody?.size ?: 0) + ") ") publisher.enqueueCommand(PtpIpCommandGeneric(mine, objectId + 5, isDumpLog, objectId, 0x9116)) // Event Receive } - private fun requestGetPartialObject(rx_body: ByteArray?) { + private fun requestGetPartialObject(rxBody: ByteArray?) { Log.v(TAG, " requestGetPartialObject() : $objectId") - if (rx_body != null) + if (rxBody != null) { - SimpleLogDumper.dump_bytes(" requestGetPartialObject ", Arrays.copyOfRange(rx_body, 0, 64)) + SimpleLogDumper.dump_bytes(" requestGetPartialObject ", Arrays.copyOfRange(rxBody, 0, 64)) } isReceiveMulti = true receivedFirstData = false // 0x9107 : GetPartialObject (元は 0x00020000) var pictureLength: Int - if (rx_body != null && rx_body.size > 52) + if (rxBody != null && rxBody.size > 52) { val dataIndex = 48 - pictureLength = (rx_body[dataIndex].toUByte().toInt() and 0xff) + (rx_body[dataIndex + 1].toUByte().toInt() and 0xff shl 8) + (rx_body[dataIndex + 2].toUByte().toInt() and 0xff shl 16) + (rx_body[dataIndex + 3].toUByte().toInt() and 0xff shl 24) + pictureLength = (rxBody[dataIndex].toUByte().toInt() and 0xff) + (rxBody[dataIndex + 1].toUByte().toInt() and 0xff shl 8) + (rxBody[dataIndex + 2].toUByte().toInt() and 0xff shl 16) + (rxBody[dataIndex + 3].toUByte().toInt() and 0xff shl 24) } else { @@ -224,9 +224,9 @@ class CanonImageReceiver(private val activity: Activity, private val publisher: publisher.enqueueCommand(PtpIpCommandCanonGetPartialObject(this, objectId + 1, isDumpLog, objectId, 0x01, 0x00, pictureLength, pictureLength)) } - private fun sendTransferComplete(rx_body: ByteArray?) + private fun sendTransferComplete(rxBody: ByteArray?) { - Log.v(TAG, " sendTransferComplete(), id : $objectId size: " + (rx_body?.size ?: 0)) + Log.v(TAG, " sendTransferComplete(), id : $objectId size: " + (rxBody?.size ?: 0)) publisher.enqueueCommand(PtpIpCommandGeneric(this, objectId + 2, isDumpLog, objectId, 0x9117, 4, 0x01)) // 0x9117 : TransferComplete isReceiveMulti = false } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonPlaybackControl.java index 08b97a0..60ef629 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonPlaybackControl.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/playback/CanonPlaybackControl.java @@ -1,10 +1,10 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.playback; -import android.app.Activity; import android.content.SharedPreferences; import android.graphics.Color; import android.util.Log; +import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; import net.osdn.gokigen.pkremote.IInformationReceiver; @@ -29,7 +29,7 @@ import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor; public class CanonPlaybackControl implements IPlaybackControl { private final String TAG = toString(); - private final Activity activity; + private final AppCompatActivity activity; private final PtpIpInterfaceProvider provider; private final CanonFullImageReceiver fullImageReceiver; private final ICanonImageReceiver smallImageReciever; @@ -38,7 +38,7 @@ public class CanonPlaybackControl implements IPlaybackControl private final CanonImageObjectReceiver canonImageObjectReceiver; private int smallImageSequence = 0; - public CanonPlaybackControl(Activity activity, PtpIpInterfaceProvider provider) + public CanonPlaybackControl(AppCompatActivity activity, PtpIpInterfaceProvider provider) { int delayMs = 20; try @@ -234,12 +234,7 @@ public class CanonPlaybackControl implements IPlaybackControl } try { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - canonImageObjectReceiver.getCameraContents(callback); - } - }); + Thread thread = new Thread(() -> canonImageObjectReceiver.getCameraContents(callback)); thread.start(); } catch (Exception e) diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusChecker.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusChecker.java index 0a2f43f..0fc63f0 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusChecker.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusChecker.java @@ -1,16 +1,16 @@ package net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.status; -import android.app.Activity; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import net.osdn.gokigen.pkremote.camera.interfaces.liveview.ICameraStatusUpdateNotify; import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatus; import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatusWatcher; +import net.osdn.gokigen.pkremote.camera.vendor.ptpip.IPtpIpInterfaceProvider; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommand; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommandCallback; -import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpCommandPublisher; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.IPtpIpMessages; import net.osdn.gokigen.pkremote.camera.vendor.ptpip.wrapper.command.messages.specific.CanonInitEventRequest; @@ -30,27 +30,23 @@ public class PtpIpStatusChecker implements IPtpIpCommandCallback, ICameraStatusW private static final int BUFFER_SIZE = 1024 * 1024 + 8; private static final int STATUS_MESSAGE_HEADER_SIZE = 14; - private int sleepMs; - private final IPtpIpCommandPublisher issuer; + private final IPtpIpInterfaceProvider interfaceProvider; private ICameraStatusUpdateNotify notifier = null; - private PtpIpStatusHolder statusHolder; + private final PtpIpStatusHolder statusHolder; private boolean whileFetching = false; - private boolean logcat = false; - private final String ipAddress; - private final int portNumber; + private final boolean logcat; private Socket socket = null; private DataOutputStream dos = null; private BufferedReader bufferedReader = null; private int eventConnectionNumber = 0; - public PtpIpStatusChecker(@NonNull Activity activity, @NonNull IPtpIpCommandPublisher issuer, @NonNull String ip, int portNumber) + public PtpIpStatusChecker(@NonNull AppCompatActivity activity, @NonNull IPtpIpInterfaceProvider interfaceProvider, boolean logcat) { - this.issuer = issuer; + this.interfaceProvider = interfaceProvider; this.statusHolder = new PtpIpStatusHolder(); - this.ipAddress = ip; - this.portNumber = portNumber; - Log.v(TAG, "POLLING WAIT : " + sleepMs); + this.logcat = logcat; + Log.v(TAG, "PtpIpStatusChecker() "); } @Override @@ -164,19 +160,21 @@ public class PtpIpStatusChecker implements IPtpIpCommandCallback, ICameraStatusW } try { - final IPtpIpCommandCallback callback = this; this.notifier = notifier; whileFetching = true; // セッションをオープンする - boolean isConnect = connect(); + String ip = interfaceProvider.getIpAddress(); + int port = interfaceProvider.getEventPortNumber(); + boolean isConnect = connect(ip, port); if (!isConnect) { - Log.v(TAG, " CONNECT FAIL...(EVENT) : " + ipAddress + " " + portNumber); + Log.v(TAG, " CONNECT FAIL...(EVENT) : " + ip + " " + port); } issueCommand(new CanonInitEventRequest(this, eventConnectionNumber)); /* + final IPtpIpCommandCallback callback = this; Thread thread = new Thread(new Runnable() { @Override @@ -213,7 +211,7 @@ public class PtpIpStatusChecker implements IPtpIpCommandCallback, ICameraStatusW @Override public void stopStatusWatch() { - Log.v(TAG, "stoptStatusWatch()"); + Log.v(TAG, "stopStatusWatch()"); whileFetching = false; this.notifier = null; } @@ -226,11 +224,11 @@ public class PtpIpStatusChecker implements IPtpIpCommandCallback, ICameraStatusW } } - private boolean connect() + private boolean connect(String ip, int port) { try { - socket = new Socket(ipAddress, portNumber); + socket = new Socket(ip, port); return (true); } catch (Exception e) diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusHolder.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusHolder.java index 6d3e0e8..2088c21 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusHolder.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/ptpip/wrapper/status/PtpIpStatusHolder.java @@ -15,8 +15,8 @@ import java.util.Locale; class PtpIpStatusHolder implements IPtpIpCameraProperties { private final String TAG = toString(); - private SparseIntArray statusHolder; - private SparseArrayCompat statusNameArray; + private final SparseIntArray statusHolder; + private final SparseArrayCompat statusNameArray; PtpIpStatusHolder() { -- 2.11.0