Ive been trying to create a WifiP2p application using kotlin but I cant seem to test the working between two avds. Is this just not possible or am I missing some code. I am a beginner to android studio coding and cant seem to wrap my head around this.
This is my second activity where I use the broadcast receiver to get the info
private lateinit var ConvoRecyclerView: RecyclerView
private lateinit var availableConvo: ArrayList<String>
private lateinit var Cadapter: ConvoAdapter
lateinit var manager: WifiP2pManager
lateinit var channel: WifiP2pManager.Channel
lateinit var activity: PeersView
lateinit var breceiver: BroadcastReceiver
lateinit var intentfil: IntentFilter
//var peers = ArrayList<WifiP2pDevice>()
val peers = mutableListOf<WifiP2pDevice>()
lateinit var deviceNameAr: String
lateinit var deviceAr: Array<WifiP2pDevice>
private fun init() {
Log.d("PeersView", "In init function")
manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
channel = manager.initialize(this, mainLooper, null)
breceiver = WifiDreciever(manager, channel, this)
intentfil = IntentFilter()
intentfil.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
intentfil.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
intentfil.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)
intentfil.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)
registerReceiver(breceiver, intentfil);
Log.d("PeersView", "init completed")
discovery()
//var WifiPeerList = ArrayList<WifiP2pDeviceList>[]
}
private fun discovery(){
//var uname = findViewById<TextView>(R.id.)
//uname.text = intent.extras?.getString("uname")?: ""
val pingpeers = findViewById<ImageButton>(R.id.pingDevices)
Log.d("PeersView", "In discovery function")
val toast1 = Toast.makeText(this,"Discovery Started", Toast.LENGTH_LONG)
val toast2 = Toast.makeText(this,"Discovery Failed", Toast.LENGTH_LONG)
pingpeers.setOnClickListener{
manager.discoverPeers(channel, object : WifiP2pManager.ActionListener{
override fun onSuccess() {
toast1.show()
}
override fun onFailure(reason: Int) {
toast2.show()
}
})
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_peers_view)
setSupportActionBar(findViewById(R.id.my_toolbar))
init()
Log.d("PeersView", "onCreate peers view")
availableConvo = ArrayList<String>()
Cadapter = ConvoAdapter(availableConvo)
//val test = ArrayList<String>()
//for(i in 1..20){
// test.add("Convo"+i)
//}
ConvoRecyclerView = findViewById<RecyclerView>(R.id.convoRecyclerView)
ConvoRecyclerView.layoutManager = LinearLayoutManager(this)
ConvoRecyclerView.adapter = Cadapter
//val adapter = ConvoAdapter(test)
//ConvoRecyclerView.adapter = adapter
}
fun onPeersAvailable(peers: WifiP2pDeviceList) {
// Handle the list of available peers
val deviceList = peers.deviceList
for (device: WifiP2pDevice in deviceList) {
// Process each device (physical device or virtual emulator)
Log.d("MainActivity", "Device Name: ${device.deviceName}, Address: ${device.deviceAddress}")
availableConvo.add(device.deviceName)
val adapter = ConvoAdapter(availableConvo)
ConvoRecyclerView.adapter = adapter
}
}
And this is the Braodcast Reciever class:
package com.example.test3
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.net.wifi.p2p.WifiP2pDeviceList
import android.net.wifi.p2p.WifiP2pManager
import android.os.Looper
import android.util.Log
class WifiDreciever(
private val manager: WifiP2pManager,
private val channel: WifiP2pManager.Channel,
private val activity: PeersView): BroadcastReceiver(){
// fun initialize(
// srcLooper: Looper,
// srcContext: Context!,
// listener: WifiP2pManager.ChannelListener!
// ): WifiP2pManager.Channel!
override fun onReceive(context: Context?, intent: Intent?) {
val action: String? = intent?.action
when (action) {
WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION -> {
// Check to see if Wi-Fi is enabled and notify appropriate activity
//val state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1)
//activity.isWifiP2pEnabled = state == WifiP2pManager.WIFI_P2P_STATE_ENABLED
}
WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION -> {
// Call WifiP2pManager.requestPeers() to get a list of current peers
if(manager!=null){
Log.d("PeersView", "Wifi Peers Changed, Calling requestPeers")
//manager.requestPeers(channel, activity.peerListListener)
manager.requestPeers(channel){
peers: WifiP2pDeviceList -> activity.onPeersAvailable(peers)
}
}
}
WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION -> {
// Respond to new connection or disconnections
}
WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION -> {
// Respond to this device's wifi state changing
}
}
}
}
It works fine on physical devices but I need it to work on avds to test code.