Wifi Direct discovery not working between two avds

32 views Asked by At

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.

0

There are 0 answers