Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Android Studio
*.iml
.gradle
/local.properties
/.idea/
.DS_Store
/build
/captures
.externalNativeBuild
.cxx

# Gradle
/app/build/
.gradle/

# Kotlin/Java
*.class
*.log

# Dependency directories
/app/libs/
/app/src/main/jniLibs/

# Local configuration file
local.properties

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
/captures/

# Intellij
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/dictionaries
.idea/libraries

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild

# NDK
obj/

# Keystore files
*.jks
*.keystore

# Google Services (e.g. APIs or Firebase)
google-services.json

# Proguard folder generated by Eclipse
proguard/

# Built application files
*.apk
*.aar
*.ap_
*.aab

# Compiled class file
*.class

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
44 changes: 44 additions & 0 deletions app/src/main/java/com/wifiscanner/model/WifiNetwork.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.wifiscanner.model

/**
* Data class representing a WiFi network with its details
*
* @property ssid The name of the WiFi network
* @property bssid The MAC address of the WiFi access point
* @property signalStrength The signal strength of the WiFi network in dBm
* @property securityType The security type of the WiFi network
* @property frequency The frequency of the WiFi network in MHz
*/
data class WifiNetwork(
val ssid: String,
val bssid: String,
val signalStrength: Int,
val securityType: SecurityType,
val frequency: Int
) {
/**
* Enum representing WiFi network security types
*/
enum class SecurityType {
OPEN,
WEP,
WPA,
WPA2,
WPA3,
UNKNOWN
}

/**
* Calculate a human-readable signal strength description
*
* @return A string describing the signal strength
*/
fun getSignalStrengthDescription(): String {
return when {
signalStrength >= -50 -> "Excellent"
signalStrength >= -60 -> "Good"
signalStrength >= -70 -> "Fair"
else -> "Weak"
}
}
}
52 changes: 52 additions & 0 deletions app/src/main/java/com/wifiscanner/ui/WifiNetworkAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.wifiscanner.ui

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.wifiscanner.R
import com.wifiscanner.model.WifiNetwork

/**
* RecyclerView adapter for displaying WiFi networks
*
* @property networks List of WiFi networks to display
*/
class WifiNetworkAdapter(private val networks: List<WifiNetwork>) :
RecyclerView.Adapter<WifiNetworkAdapter.WifiNetworkViewHolder>() {

/**
* ViewHolder for WiFi network items
*
* @param itemView The view for a single WiFi network item
*/
class WifiNetworkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val ssidTextView: TextView = itemView.findViewById(R.id.wifi_ssid)
private val signalStrengthTextView: TextView = itemView.findViewById(R.id.wifi_signal_strength)
private val securityTypeTextView: TextView = itemView.findViewById(R.id.wifi_security_type)

/**
* Bind WiFi network data to the view
*
* @param network The WiFi network to display
*/
fun bind(network: WifiNetwork) {
ssidTextView.text = network.ssid
signalStrengthTextView.text = network.getSignalStrengthDescription()
securityTypeTextView.text = network.securityType.name
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WifiNetworkViewHolder {
val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.wifi_network_item, parent, false)
return WifiNetworkViewHolder(itemView)
}

override fun onBindViewHolder(holder: WifiNetworkViewHolder, position: Int) {
holder.bind(networks[position])
}

override fun getItemCount() = networks.size
}
37 changes: 37 additions & 0 deletions app/src/main/java/com/wifiscanner/ui/WifiNetworkListActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.wifiscanner.ui

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.wifiscanner.R
import com.wifiscanner.model.WifiNetwork

/**
* Activity to display the list of WiFi networks
*/
class WifiNetworkListActivity : AppCompatActivity() {

private lateinit var wifiNetworkRecyclerView: RecyclerView
private lateinit var wifiNetworkAdapter: WifiNetworkAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_wifi_network_list)

// Initialize RecyclerView
wifiNetworkRecyclerView = findViewById(R.id.wifi_network_recycler_view)
wifiNetworkRecyclerView.layoutManager = LinearLayoutManager(this)

// Sample data for initial setup (replace with actual WiFi scanning logic)
val sampleNetworks = listOf(
WifiNetwork("Home WiFi", "00:11:22:33:44:55", -55, WifiNetwork.SecurityType.WPA2, 2400),
WifiNetwork("Office Network", "AA:BB:CC:DD:EE:FF", -65, WifiNetwork.SecurityType.WPA3, 5000),
WifiNetwork("Public WiFi", "11:22:33:44:55:66", -75, WifiNetwork.SecurityType.OPEN, 2400)
)

// Set up adapter
wifiNetworkAdapter = WifiNetworkAdapter(sampleNetworks)
wifiNetworkRecyclerView.adapter = wifiNetworkAdapter
}
}
17 changes: 17 additions & 0 deletions app/src/main/res/layout/activity_wifi_network_list.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/wifi_network_recycler_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
38 changes: 38 additions & 0 deletions app/src/main/res/layout/wifi_network_item.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">

<TextView
android:id="@+id/wifi_ssid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
tools:text="Network Name" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="8dp">

<TextView
android:id="@+id/wifi_signal_strength"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
tools:text="Good Signal" />

<TextView
android:id="@+id/wifi_security_type"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
tools:text="WPA2" />
</LinearLayout>
</LinearLayout>
63 changes: 63 additions & 0 deletions app/src/test/java/com/wifiscanner/model/WifiNetworkTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.wifiscanner.model

import org.junit.Assert.*
import org.junit.Test

class WifiNetworkTest {

@Test
fun `test wifi network signal strength description`() {
val excellentSignal = WifiNetwork(
"Test Network",
"00:11:22:33:44:55",
-45,
WifiNetwork.SecurityType.WPA2,
2400
)
assertEquals("Excellent", excellentSignal.getSignalStrengthDescription())

val goodSignal = WifiNetwork(
"Test Network",
"00:11:22:33:44:55",
-55,
WifiNetwork.SecurityType.WPA2,
2400
)
assertEquals("Good", goodSignal.getSignalStrengthDescription())

val fairSignal = WifiNetwork(
"Test Network",
"00:11:22:33:44:55",
-65,
WifiNetwork.SecurityType.WPA2,
2400
)
assertEquals("Fair", fairSignal.getSignalStrengthDescription())

val weakSignal = WifiNetwork(
"Test Network",
"00:11:22:33:44:55",
-80,
WifiNetwork.SecurityType.WPA2,
2400
)
assertEquals("Weak", weakSignal.getSignalStrengthDescription())
}

@Test
fun `test wifi network data class properties`() {
val network = WifiNetwork(
"Home WiFi",
"00:11:22:33:44:55",
-55,
WifiNetwork.SecurityType.WPA2,
2400
)

assertEquals("Home WiFi", network.ssid)
assertEquals("00:11:22:33:44:55", network.bssid)
assertEquals(-55, network.signalStrength)
assertEquals(WifiNetwork.SecurityType.WPA2, network.securityType)
assertEquals(2400, network.frequency)
}
}