diff --git a/app/src/main/java/com/example/gpswifitracker/MainActivity.kt b/app/src/main/java/com/example/gpswifitracker/MainActivity.kt index e6dc6c4b07d19dced7c2f41bed4cf3b59847964f..cb803b16c25ef9a3bcff2b4aeb0f4dbc5024ecab 100644 --- a/app/src/main/java/com/example/gpswifitracker/MainActivity.kt +++ b/app/src/main/java/com/example/gpswifitracker/MainActivity.kt @@ -12,6 +12,12 @@ import kotlinx.android.synthetic.main.activity_main.* import mumayank.com.airlocationlibrary.AirLocation import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders +import androidx.core.app.ComponentActivity +import androidx.core.app.ComponentActivity.ExtraData +import androidx.core.content.ContextCompat.getSystemService +import android.icu.lang.UCharacter.GraphemeClusterBreak.T + + class MainActivity : AppCompatActivity() { @@ -55,13 +61,15 @@ class MainActivity : AppCompatActivity() { currentLocation = Location(location.latitude, location.longitude) var wifiString = "" var wifiLocations: MutableList<WifiLocation> = ArrayList() - var bestLevel = -100 + var bestDistance = Double.MAX_VALUE wifiManager?.scanResults?.forEach { - val level = WifiManager.calculateSignalLevel(it.level, 5) - wifiString += "\n" + it.BSSID + ": " + it.SSID + ": " + level - wifiLocations.add(WifiLocation(it.timestamp, it.BSSID, it.SSID, it.level, location.latitude, location.longitude)) - if (bestLevel < it.level) { - bestLevel = it.level + //val level = WifiManager.calculateSignalLevel(it.level, 5) + //https://stackoverflow.com/a/18359639 - constant used returns meters + val distance = Math.pow(10.0, (27.55 - 20 * Math.log10(it.frequency.toDouble()) + Math.abs(it.level)) / 20.0) + wifiString += "\n" + it.BSSID + ": " + it.SSID + ": " + distance + wifiLocations.add(WifiLocation(it.timestamp, it.BSSID, it.SSID, it.level, it.frequency, distance, location.latitude, location.longitude)) + if (bestDistance > distance) { + bestDistance = distance closestBSSID = it.BSSID } } diff --git a/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt b/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt index 31229bffebb92270e41b1771122a43c66f58bf91..dd80f9e6e6175e9844c168ba926d80e1bfdff650 100644 --- a/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt +++ b/app/src/main/java/com/example/gpswifitracker/WifiLocation.kt @@ -11,6 +11,8 @@ data class WifiLocation( @ColumnInfo(name = "bssid") @NonNull val bssid: String, @ColumnInfo(name = "ssid") @NonNull val ssid: String, @ColumnInfo(name = "level") @NonNull val level: Int, + @ColumnInfo(name = "frequency") @NonNull val frequency: Int, + @ColumnInfo(name = "distance") @NonNull val distance: Double, @ColumnInfo(name = "latitude") @NonNull val latitude: Double, @ColumnInfo(name = "longitude") @NonNull val longitude: Double ) diff --git a/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt b/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt index 6e407706f01c73f67163ad4bd29bbcfbe0fb4607..d7669cf84127116f4f5d95168e1f35bde35b4517 100644 --- a/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt +++ b/app/src/main/java/com/example/gpswifitracker/WifiLocationDao.kt @@ -21,8 +21,7 @@ interface WifiLocationDao { @Query("SELECT * FROM wifilocation WHERE bssid IN (:bssids)") suspend fun findLocationsBySSID(bssids: List<String>): List<WifiLocation> - //TODO: improve algorithm - @Query("SELECT latitude, longitude FROM wifilocation WHERE bssid = :bssid ORDER BY level DESC, date DESC LIMIT 1") + @Query("SELECT latitude, longitude FROM wifilocation WHERE bssid = :bssid ORDER BY distance DESC, date DESC LIMIT 1") suspend fun findBestLocationBySSID(bssid: String): Location @Insert