1 package net.osdn.gokigen.a01d.camera.canon.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.content.SharedPreferences;
10 import android.net.ConnectivityManager;
11 import android.net.wifi.WifiInfo;
12 import android.net.wifi.WifiManager;
13 import android.provider.Settings;
14 import android.util.Log;
16 import androidx.annotation.NonNull;
17 import androidx.appcompat.app.AlertDialog;
18 import androidx.preference.PreferenceManager;
20 import net.osdn.gokigen.a01d.R;
21 import net.osdn.gokigen.a01d.camera.ICameraConnection;
22 import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
23 import net.osdn.gokigen.a01d.camera.canon.wrapper.status.CanonStatusChecker;
24 import net.osdn.gokigen.a01d.camera.ptpip.IPtpIpInterfaceProvider;
25 import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
27 import java.util.concurrent.Executor;
28 import java.util.concurrent.Executors;
30 public class CanonConnection implements ICameraConnection
32 private final String TAG = toString();
33 private final Activity context;
34 private final ICameraStatusReceiver statusReceiver;
35 private final IPtpIpInterfaceProvider interfaceProvider;
36 private final BroadcastReceiver connectionReceiver;
37 private final Executor cameraExecutor = Executors.newFixedThreadPool(1);
38 private final CanonStatusChecker statusChecker;
39 private CameraConnectionStatus connectionStatus = CameraConnectionStatus.UNKNOWN;
41 public CanonConnection(@NonNull final Activity context, @NonNull final ICameraStatusReceiver statusReceiver, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull CanonStatusChecker statusChecker)
43 Log.v(TAG, "CanonConnection()");
44 this.context = context;
45 this.statusReceiver = statusReceiver;
46 this.interfaceProvider = interfaceProvider;
47 this.statusChecker = statusChecker;
48 connectionReceiver = new BroadcastReceiver()
51 public void onReceive(Context context, Intent intent)
53 onReceiveBroadcastOfConnection(context, intent);
62 private void onReceiveBroadcastOfConnection(Context context, Intent intent)
64 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_check_wifi), false, false, 0);
65 statusReceiver.onStatusNotify(context.getString(R.string.connect_check_wifi));
67 Log.v(TAG, context.getString(R.string.connect_check_wifi));
69 String action = intent.getAction();
72 Log.v(TAG, "intent.getAction() : null");
78 if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
80 Log.v(TAG, "onReceiveBroadcastOfConnection() : CONNECTIVITY_ACTION");
82 WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
83 if (wifiManager != null) {
84 WifiInfo info = wifiManager.getConnectionInfo();
85 if (wifiManager.isWifiEnabled() && info != null) {
86 if (info.getNetworkId() != -1) {
87 Log.v(TAG, "Network ID is -1, there is no currently connected network.");
89 // 自動接続が指示されていた場合は、カメラとの接続処理を行う
93 Log.v(TAG, "NETWORK INFO IS NULL.");
95 Log.v(TAG, "isWifiEnabled : " + wifiManager.isWifiEnabled() + " NetworkId : " + info.getNetworkId());
100 } catch (Exception e) {
101 Log.w(TAG, "onReceiveBroadcastOfConnection() EXCEPTION" + e.getMessage());
107 public void startWatchWifiStatus(Context context)
109 Log.v(TAG, "startWatchWifiStatus()");
110 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_prepare), false, false, 0);
111 statusReceiver.onStatusNotify("prepare");
113 IntentFilter filter = new IntentFilter();
114 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
115 filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
116 context.registerReceiver(connectionReceiver, filter);
120 public void stopWatchWifiStatus(Context context)
122 Log.v(TAG, "stopWatchWifiStatus()");
123 context.unregisterReceiver(connectionReceiver);
128 public void disconnect(boolean powerOff)
130 Log.v(TAG, "disconnect()");
131 disconnectFromCamera(powerOff);
132 connectionStatus = CameraConnectionStatus.DISCONNECTED;
133 statusReceiver.onCameraDisconnected();
137 public void connect()
139 Log.v(TAG, "connect()");
144 public void alertConnectingFailed(String message)
146 Log.v(TAG, "alertConnectingFailed() : " + message);
147 final AlertDialog.Builder builder = new AlertDialog.Builder(context)
148 .setTitle(context.getString(R.string.dialog_title_connect_failed_canon))
150 .setPositiveButton(context.getString(R.string.dialog_title_button_retry), new DialogInterface.OnClickListener() {
152 public void onClick(DialogInterface dialog, int which)
158 .setNeutralButton(R.string.dialog_title_button_network_settings, new DialogInterface.OnClickListener() {
160 public void onClick(DialogInterface dialog, int which)
165 context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
167 catch (android.content.ActivityNotFoundException ex)
169 // Activity が存在しなかった...設定画面が起動できなかった
170 Log.v(TAG, "android.content.ActivityNotFoundException...");
172 // この場合は、再試行と等価な動きとする
181 context.runOnUiThread(new Runnable()
199 public CameraConnectionStatus getConnectionStatus()
201 Log.v(TAG, " getConnectionStatus()");
202 return (connectionStatus);
206 public void forceUpdateConnectionStatus(CameraConnectionStatus status)
208 Log.v(TAG, " forceUpdateConnectionStatus()");
209 connectionStatus = status;
215 private void disconnectFromCamera(final boolean powerOff)
217 Log.v(TAG, " disconnectFromCamera() : " + powerOff);
220 cameraExecutor.execute(new CanonCameraDisconnectSequence(interfaceProvider));
231 private void connectToCamera()
233 Log.v(TAG, " connectToCamera()");
234 connectionStatus = CameraConnectionStatus.CONNECTING;
237 if (getConnectSequenceType() == 0)
239 cameraExecutor.execute(new CanonCameraConnectSequence(context, statusReceiver, this, interfaceProvider, statusChecker));
243 cameraExecutor.execute(new CanonCameraConnectSequenceType1(context, statusReceiver, this, interfaceProvider, statusChecker));
248 Log.v(TAG, " connectToCamera() EXCEPTION : " + e.getMessage());
253 private int getConnectSequenceType()
255 int sequenceType = 0;
258 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
259 String sequenceTypeStr = preferences.getString(IPreferencePropertyAccessor.CANON_CONNECTION_SEQUENCE, IPreferencePropertyAccessor.CANON_CONNECTION_SEQUENCE_DEFAULT_VALUE);
260 if (sequenceTypeStr != null)
262 sequenceType = Integer.parseInt(sequenceTypeStr);
264 Log.v(TAG, " Canon ConnectionSequence [" + sequenceType + "] " + sequenceTypeStr);
270 return (sequenceType);