馃摉 Przegl膮d

Modu艂 Network (NetworkMonitor) monitoruje stan po艂膮czenia sieciowego i udost臋pnia go poprzez Flow oraz callbacki. Rozr贸偶nia WiFi, dane kom贸rkowe, VPN i Ethernet.

Szybki przyk艂ad
// Sprawdzenie stanu
if (ADict.Network.isOnline()) {
    syncData()
}

// Obserwacja (Flow)
ADict.Network.state.collect { state ->
    when (state) {
        NetworkState.WIFI -> loadHighQualityContent()
        NetworkState.CELLULAR -> loadLowQualityContent()
        NetworkState.OFFLINE -> showOfflineMode()
    }
}

// Callback na reconnect
ADict.Network.onReconnect {
    syncPendingData()
}

馃搳 Stany sieci

Stan Opis
WIFIPo艂膮czenie Wi-Fi
CELLULARDane kom贸rkowe
ETHERNETEthernet
VPNVPN
OFFLINEBrak po艂膮czenia
UNKNOWNNieznany stan

馃摎 API

isOnline(): Boolean

Czy jest po艂膮czenie z Internetem.

isWifi(): Boolean

Czy jest na Wi-Fi.

isCellular(): Boolean

Czy jest na danych kom贸rkowych.

isMetered(): Boolean

Czy po艂膮czenie jest p艂atne za dane.

getCurrentState(): NetworkState

Pobierz aktualny stan.

getNetworkInfo(): NetworkInfo

Pobierz szczeg贸艂owe informacje o sieci.

onReconnect(callback: () -> Unit)

Callback wywo艂ywany przy ponownym po艂膮czeniu.

onStateChange(callback: (NetworkState) -> Unit)

Callback wywo艂ywany przy zmianie stanu.

whenOnline(action: () -> Unit)

Wykonaj akcj臋 gdy online (lub od razu je艣li ju偶 online).

whenWifi(action: () -> Unit)

Wykonaj akcj臋 gdy na Wi-Fi.

馃摗 Flow

state: StateFlow<NetworkState>

Flow aktualnego stanu sieci.

isOnlineFlow: StateFlow<Boolean>

Flow stanu online/offline.

Obserwacja stanu
// W Activity/Fragment
lifecycleScope.launch {
    ADict.Network.state.collect { state ->
        updateNetworkIndicator(state)
    }
}

lifecycleScope.launch {
    ADict.Network.isOnlineFlow.collect { isOnline ->
        offlineBanner.isVisible = !isOnline
    }
}

// W ViewModel
class MainViewModel : ViewModel() {
    val networkState = ADict.Network.state
        .stateIn(viewModelScope, SharingStarted.Lazily, NetworkState.UNKNOWN)
}

馃挕 Przyk艂ady

Synchronizacja danych
// Sync przy reconnect
ADict.Network.onReconnect {
    syncPendingChanges()
    uploadQueuedPhotos()
}

// Sync tylko na WiFi
fun uploadLargeFile(file: File) {
    ADict.Network.whenWifi {
        uploadService.upload(file)
    }
}

// Sprawdzenie przed pobieraniem
fun downloadContent(quality: Quality) {
    val effectiveQuality = if (ADict.Network.isMetered()) {
        Quality.LOW
    } else {
        quality
    }
    contentDownloader.download(effectiveQuality)
}
Offline mode
class MainActivity : AppCompatActivity() {
    private val offlineBanner: View by lazy { findViewById(R.id.offlineBanner) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ADict.Network.onStateChange { state ->
            offlineBanner.isVisible = state == NetworkState.OFFLINE

            when (state) {
                NetworkState.OFFLINE -> enableOfflineMode()
                NetworkState.WIFI -> {
                    disableOfflineMode()
                    syncPendingData()
                }
                NetworkState.CELLULAR -> {
                    disableOfflineMode()
                    // Nie syncuj automatycznie - mo偶e by膰 drogie
                }
                else -> {}
            }
        }
    }
}

馃摝 data class NetworkInfo

  • stateNetworkState
  • isOnlineBoolean
  • isMeteredBoolean
  • hasInternetBoolean
  • downloadSpeedKbpsInt?
  • uploadSpeedKbpsInt?