1 package jp.sfjp.gokigen.a01c
3 import android.content.BroadcastReceiver
4 import android.content.Context
5 import android.content.Intent
6 import android.content.IntentFilter
7 import android.net.ConnectivityManager
8 import android.net.ConnectivityManager.NetworkCallback
9 import android.net.Network
10 import android.net.NetworkCapabilities
11 import android.net.NetworkRequest
12 import android.net.wifi.WifiManager
13 import android.os.Handler
14 import android.os.Looper
15 import android.os.Message
16 import android.util.Log
17 import androidx.appcompat.app.AppCompatActivity
18 import java.util.concurrent.TimeUnit
20 class WifiConnection(private val context: AppCompatActivity, private val callback : IWifiConnection)
22 private var isWatchingWifiStatus = false
24 private val connectivityManager: ConnectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
25 private val connectionReceiver: BroadcastReceiver = object : BroadcastReceiver()
27 override fun onReceive(context: Context, intent: Intent)
29 onReceiveBroadcastOfConnection(context, intent)
33 private val networkConnectionTimeoutHandler = object : Handler(Looper.getMainLooper())
35 override fun handleMessage(msg: Message)
38 MESSAGE_CONNECTIVITY_TIMEOUT -> {
39 Log.d(TAG, "Network connection timeout")
40 unregisterNetworkCallback()
46 private val networkCallback = object : NetworkCallback()
48 override fun onAvailable(network: Network) {
49 networkConnectionTimeoutHandler.removeMessages(MESSAGE_CONNECTIVITY_TIMEOUT)
50 context.runOnUiThread {
51 if (!connectivityManager.bindProcessToNetwork(network))
53 Log.e(TAG, "ConnectivityManager.bindProcessToNetwork() requires android.permission.INTERNET")
57 Log.d(TAG, "Network available")
62 override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities)
64 context.runOnUiThread { Log.d(TAG, "Network capabilities changed") }
67 override fun onLost(network: Network)
69 Log.d(TAG, "Network lost")
76 Log.v(TAG, "WifiConnection()")
77 requestHighBandwidthNetwork()
79 Network activeNetwork = connectivityManager.getActiveNetwork();
80 if (activeNetwork != null)
82 int bandwidth = connectivityManager.getNetworkCapabilities(activeNetwork).getLinkDownstreamBandwidthKbps();
83 if (bandwidth < MIN_BANDWIDTH_KBPS)
85 // Request a high-bandwidth network
90 // You already are on a high-bandwidth network, so start your network request
95 Network activeNetwork = connectivityManager.getActiveNetwork();
96 if (activeNetwork != null)
98 int bandwidth = connectivityManager.getNetworkCapabilities(activeNetwork).getLinkDownstreamBandwidthKbps();
99 if (bandwidth < MIN_BANDWIDTH_KBPS)
101 // Request a high-bandwidth network
106 // You already are on a high-bandwidth network, so start your network request
111 // Determine if there is a high-bandwidth network exists. Checks both the active
112 // and bound networks. Returns false if no network is available (low or high-bandwidth).
113 private fun isNetworkHighBandwidth(): Boolean
115 var network: Network? = connectivityManager.boundNetworkForProcess
116 network = network ?: connectivityManager.activeNetwork
121 val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return (false)
122 return (networkCapabilities.linkDownstreamBandwidthKbps >= MIN_NETWORK_BANDWIDTH_KBPS)
126 private fun unregisterNetworkCallback()
128 Log.d(TAG, "Unregistering network callback")
129 connectivityManager.unregisterNetworkCallback(networkCallback)
132 private fun releaseHighBandwidthNetwork()
134 connectivityManager.bindProcessToNetwork(null)
135 unregisterNetworkCallback()
138 private fun addWifiNetwork()
140 // requires android.permission.CHANGE_WIFI_STATE
141 context.applicationContext.startActivity(Intent(ACTION_ADD_NETWORK_SETTINGS))
145 * Wifiが使える状態だったら、カメラと接続して動作するよ
148 @Suppress("DEPRECATION")
149 private fun onReceiveBroadcastOfConnection(context: Context, intent: Intent)
151 Log.v(TAG, context.getString(R.string.connect_check_wifi))
154 val action = intent.action
155 if (action == ConnectivityManager.CONNECTIVITY_ACTION)
157 val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
158 val info = wifiManager.connectionInfo
159 if (wifiManager.isWifiEnabled)
161 if ((info != null)&&(info.networkId != -1))
163 Log.v(TAG, " READY TO CONNECT CAMERA. " + info.networkId)
165 callback.onConnectedToWifi()
169 catch (e : Exception)
177 Log.v(TAG, " requestNetwork()")
178 requestHighBandwidthNetwork()
183 * (接続の実処理は onReceiveBroadcastOfConnection() で実施)
185 @Suppress("DEPRECATION")
186 fun startWatchWifiStatus()
188 Log.v(TAG, "startWatchWifiStatus()")
189 val filter = IntentFilter()
190 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
191 filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
192 context.registerReceiver(connectionReceiver, filter)
193 isWatchingWifiStatus = true
199 fun stopWatchWifiStatus()
201 Log.v(TAG, "stopWatchWifiStatus()")
202 context.unregisterReceiver(connectionReceiver)
203 isWatchingWifiStatus = false
207 * Wifi接続状態の監視処理を行っているかどうか
209 * @return true : 監視中 / false : 停止中
211 fun isWatchWifiStatus(): Boolean
213 return isWatchingWifiStatus
216 private fun requestHighBandwidthNetwork()
218 // Before requesting a high-bandwidth network, ensure prior requests are invalidated.
219 unregisterNetworkCallback()
220 Log.d(TAG, "requestHighBandwidthNetwork(): Requesting high-bandwidth network")
222 // Requesting an unmetered network may prevent you from connecting to the cellular
223 // network on the user's watch or phone; however, unless you explicitly ask for permission
224 // to a access the user's cellular network, you should request an unmetered network.
225 val request = NetworkRequest.Builder()
226 .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
227 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
228 .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
229 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
232 // requires android.permission.CHANGE_NETWORK_STATE
233 connectivityManager.requestNetwork(request, networkCallback)
234 networkConnectionTimeoutHandler.sendMessageDelayed(networkConnectionTimeoutHandler.obtainMessage(MESSAGE_CONNECTIVITY_TIMEOUT), NETWORK_CONNECTIVITY_TIMEOUT_MS)
239 private val TAG = WifiConnection::class.java.simpleName
240 private const val MESSAGE_CONNECTIVITY_TIMEOUT = 1
241 private const val MIN_NETWORK_BANDWIDTH_KBPS = 10000
242 private const val ACTION_ADD_NETWORK_SETTINGS = "com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"
243 private val NETWORK_CONNECTIVITY_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(2000)