1 package net.osdn.gokigen.gr2control.camera.olympus.wrapper.connection;
3 import android.app.Activity;
4 import android.content.BroadcastReceiver;
5 import android.content.Context;
6 import android.content.DialogInterface;
7 import android.content.Intent;
8 import android.content.IntentFilter;
9 import android.net.ConnectivityManager;
10 import android.net.wifi.WifiInfo;
11 import android.net.wifi.WifiManager;
12 import android.provider.Settings;
13 import android.util.Log;
15 import net.osdn.gokigen.gr2control.R;
16 import net.osdn.gokigen.gr2control.camera.ICameraConnection;
17 import net.osdn.gokigen.gr2control.camera.ICameraStatusReceiver;
19 import java.util.concurrent.Executor;
20 import java.util.concurrent.Executors;
22 import androidx.appcompat.app.AlertDialog;
23 import jp.co.olympus.camerakit.OLYCamera;
24 import jp.co.olympus.camerakit.OLYCameraConnectionListener;
25 import jp.co.olympus.camerakit.OLYCameraKitException;
32 public class OlyCameraConnection implements ICameraConnection, OLYCameraConnectionListener
34 private final String TAG = toString();
35 private final Activity context;
36 private final OLYCamera camera;
37 private final Executor cameraExecutor = Executors.newFixedThreadPool(1);
38 private final BroadcastReceiver connectionReceiver;
39 private final ICameraStatusReceiver statusReceiver;
41 //private boolean isWatchingWifiStatus = false;
42 private CameraConnectionStatus connectionStatus = CameraConnectionStatus.UNKNOWN;
44 //private ConnectivityManager connectivityManager;
45 //private ConnectivityManager.NetworkCallback networkCallback = null;
47 // Handler for dealing with network connection timeouts.
48 // private Handler networkConnectionTimeoutHandler;
50 // Message to notify the network request timout handler that too much time has passed.
51 //private static final int MESSAGE_CONNECTIVITY_TIMEOUT = 1;
57 public OlyCameraConnection(final Activity context, OLYCamera camera, ICameraStatusReceiver statusReceiver)
59 Log.v(TAG, "OlyCameraConnection()");
60 this.context = context;
62 this.camera.setConnectionListener(this);
64 ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
65 Handler networkConnectionTimeoutHandler = new Handler()
68 public void handleMessage(Message msg)
72 case MESSAGE_CONNECTIVITY_TIMEOUT:
73 Log.d(TAG, "Network connection timeout");
74 alertConnectingFailed(context.getString(R.string.network_connection_timeout));
75 connectionStatus = CameraConnectionStatus.DISCONNECTED;
81 this.statusReceiver = statusReceiver;
82 connectionReceiver = new BroadcastReceiver()
85 public void onReceive(Context context, Intent intent)
87 onReceiveBroadcastOfConnection(context, intent);
94 * Wifiが使える状態だったら、カメラと接続して動作するよ
97 private void onReceiveBroadcastOfConnection(Context context, Intent intent)
99 statusReceiver.onStatusNotify(context.getString(R.string.connect_check_wifi));
100 Log.v(TAG,context.getString(R.string.connect_check_wifi));
102 String action = intent.getAction();
105 if ((action != null)&&(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)))
107 Log.v(TAG, "onReceiveBroadcastOfConnection() : CONNECTIVITY_ACTION");
109 WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
110 if (wifiManager != null) {
111 WifiInfo info = wifiManager.getConnectionInfo();
112 if (wifiManager.isWifiEnabled() && info != null) {
113 if (info.getNetworkId() != -1) {
114 Log.v(TAG, "Network ID is -1, there is no currently connected network.");
116 // 自動接続が指示されていた場合は、カメラとの接続処理を行う
120 Log.v(TAG, "NETWORK INFO IS NULL.");
122 Log.v(TAG, "isWifiEnabled : " + wifiManager.isWifiEnabled() + " NetworkId : " + info.getNetworkId());
130 Log.w(TAG, "onReceiveBroadcastOfConnection() EXCEPTION" + e.getMessage());
137 * (接続の実処理は onReceiveBroadcastOfConnection() で実施)
140 public void startWatchWifiStatus(Context context)
142 Log.v(TAG, "startWatchWifiStatus()");
143 statusReceiver.onStatusNotify("prepare");
145 IntentFilter filter = new IntentFilter();
146 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
147 filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
148 context.registerReceiver(connectionReceiver, filter);
155 public void stopWatchWifiStatus(Context context)
157 Log.v(TAG, "stopWatchWifiStatus()");
158 context.unregisterReceiver(connectionReceiver);
165 * @param powerOff 真ならカメラの電源オフを伴う
168 public void disconnect(final boolean powerOff)
170 Log.v(TAG, "disconnect()");
171 disconnectFromCamera(powerOff);
172 connectionStatus = CameraConnectionStatus.DISCONNECTED;
173 statusReceiver.onCameraDisconnected();
180 public void connect() {
185 public CameraConnectionStatus getConnectionStatus()
187 return (connectionStatus);
195 public void forceUpdateConnectionStatus(CameraConnectionStatus status)
197 connectionStatus = status;
202 * カメラの通信状態変化を監視するためのインターフェース
204 * @param camera 例外が発生した OLYCamera
208 public void onDisconnectedByError(OLYCamera camera, OLYCameraKitException e)
210 Log.v(TAG, "onDisconnectedByError()");
211 connectionStatus = CameraConnectionStatus.DISCONNECTED;
214 statusReceiver.onCameraDisconnected();
220 private void disconnectFromCamera(final boolean powerOff)
222 Log.v(TAG, "disconnectFromCamera()");
225 cameraExecutor.execute(new CameraDisconnectSequence(camera, powerOff));
236 private void connectToCamera()
238 Log.v(TAG, "connectToCamera()");
239 connectionStatus = CameraConnectionStatus.CONNECTING;
242 cameraExecutor.execute(new CameraConnectSequence(context, camera, statusReceiver));
246 Log.v(TAG, "connectToCamera() EXCEPTION : " + e.getMessage());
254 * @param message 表示用のメッセージ
257 public void alertConnectingFailed(String message)
259 final AlertDialog.Builder builder = new AlertDialog.Builder(context)
260 .setTitle(context.getString(R.string.dialog_title_connect_failed))
262 .setPositiveButton(context.getString(R.string.dialog_title_button_retry), new DialogInterface.OnClickListener() {
264 public void onClick(DialogInterface dialog, int which)
269 .setNeutralButton(R.string.dialog_title_button_network_settings, new DialogInterface.OnClickListener() {
271 public void onClick(DialogInterface dialog, int which)
276 context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
278 catch (android.content.ActivityNotFoundException ex)
280 // Activity が存在しなかった...設定画面が起動できなかった
281 Log.v(TAG, "android.content.ActivityNotFoundException...");
283 // この場合は、再試行と等価な動きとする
292 context.runOnUiThread(new Runnable()