diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e028c61 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/app/src/main/java/com/wifiscanner/model/WifiNetwork.kt b/app/src/main/java/com/wifiscanner/model/WifiNetwork.kt new file mode 100644 index 0000000..5575dcb --- /dev/null +++ b/app/src/main/java/com/wifiscanner/model/WifiNetwork.kt @@ -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" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/wifiscanner/ui/WifiNetworkAdapter.kt b/app/src/main/java/com/wifiscanner/ui/WifiNetworkAdapter.kt new file mode 100644 index 0000000..4f93f62 --- /dev/null +++ b/app/src/main/java/com/wifiscanner/ui/WifiNetworkAdapter.kt @@ -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) : + RecyclerView.Adapter() { + + /** + * 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 +} \ No newline at end of file diff --git a/app/src/main/java/com/wifiscanner/ui/WifiNetworkListActivity.kt b/app/src/main/java/com/wifiscanner/ui/WifiNetworkListActivity.kt new file mode 100644 index 0000000..7956e8f --- /dev/null +++ b/app/src/main/java/com/wifiscanner/ui/WifiNetworkListActivity.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_wifi_network_list.xml b/app/src/main/res/layout/activity_wifi_network_list.xml new file mode 100644 index 0000000..9141161 --- /dev/null +++ b/app/src/main/res/layout/activity_wifi_network_list.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/wifi_network_item.xml b/app/src/main/res/layout/wifi_network_item.xml new file mode 100644 index 0000000..f656d3a --- /dev/null +++ b/app/src/main/res/layout/wifi_network_item.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/wifiscanner/model/WifiNetworkTest.kt b/app/src/test/java/com/wifiscanner/model/WifiNetworkTest.kt new file mode 100644 index 0000000..3df4ceb --- /dev/null +++ b/app/src/test/java/com/wifiscanner/model/WifiNetworkTest.kt @@ -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) + } +} \ No newline at end of file