Cześć.
Mam serwis który powinien skanować okolicę w poszukiwaniu sieci wifi i chciałbym jakoś przesłać listę ScanResult do ViewModel oraz bazy danych żeby wyświetlać w RecyclerView listę tych sieci oraz zapisywać historię tych skanów.
WifiService jest typu LifecycleService bo próbowałem jeszcze umieszczać LiveData w samym serwisie, poza tym to prawie 1 do 1 serwis wzięty z android.com https://developer.android.com/guide/topics/connectivity/wifi-scan
class serwis : LifecycleService() {
private val wifiManager = this.getSystemService(Context.WIFI_SERVICE) as WifiManager
private val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
if (success) {
scanSuccess()
} else {
scanFailure()
}
}
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
lifecycleScope.launch(Dispatchers.Default) {
val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
registerReceiver(wifiScanReceiver, intentFilter)
val success = wifiManager.startScan()
if (!success) {
// scan failure handling
scanFailure()
}
}
return START_NOT_STICKY
}
private fun scanSuccess() {
// UPDATE LISTY W VIEW MODEL
// WYSLANIE DANYCH DO BAZY DANYCH
}
// handling scan failure
private fun scanFailure() {
// UPDATE LISTY W VIEW MODEL
}
override fun onBind(intent: Intent): IBinder? {
super.onBind(intent)
return null
}
}
ViewModel miałby też pobierać historię skanów z bazy danych i na przycisk fragment przełączałby się między historią a aktualną listą sieci wifi
class WifiListViewModel(val database: WifiScanDao, application: Application) : AndroidViewModel(application) {
val wifiList = MutableLiveData<List<ScanResult>>()
val wifiListHistory = MutableLiveData<List<WifiScan>>()
init {
initializeHistory()
}
private fun initializeHistory() {
viewModelScope.launch {
wifiListHistory.value = getScansFromDatabase()
}
}
private suspend fun getScansFromDatabase(): List<WifiScan> {
return database.getAllScans()
}
}
A więc problem jest taki że nie wiem w jaki sposób mógłbym przekazać dane z serwisu do view model oraz bazy danych. Proszę o jakieś podpowiedzi :)
Baza danych obecnie wygląda tak, na razie mało jest pól w modelu ale to na próbę.
wifidatabase.kt
@Database(entities = [WifiScan::class], version = 1, exportSchema = false)
abstract class WifiDatabase : RoomDatabase() {
abstract val wifiScanDao: WifiScanDao
companion object {
@Volatile
private var INSTANCE: WifiDatabase? = null
fun getInstance(context: Context): WifiDatabase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
WifiDatabase::class.java,
"sleep_history_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
}
return instance
}
}
}
}
wifiscan.kt
@Entity(tableName = "wifi_scan_results")
data class WifiScan(
@PrimaryKey(autoGenerate = true)
var scanId: Long = 0L,
@ColumnInfo(name = "scan_time")
val timeMili: Long = System.currentTimeMillis()
)
wifiscandao.kt
@Dao
interface WifiScanDao {
@Insert
fun insert(scan: WifiScan)
@Query("SELECT * FROM wifi_scan_results ORDER BY scan_time DESC")
fun getAllScans(): List<WifiScan>
}