package net.osdn.gokigen.a01d;
import android.Manifest;
+import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import net.osdn.gokigen.a01d.preference.theta.ThetaPreferenceFragment;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
* A01d ;
*
*/
-public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver, IChangeScene, ICameraPowerOn.PowerOnCameraCallback, IInformationReceiver
+public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver, IChangeScene, ICameraPowerOn.PowerOnCameraCallback, IInformationReceiver, ICardSlotSelector
{
private final String TAG = toString();
private IInterfaceProvider interfaceProvider = null;
private LogCatFragment logCatFragment = null;
private LiveViewFragment liveViewFragment = null;
+
@Override
+ @SuppressLint("InlinedApi")
protected void onCreate(Bundle savedInstanceState)
{
final int REQUEST_NEED_PERMISSIONS = 1010;
(ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) ||
(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) ||
(ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED)) {
+
ActivityCompat.requestPermissions(this,
+
new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
{
try
{
- interfaceProvider = new CameraInterfaceProvider(this, this, this);
+ interfaceProvider = new CameraInterfaceProvider(this, this, this, this);
}
catch (Exception e)
{
@Override
public void changeSceneToCameraPropertyList()
{
+/*
try
{
ICameraConnection.CameraConnectionMethod method = interfaceProvider.getCammeraConnectionMethod();
-
}
catch (Exception e)
{
e.printStackTrace();
}
+*/
}
/**
}
/**/
}
+
+ @Override
+ public void setupSlotSelector(boolean isEnable, @Nullable ICardSlotSelectionReceiver slotSelectionReceiver)
+ {
+ // 特に何もしない
+ }
+
+ @Override
+ public void selectSlot(@NonNull String slotId)
+ {
+ // 特に何もしない
+ }
+
+ @Override
+ public void changedCardSlot(@NonNull String slotId)
+ {
+ // 特に何もしない
+ }
}
--- /dev/null
+package net.osdn.gokigen.a01d;
+
+public interface ICardSlotSelectionReceiver
+{
+ void slotSelected(String slotId);
+}
--- /dev/null
+package net.osdn.gokigen.a01d;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public interface ICardSlotSelector
+{
+ void setupSlotSelector(boolean isEnable, @Nullable ICardSlotSelectionReceiver slotSelectionReceiver);
+ void selectSlot(@NonNull String slotId);
+ void changedCardSlot(@NonNull String slotId);
+}
import android.app.Activity;
import android.content.SharedPreferences;
+import net.osdn.gokigen.a01d.ICardSlotSelector;
import net.osdn.gokigen.a01d.IInformationReceiver;
import net.osdn.gokigen.a01d.camera.canon.wrapper.CanonInterfaceProvider;
import net.osdn.gokigen.a01d.camera.fujix.IFujiXInterfaceProvider;
private final NikonInterfaceProvider nikon;
private final CameraStatusListener statusListener;
- public CameraInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull IInformationReceiver informationReceiver)
+ public CameraInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull IInformationReceiver informationReceiver, @NonNull ICardSlotSelector cardSlotSelector)
{
this.context = context;
this.statusListener = new CameraStatusListener();
olympusPen = new OlympusPenInterfaceProvider(context, provider, statusListener);
sony = new SonyCameraWrapper(context, provider, statusListener);
fujiX = new FujiXInterfaceProvider(context, provider, statusListener);
- panasonic = new PanasonicCameraWrapper(context, provider, statusListener);
+ panasonic = new PanasonicCameraWrapper(context, provider, statusListener, cardSlotSelector);
ricohGr2 = new RicohGr2InterfaceProvider(context, provider);
theta = new ThetaInterfaceProvider(context, provider, statusListener);
canon = new CanonInterfaceProvider(context, provider, statusListener, informationReceiver);
import android.app.Activity;
import android.util.Log;
+import net.osdn.gokigen.a01d.ICardSlotSelector;
import net.osdn.gokigen.a01d.camera.ICameraChangeListener;
import net.osdn.gokigen.a01d.camera.ICameraConnection;
import net.osdn.gokigen.a01d.camera.ICameraInformation;
private static final int TIMEOUT_MS = 3000;
private final ICameraStatusReceiver provider;
private final ICameraChangeListener listener;
+ private final ICardSlotSelector cardSlotSelector;
private IPanasonicCamera panasonicCamera = null;
//private IPanasonicCameraApi panasonicCameraApi = null;
private ICameraEventObserver eventObserver = null;
private PanasonicCameraZoomLensControl zoomControl = null;
private PanasonicCameraConnection cameraConnection = null;
- public PanasonicCameraWrapper(final Activity context, final ICameraStatusReceiver statusReceiver , final @NonNull ICameraChangeListener listener)
+ public PanasonicCameraWrapper(final Activity context, final ICameraStatusReceiver statusReceiver , final @NonNull ICameraChangeListener listener, @NonNull ICardSlotSelector cardSlotSelector)
{
this.context = context;
this.provider = statusReceiver;
this.listener = listener;
+ this.cardSlotSelector = cardSlotSelector;
}
@Override
//this.panasonicCameraApi = PanasonicCameraApi.newInstance(panasonicCamera);
if (eventObserver == null)
{
- eventObserver = CameraEventObserver.newInstance(context, panasonicCamera);
+ eventObserver = CameraEventObserver.newInstance(context, panasonicCamera, cardSlotSelector);
}
if (liveViewControl == null)
{
import android.os.Handler;
import android.util.Log;
+import net.osdn.gokigen.a01d.ICardSlotSelector;
import net.osdn.gokigen.a01d.camera.ICameraChangeListener;
import net.osdn.gokigen.a01d.camera.panasonic.wrapper.IPanasonicCamera;
+import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
public class CameraEventObserver implements ICameraEventObserver
{
private static final String TAG = CameraEventObserver.class.getSimpleName();
+ private static final int TIMEOUT_MS = 3000;
+ private final CameraStatusHolder statusHolder;
private boolean isEventMonitoring;
private boolean isActive;
private final IPanasonicCamera remote;
- // private final ReplyJsonParser replyParser;
- private String eventVersion = "1.1"; // 初期値を "1.0" から "1.1" に更新
- public static ICameraEventObserver newInstance(@NonNull Context context, @NonNull IPanasonicCamera apiClient)
+ public static ICameraEventObserver newInstance(@NonNull Context context, @NonNull IPanasonicCamera apiClient, @NonNull ICardSlotSelector cardSlotSelector)
{
- return (new CameraEventObserver(context, apiClient));
+ return (new CameraEventObserver(context, apiClient, cardSlotSelector));
}
- private CameraEventObserver(@NonNull Context context, @NonNull IPanasonicCamera apiClient)
+ private CameraEventObserver(@NonNull Context context, @NonNull IPanasonicCamera apiClient, @NonNull ICardSlotSelector cardSlotSelector)
{
super();
remote = apiClient;
- //replyParser = new ReplyJsonParser(new Handler(context.getMainLooper()));
+ statusHolder = new CameraStatusHolder(context, apiClient, cardSlotSelector);
isEventMonitoring = false;
isActive = false;
}
Log.w(TAG, "start() observer is not active.");
return (false);
}
-
if (isEventMonitoring)
{
Log.w(TAG, "start() already starting.");
return (false);
}
+ isEventMonitoring = true;
- isEventMonitoring = false;
try
{
Thread thread = new Thread()
public void run()
{
Log.d(TAG, "start() exec.");
- boolean firstCall = true;
- MONITORLOOP: while (isEventMonitoring)
+ while (isEventMonitoring)
{
- // At first, call as non-Long Polling.
- boolean longPolling = !firstCall;
try
{
-/*
- // Call getEvent API.
- JSONObject replyJson = remoteApi.getEvent(eventVersion, longPolling);
-
- // Check error code at first.
- int errorCode = findErrorCode(replyJson);
- Log.d(TAG, "getEvent errorCode: " + errorCode);
- switch (errorCode) {
- case 0: // no error
- // Pass through.
- break;
- case 1: // "Any" error
- case 12: // "No such method" error
- if (eventVersion.equals("1.1"))
- {
- // "1.1" でエラーが発生した時には "1.0" にダウングレードして再実行
- eventVersion = "1.0";
- continue MONITORLOOP;
- }
- replyParser.fireResponseErrorListener();
- break MONITORLOOP; // end monitoring.
-
- case 2: // "Timeout" error
- // Re-call immediately.
- continue MONITORLOOP;
-
- case 40402: // "Already polling" error
- // Retry after 5 sec.
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- // do nothing.
- }
- continue MONITORLOOP;
-
- default:
- Log.w(TAG, "SimpleCameraEventObserver: Unexpected error: " + errorCode);
- replyParser.fireResponseErrorListener();
- break MONITORLOOP; // end monitoring.
- }
-
- // parse
- replyParser.parse(replyJson);
-*/
+ // parse reply message
+ statusHolder.parse(SimpleHttpClient.httpGet(remote.getCmdUrl() + "cam.cgi?mode=getstate", TIMEOUT_MS));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ try
+ {
+ Thread.sleep(1000);
}
catch (Exception e)
{
e.printStackTrace();
}
- firstCall = false;
- } // MONITORLOOP end.
+ }
isEventMonitoring = false;
}
};
{
try
{
- //replyParser.setEventChangeListener(listener);
+ statusHolder.setEventChangeListener(listener);
}
catch (Exception e)
{
{
try
{
- //replyParser.clearEventChangeListener();
+ statusHolder.clearEventChangeListener();
}
catch (Exception e)
{
@Override
public ICameraStatusHolder getCameraStatusHolder()
{
- return (null);
- //return (replyParser);
+ return (statusHolder);
}
@Override
isActive = true;
}
- private static int findErrorCode(JSONObject replyJson)
- {
- int code = 0; // 0 means no error.
- try
- {
- if (replyJson.has("error"))
- {
- JSONArray errorObj = replyJson.getJSONArray("error");
- code = errorObj.getInt(0);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- code = -1;
- }
- return (code);
- }
}
package net.osdn.gokigen.a01d.camera.panasonic.wrapper.eventlistener;
+import android.content.Context;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.a01d.ICardSlotSelectionReceiver;
+import net.osdn.gokigen.a01d.ICardSlotSelector;
+import net.osdn.gokigen.a01d.camera.ICameraChangeListener;
+import net.osdn.gokigen.a01d.camera.panasonic.wrapper.IPanasonicCamera;
+import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient;
+
import java.util.List;
-public class CameraStatusHolder implements ICameraStatusHolder
+public class CameraStatusHolder implements ICameraStatusHolder, ICardSlotSelectionReceiver
{
+ private static final String TAG = CameraStatusHolder.class.getSimpleName();
+ private final Context context;
+ private final IPanasonicCamera remote;
+ private static final int TIMEOUT_MS = 3000;
+ private final ICardSlotSelector cardSlotSelector;
+ private ICameraChangeListener listener = null;
+ private String current_sd = "sd1";
+ private boolean isInitialized = false;
+ private boolean isDualSlot = false;
+
+ CameraStatusHolder(@NonNull Context context, @NonNull IPanasonicCamera apiClient, @NonNull ICardSlotSelector cardSlotSelector)
+ {
+ this.context = context;
+ this.remote = apiClient;
+ this.cardSlotSelector = cardSlotSelector;
+
+ }
+
+ void parse(String reply)
+ {
+ try
+ {
+ // Log.v(TAG, " getState : " + reply);
+
+ boolean isEnableDualSlot = false;
+ if (reply.contains("<sd_memory>set</sd_memory>") && (reply.contains("<sd2_memory>set</sd2_memory>")))
+ {
+ // カードが2枚刺さっている場合...
+ isEnableDualSlot = true;
+ }
+ if ((!isInitialized)||(isDualSlot != isEnableDualSlot))
+ {
+ // 初回だけの実行...
+ if (isEnableDualSlot)
+ {
+ // カードが2枚刺さっている場合...
+ cardSlotSelector.setupSlotSelector(true, this);
+ }
+ else
+ {
+ // カードが1つしか刺さっていない場合...
+ cardSlotSelector.setupSlotSelector(false, null);
+ }
+ isInitialized = true;
+ isDualSlot = isEnableDualSlot;
+ }
+ checkCurrentSlot(reply);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ private void checkCurrentSlot(String reply)
+ {
+ try
+ {
+ String header = "<current_sd>";
+ int indexStart = reply.indexOf(header);
+ int indexEnd = reply.indexOf("</current_sd>");
+ if ((indexStart > 0)&&(indexEnd > 0)&&(indexStart < indexEnd))
+ {
+ String currentSlot = reply.substring(indexStart + header.length(), indexEnd);
+ if (!current_sd.equals(currentSlot))
+ {
+ current_sd = currentSlot;
+ cardSlotSelector.changedCardSlot(current_sd);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ void setEventChangeListener(@NonNull ICameraChangeListener listener)
+ {
+ this.listener = listener;
+ }
+
+ void clearEventChangeListener()
+ {
+ this.listener = null;
+ }
+
@Override
public String getCameraStatus()
{
@Override
public String getStorageId()
{
- return (null);
+ return (current_sd);
+ }
+
+ @Override
+ public void slotSelected(@NonNull String slotId)
+ {
+ Log.v(TAG, " slotSelected : " + slotId);
+ if (!current_sd.equals(slotId))
+ {
+ // スロットを変更したい!
+ requestToChangeSlot(slotId);
+ }
+ }
+
+
+ private void requestToChangeSlot(final String slotId)
+ {
+ try
+ {
+ Thread thread = new Thread(new Runnable() {
+ @Override
+ public void run()
+ {
+ try
+ {
+ boolean loop = true;
+ while (loop)
+ {
+ String reply = SimpleHttpClient.httpGet(remote.getCmdUrl() + "cam.cgi?mode=setsetting&type=current_sd&value=" + slotId, TIMEOUT_MS);
+ if (reply.indexOf("<result>ok</result>") > 0)
+ {
+ loop = false;
+ cardSlotSelector.selectSlot(slotId);
+ }
+ else
+ {
+ Thread.sleep(1000); // 1秒待つ
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ });
+ thread.start();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
}