OSDN Git Service

接続シーケンス部分はこれで。
[gokigen/A01d.git] / app / src / main / java / net / osdn / gokigen / a01d / camera / canon / wrapper / connection / CanonConnection.java
1 package net.osdn.gokigen.a01d.camera.canon.wrapper.connection;
2
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;
14
15 import androidx.annotation.NonNull;
16 import androidx.appcompat.app.AlertDialog;
17
18 import net.osdn.gokigen.a01d.R;
19 import net.osdn.gokigen.a01d.camera.ICameraConnection;
20 import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
21 import net.osdn.gokigen.a01d.camera.ptpip.IPtpIpInterfaceProvider;
22 import net.osdn.gokigen.a01d.camera.canon.wrapper.status.CanonStatusChecker;
23
24 import java.util.concurrent.Executor;
25 import java.util.concurrent.Executors;
26
27 public class CanonConnection implements ICameraConnection
28 {
29     private final String TAG = toString();
30     private final Activity context;
31     private final ICameraStatusReceiver statusReceiver;
32     private final IPtpIpInterfaceProvider interfaceProvider;
33     private final BroadcastReceiver connectionReceiver;
34     private final Executor cameraExecutor = Executors.newFixedThreadPool(1);
35     private final CanonStatusChecker statusChecker;
36     private CameraConnectionStatus connectionStatus = CameraConnectionStatus.UNKNOWN;
37
38     public CanonConnection(@NonNull final Activity context, @NonNull final ICameraStatusReceiver statusReceiver, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull CanonStatusChecker statusChecker)
39     {
40         Log.v(TAG, "CanonConnection()");
41         this.context = context;
42         this.statusReceiver = statusReceiver;
43         this.interfaceProvider = interfaceProvider;
44         this.statusChecker = statusChecker;
45         connectionReceiver = new BroadcastReceiver()
46         {
47             @Override
48             public void onReceive(Context context, Intent intent)
49             {
50                 onReceiveBroadcastOfConnection(context, intent);
51             }
52         };
53     }
54
55     /**
56      *
57      *
58      */
59     private void onReceiveBroadcastOfConnection(Context context, Intent intent)
60     {
61         interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_check_wifi), false, false, 0);
62         statusReceiver.onStatusNotify(context.getString(R.string.connect_check_wifi));
63
64         Log.v(TAG, context.getString(R.string.connect_check_wifi));
65
66         String action = intent.getAction();
67         if (action == null)
68         {
69             Log.v(TAG, "intent.getAction() : null");
70             return;
71         }
72
73         try
74         {
75             if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
76             {
77                 Log.v(TAG, "onReceiveBroadcastOfConnection() : CONNECTIVITY_ACTION");
78
79                 WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
80                 if (wifiManager != null) {
81                     WifiInfo info = wifiManager.getConnectionInfo();
82                     if (wifiManager.isWifiEnabled() && info != null) {
83                         if (info.getNetworkId() != -1) {
84                             Log.v(TAG, "Network ID is -1, there is no currently connected network.");
85                         }
86                         // 自動接続が指示されていた場合は、カメラとの接続処理を行う
87                         connectToCamera();
88                     } else {
89                         if (info == null) {
90                             Log.v(TAG, "NETWORK INFO IS NULL.");
91                         } else {
92                             Log.v(TAG, "isWifiEnabled : " + wifiManager.isWifiEnabled() + " NetworkId : " + info.getNetworkId());
93                         }
94                     }
95                 }
96             }
97         } catch (Exception e) {
98             Log.w(TAG, "onReceiveBroadcastOfConnection() EXCEPTION" + e.getMessage());
99             e.printStackTrace();
100         }
101     }
102
103     @Override
104     public void startWatchWifiStatus(Context context)
105     {
106         Log.v(TAG, "startWatchWifiStatus()");
107         interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_prepare), false, false, 0);
108         statusReceiver.onStatusNotify("prepare");
109
110         IntentFilter filter = new IntentFilter();
111         filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
112         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
113         context.registerReceiver(connectionReceiver, filter);
114     }
115
116     @Override
117     public void stopWatchWifiStatus(Context context)
118     {
119         Log.v(TAG, "stopWatchWifiStatus()");
120         context.unregisterReceiver(connectionReceiver);
121         disconnect(false);
122     }
123
124     @Override
125     public void disconnect(boolean powerOff)
126     {
127         Log.v(TAG, "disconnect()");
128         disconnectFromCamera(powerOff);
129         connectionStatus = CameraConnectionStatus.DISCONNECTED;
130         statusReceiver.onCameraDisconnected();
131     }
132
133     @Override
134     public void connect()
135     {
136         Log.v(TAG, "connect()");
137         connectToCamera();
138     }
139
140     @Override
141     public void alertConnectingFailed(String message)
142     {
143         Log.v(TAG, "alertConnectingFailed() : " + message);
144         final AlertDialog.Builder builder = new AlertDialog.Builder(context)
145                 .setTitle(context.getString(R.string.dialog_title_connect_failed_canon))
146                 .setMessage(message)
147                 .setPositiveButton(context.getString(R.string.dialog_title_button_retry), new DialogInterface.OnClickListener() {
148                     @Override
149                     public void onClick(DialogInterface dialog, int which)
150                     {
151                         disconnect(false);
152                         connect();
153                     }
154                 })
155                 .setNeutralButton(R.string.dialog_title_button_network_settings, new DialogInterface.OnClickListener() {
156                     @Override
157                     public void onClick(DialogInterface dialog, int which)
158                     {
159                         try
160                         {
161                             // Wifi 設定画面を表示する
162                             context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
163                         }
164                         catch (android.content.ActivityNotFoundException ex)
165                         {
166                             // Activity が存在しなかった...設定画面が起動できなかった
167                             Log.v(TAG, "android.content.ActivityNotFoundException...");
168
169                             // この場合は、再試行と等価な動きとする
170                             connect();
171                         }
172                         catch (Exception e)
173                         {
174                             e.printStackTrace();
175                         }
176                     }
177                 });
178         context.runOnUiThread(new Runnable()
179         {
180             @Override
181             public void run()
182             {
183                 builder.show();
184             }
185         });
186     }
187
188     @Override
189     public CameraConnectionStatus getConnectionStatus()
190     {
191         Log.v(TAG, " getConnectionStatus()");
192         return (connectionStatus);
193     }
194
195     @Override
196     public void forceUpdateConnectionStatus(CameraConnectionStatus status)
197     {
198         Log.v(TAG, " forceUpdateConnectionStatus()");
199         connectionStatus = status;
200     }
201
202     /**
203      * カメラとの切断処理
204      */
205     private void disconnectFromCamera(final boolean powerOff)
206     {
207         Log.v(TAG, " disconnectFromCamera()");
208         try
209         {
210             cameraExecutor.execute(new CanonCameraDisconnectSequence(context, interfaceProvider));
211         }
212         catch (Exception e)
213         {
214             e.printStackTrace();
215         }
216     }
217
218     /**
219      * カメラとの接続処理
220      */
221     private void connectToCamera()
222     {
223         Log.v(TAG, " connectToCamera()");
224         connectionStatus = CameraConnectionStatus.CONNECTING;
225         try
226         {
227             cameraExecutor.execute(new CanonCameraConnectSequence(context, statusReceiver, this, interfaceProvider, statusChecker));
228         }
229         catch (Exception e)
230         {
231             Log.v(TAG, " connectToCamera() EXCEPTION : " + e.getMessage());
232             e.printStackTrace();
233         }
234     }
235 }