OSDN Git Service

aa01ee2e627e08c786733fe8d80a2e84d3a21bcc
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / camera / vendor / pixpro / wrapper / connection / PixproCameraConnection.kt
1 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.connection
2
3 import android.content.*
4 import android.net.ConnectivityManager
5 import android.net.wifi.WifiManager
6 import android.provider.Settings
7 import android.util.Log
8 import androidx.appcompat.app.AlertDialog
9 import androidx.appcompat.app.AppCompatActivity
10 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraConnection
11 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraConnectionStatus
12 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusReceiver
13 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.IPixproInternalInterfaces
14 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status.PixproStatusChecker
15 import jp.osdn.gokigen.gokigenassets.constants.IStringResourceConstantConvert
16 import java.lang.Exception
17 import java.util.concurrent.Executor
18 import java.util.concurrent.Executors
19
20 class PixproCameraConnection(private val context: AppCompatActivity, private val statusReceiver: ICameraStatusReceiver, private val interfaceProvider : IPixproInternalInterfaces, private val statusChecker: PixproStatusChecker) : ICameraConnection
21 {
22     companion object
23     {
24         private val TAG = PixproCameraConnection::class.java.simpleName
25     }
26     private val connectionReceiver: BroadcastReceiver
27     private val cameraExecutor: Executor = Executors.newFixedThreadPool(1)
28     private var connectionStatus: ICameraConnectionStatus.CameraConnectionStatus = ICameraConnectionStatus.CameraConnectionStatus.UNKNOWN
29     init
30     {
31         Log.v(TAG, "PixproConnection()")
32         connectionReceiver = object : BroadcastReceiver() {
33             override fun onReceive(context: Context, intent: Intent)
34             {
35                 onReceiveBroadcastOfConnection(context, intent)
36             }
37         }
38      }
39
40     /**
41      *
42      *
43      */
44     private fun onReceiveBroadcastOfConnection(context: Context, intent: Intent)
45     {
46         statusReceiver.onStatusNotify(context.getString(IStringResourceConstantConvert.ID_STRING_CONNECT_CHECK_WIFI))
47         Log.v(TAG, context.getString(IStringResourceConstantConvert.ID_STRING_CONNECT_CHECK_WIFI))
48         try
49         {
50             val action = intent.action
51             if (action == null)
52             {
53                 Log.v(TAG, "intent.getAction() : null")
54                 return
55             }
56
57             @Suppress("DEPRECATION")
58             if (action == ConnectivityManager.CONNECTIVITY_ACTION)
59             {
60                 Log.v(TAG, "onReceiveBroadcastOfConnection() : CONNECTIVITY_ACTION")
61                 val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
62                 val info = wifiManager.connectionInfo
63                 if (wifiManager.isWifiEnabled && info != null)
64                 {
65                     Log.v(TAG, "Network ID is " + info.networkId)
66                     // 自動接続が指示されていた場合は、カメラとの接続処理を行う
67                     connectToCamera()
68                 }
69                 else
70                 {
71                     if (info == null)
72                     {
73                         Log.v(TAG, "NETWORK INFO IS NULL.")
74                     }
75                     else
76                     {
77                         Log.v(TAG, "isWifiEnabled : " + wifiManager.isWifiEnabled + " NetworkId : " + info.networkId)
78                     }
79                 }
80             }
81         }
82         catch (e: Exception)
83         {
84             Log.w(TAG, "onReceiveBroadcastOfConnection() EXCEPTION" + e.message)
85             e.printStackTrace()
86         }
87     }
88
89     fun startWatchWifiStatus(context: Context)
90     {
91         Log.v(TAG, "startWatchWifiStatus()")
92         statusReceiver.onStatusNotify("prepare")
93         val filter = IntentFilter()
94         filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
95         @Suppress("DEPRECATION")
96         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
97         context.registerReceiver(connectionReceiver, filter)
98     }
99
100     fun stopWatchWifiStatus(context: Context)
101     {
102         Log.v(TAG, "stopWatchWifiStatus()")
103         context.unregisterReceiver(connectionReceiver)
104         disconnect(false)
105     }
106
107     fun disconnect(powerOff: Boolean)
108     {
109         Log.v(TAG, "disconnect()")
110         disconnectFromCamera(powerOff)
111         connectionStatus = ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED
112         statusReceiver.onCameraDisconnected()
113     }
114
115     fun connect()
116     {
117         Log.v(TAG, "connect()")
118         connectToCamera()
119     }
120
121     override fun alertConnectingFailed(message: String?)
122     {
123         Log.v(TAG, "alertConnectingFailed() : $message")
124         try
125         {
126             val builder: AlertDialog.Builder = AlertDialog.Builder(context)
127                 .setTitle(context.getString(IStringResourceConstantConvert.ID_STRING_DIALOG_TITLE_CONNECT_FAILED))
128                 .setMessage(message)
129                 .setPositiveButton(context.getString(IStringResourceConstantConvert.ID_STRING_DIALOG_BUTTON_RETRY)) { _, _ -> connect() }
130                 .setNeutralButton(IStringResourceConstantConvert.ID_STRING_DIALOG_BUTTON_NETWORK_SETTINGS) { _, _ ->
131                     try
132                     {
133                         // Wifi 設定画面を表示する
134                         context.startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
135                     }
136                     catch (ex: ActivityNotFoundException)
137                     {
138                         // Activity が存在しなかった...設定画面が起動できなかった
139                         Log.v(TAG, "android.content.ActivityNotFoundException...")
140
141                         // この場合は、再試行と等価な動きとする
142                         connect()
143                     }
144                     catch (e: Exception)
145                     {
146                         e.printStackTrace()
147                     }
148                 }
149             context.runOnUiThread { builder.show() }
150         }
151         catch (e : Exception)
152         {
153             e.printStackTrace()
154         }
155     }
156
157     fun getConnectionStatus(): ICameraConnectionStatus.CameraConnectionStatus
158     {
159         Log.v(TAG, "getConnectionStatus()")
160         return connectionStatus
161     }
162
163     override fun forceUpdateConnectionStatus(status: ICameraConnectionStatus.CameraConnectionStatus)
164     {
165         Log.v(TAG, "forceUpdateConnectionStatus()")
166         connectionStatus = status
167     }
168
169     private fun disconnectFromCamera(powerOff: Boolean)
170     {
171         Log.v(TAG, "disconnectFromCamera()")
172         try
173         {
174             cameraExecutor.execute(PixproCameraDisconnectSequence(context, powerOff, interfaceProvider, statusChecker))
175         }
176         catch (e: Exception)
177         {
178             e.printStackTrace()
179         }
180     }
181
182     private fun connectToCamera()
183     {
184         Log.v(TAG, "connectToCamera()")
185         connectionStatus = ICameraConnectionStatus.CameraConnectionStatus.CONNECTING
186         try
187         {
188             cameraExecutor.execute(PixproCameraConnectSequence(context, statusReceiver, this, interfaceProvider, statusChecker))
189         }
190         catch (e: Exception)
191         {
192             Log.v(TAG, "connectToCamera() EXCEPTION : " + e.message)
193             e.printStackTrace()
194         }
195     }
196
197
198 }