Skip to content
Merged
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
94 changes: 94 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<<<<<<< HEAD
# Android Studio
=======
# Android Studio files
>>>>>>> pr-3-souravg77-scanmywifi
.idea/
*.iml
*.iws
*.ipr

<<<<<<< HEAD
# Gradle
.gradle/
build/
local.properties

# OS generated files
.DS_Store
Thumbs.db

# Compiled class files
*.class

# Log files
*.log

# Kotlin build files
out/

# Android specific
bin/
gen/
captures/
.externalNativeBuild/
.cxx/

# Dependency directories
node_modules/

# Virtual environment
venv/
.env

# Misc
*.swp
*.swo
=======
# Build files
build/
app/build/
target/
out/

# Gradle files
.gradle/
gradle/
gradlew
gradlew.bat

# Kotlin compiled files
*.class
*.kotlin_module

# Logging files
*.log

# Virtual machine crash logs
hs_err_pid*

# Local configuration file
local.properties

# macOS system files
.DS_Store

# Sensitive or local configuration
.env
*.keystore

# Android specific
captures/
*.ap_
*.aab

# External libraries
*.so

# Test results
test-results/

# Dependency directories
node_modules/
vendor/
>>>>>>> pr-3-souravg77-scanmywifi
43 changes: 43 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
}

android {
compileSdkVersion 33
defaultConfig {
applicationId "com.example.wifiscanner"
minSdkVersion 29
targetSdkVersion 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'

// Testing dependencies
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:4.8.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
8 changes: 8 additions & 0 deletions app/src/main/kotlin/com/example/wifiscanner/WifiNetwork.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.wifiscanner

data class WifiNetwork(
val ssid: String,
val bssid: String,
val signalStrength: Int,
val securityType: String
)
24 changes: 24 additions & 0 deletions app/src/main/kotlin/com/example/wifiscanner/WifiNetworkAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.wifiscanner

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView

class WifiNetworkAdapter(private val networks: List<WifiNetwork>) :
RecyclerView.Adapter<WifiNetworkAdapter.WifiNetworkViewHolder>() {

class WifiNetworkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

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

override fun onBindViewHolder(holder: WifiNetworkViewHolder, position: Int) {
// Placeholder for future implementation
}

override fun getItemCount(): Int = networks.size
}
88 changes: 88 additions & 0 deletions app/src/main/kotlin/com/example/wifiscanner/WifiScannerActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.example.wifiscanner

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.net.wifi.WifiManager
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.button.MaterialButton
import com.google.android.material.recyclerview.RecyclerView

class WifiScannerActivity : AppCompatActivity() {

companion object {
private const val LOCATION_PERMISSION_REQUEST_CODE = 1001
}

private lateinit var wifiManager: WifiManager
private lateinit var scanButton: MaterialButton
private lateinit var recyclerView: RecyclerView
private lateinit var wifiNetworkAdapter: WifiNetworkAdapter

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

// Initialize WiFi Manager
wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

// Setup RecyclerView
recyclerView = findViewById(R.id.rv_wifi_networks)
recyclerView.layoutManager = LinearLayoutManager(this)
wifiNetworkAdapter = WifiNetworkAdapter(emptyList())
recyclerView.adapter = wifiNetworkAdapter

// Setup Scan Button
scanButton = findViewById(R.id.btn_scan_wifi)
scanButton.setOnClickListener {
performWifiScan()
}
}

private fun performWifiScan() {
// Check and request permissions
if (checkLocationPermission()) {
// Actual scanning logic will be implemented in future tasks
Toast.makeText(this, "Scanning for WiFi networks...", Toast.LENGTH_SHORT).show()
}
}

private fun checkLocationPermission(): Boolean {
// Check if location permissions are granted
return if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
// Request permissions
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
LOCATION_PERMISSION_REQUEST_CODE
)
false
} else {
true
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
performWifiScan()
} else {
Toast.makeText(this, "Location permission is required for WiFi scanning", Toast.LENGTH_SHORT).show()
}
}
}
}
28 changes: 28 additions & 0 deletions app/src/main/res/layout/activity_wifi_scanner.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?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">

<com.google.android.material.button.MaterialButton
android:id="@+id/btn_scan_wifi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scan WiFi Networks"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_wifi_networks"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@id/btn_scan_wifi"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
37 changes: 37 additions & 0 deletions app/src/main/res/layout/item_wifi_network.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
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="wrap_content"
android:layout_margin="8dp"
app:cardElevation="4dp"
app:cardCornerRadius="8dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">

<TextView
android:id="@+id/tv_ssid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="16sp"/>

<TextView
android:id="@+id/tv_bssid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"/>

<TextView
android:id="@+id/tv_signal_strength"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"/>

</LinearLayout>
</androidx.cardview.widget.CardView>
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.example.wifiscanner

import android.content.Context
import android.net.wifi.WifiManager
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.Mockito.verify
import org.mockito.Mockito.mock

@RunWith(MockitoJUnitRunner::class)
class WifiScannerActivityTest {

@Mock
private lateinit var mockContext: Context

@Mock
private lateinit var mockWifiManager: WifiManager

private lateinit var wifiScannerActivity: WifiScannerActivity

@Before
fun setup() {
// Setup mocks and initialize activity
wifiScannerActivity = WifiScannerActivity()
}

@Test
fun testScanButtonExists() {
// Verify that the scan button is present in the layout
val scanButton = wifiScannerActivity.findViewById<MaterialButton>(R.id.btn_scan_wifi)
assert(scanButton != null) { "Scan button should be present in the layout" }
}

@Test
fun testRecyclerViewExists() {
// Verify that the RecyclerView is present in the layout
val recyclerView = wifiScannerActivity.findViewById<RecyclerView>(R.id.rv_wifi_networks)
assert(recyclerView != null) { "RecyclerView should be present in the layout" }
}

@Test
fun testWifiNetworkAdapterInitialization() {
// Verify that the WiFi network adapter is initialized with an empty list
val recyclerView = wifiScannerActivity.findViewById<RecyclerView>(R.id.rv_wifi_networks)
assert(recyclerView.adapter is WifiNetworkAdapter) { "Adapter should be an instance of WifiNetworkAdapter" }
}
}
Loading