package xyz.quaver.pupil.receiver import android.Manifest import android.annotation.SuppressLint import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.wifi.p2p.WifiP2pManager import android.os.Build import android.os.Parcelable import android.util.Log import androidx.core.app.ActivityCompat import xyz.quaver.pupil.ui.ErrorType import xyz.quaver.pupil.ui.TransferStep import xyz.quaver.pupil.ui.TransferViewModel private inline fun Intent.getParcelableExtraCompat(key: String): T? = when { Build.VERSION.SDK_INT >= 33 -> getParcelableExtra(key, T::class.java) else -> @Suppress("DEPRECATION") getParcelableExtra(key) as? T } class WifiDirectBroadcastReceiver( private val manager: WifiP2pManager, private val channel: WifiP2pManager.Channel, private val viewModel: TransferViewModel ): BroadcastReceiver() { @SuppressLint("MissingPermission") override fun onReceive(context: Context?, intent: Intent?) { context!! when (intent?.action) { WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION -> { val state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1) viewModel.setWifiP2pEnabled(state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) } WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION -> { manager.requestPeers(channel) { peers -> viewModel.setPeers(peers) } } WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION -> { // Respond to new connection or disconnections val networkInfo = intent.getParcelableExtraCompat(WifiP2pManager.EXTRA_NETWORK_INFO) if (networkInfo?.isConnected == true) { manager.requestConnectionInfo(channel) { info -> viewModel.setConnectionInfo(info) } } else { viewModel.setConnectionInfo(null) } } WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION -> { // Respond to this device's wifi state changing viewModel.setThisDevice(intent.getParcelableExtraCompat(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE)) } } } }