Loading app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt +29 −6 Original line number Original line Diff line number Diff line Loading @@ -12,8 +12,10 @@ import android.accounts.Account import android.accounts.AccountManager import android.accounts.AccountManager import android.accounts.OnAccountsUpdateListener import android.accounts.OnAccountsUpdateListener import android.app.Application import android.app.Application import android.content.BroadcastReceiver import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent import android.content.IntentFilter import android.net.ConnectivityManager import android.net.ConnectivityManager import android.net.Network import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities Loading Loading @@ -92,14 +94,29 @@ class AccountListFragment: ListFragment() { val accounts = MutableLiveData<Array<out Account>>() val accounts = MutableLiveData<Array<out Account>>() val networkAvailable = MutableLiveData<Boolean>() val networkAvailable = MutableLiveData<Boolean>() private var networkObserver: ConnectivityManager.NetworkCallback? = null private var networkCallback: ConnectivityManager.NetworkCallback? = null private var networkReceiver: BroadcastReceiver? = null private val accountManager = AccountManager.get(getApplication())!! private val accountManager = AccountManager.get(getApplication())!! private val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager init { init { accountManager.addOnAccountsUpdatedListener(this, null, true) accountManager.addOnAccountsUpdatedListener(this, null, true) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // API level <26 networkReceiver = object: BroadcastReceiver() { init { update() } override fun onReceive(context: Context?, intent: Intent?) = update() private fun update() { networkAvailable.postValue(connectivityManager.allNetworkInfo.any { it.isConnected }) } } application.registerReceiver(networkReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) } else { // API level >= 26 networkAvailable.postValue(false) networkAvailable.postValue(false) // check for working (e.g. WiFi after captive portal login) Internet connection // check for working (e.g. WiFi after captive portal login) Internet connection Loading @@ -107,7 +124,7 @@ class AccountListFragment: ListFragment() { .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) .build() .build() networkObserver = object: ConnectivityManager.NetworkCallback() { val callback = object: ConnectivityManager.NetworkCallback() { val availableNetworks = hashSetOf<Network>() val availableNetworks = hashSetOf<Network>() override fun onAvailable(network: Network) { override fun onAvailable(network: Network) { Loading @@ -124,15 +141,21 @@ class AccountListFragment: ListFragment() { networkAvailable.postValue(availableNetworks.isNotEmpty()) networkAvailable.postValue(availableNetworks.isNotEmpty()) } } } } connectivityManager.registerNetworkCallback(networkRequest, networkObserver) connectivityManager.registerNetworkCallback(networkRequest, callback) networkCallback = callback } } } } override fun onCleared() { override fun onCleared() { accountManager.removeOnAccountsUpdatedListener(this) accountManager.removeOnAccountsUpdatedListener(this) if (Build.VERSION.SDK_INT >= 21) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) networkObserver?.let { networkReceiver?.let { getApplication<Application>().unregisterReceiver(it) } else networkCallback?.let { connectivityManager.unregisterNetworkCallback(it) connectivityManager.unregisterNetworkCallback(it) } } } } Loading app/src/main/res/layout/account_list.xml +3 −2 Original line number Original line Diff line number Diff line Loading @@ -10,16 +10,17 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> android:orientation="vertical"> <TextView <androidx.appcompat.widget.AppCompatTextView android:id="@+id/no_network_info" android:id="@+id/no_network_info" android:layout_width="match_parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="wrap_content" android:layout_margin="12dp" android:layout_margin="12dp" android:gravity="center_vertical" android:gravity="center_vertical" android:visibility="gone" android:visibility="gone" android:drawableLeft="@drawable/ic_signal_cellular_off_dark" app:drawableLeftCompat="@drawable/ic_signal_cellular_off_dark" android:drawablePadding="8dp" android:drawablePadding="8dp" android:text="@string/account_list_no_internet"/> android:text="@string/account_list_no_internet"/> Loading Loading
app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt +29 −6 Original line number Original line Diff line number Diff line Loading @@ -12,8 +12,10 @@ import android.accounts.Account import android.accounts.AccountManager import android.accounts.AccountManager import android.accounts.OnAccountsUpdateListener import android.accounts.OnAccountsUpdateListener import android.app.Application import android.app.Application import android.content.BroadcastReceiver import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent import android.content.IntentFilter import android.net.ConnectivityManager import android.net.ConnectivityManager import android.net.Network import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities Loading Loading @@ -92,14 +94,29 @@ class AccountListFragment: ListFragment() { val accounts = MutableLiveData<Array<out Account>>() val accounts = MutableLiveData<Array<out Account>>() val networkAvailable = MutableLiveData<Boolean>() val networkAvailable = MutableLiveData<Boolean>() private var networkObserver: ConnectivityManager.NetworkCallback? = null private var networkCallback: ConnectivityManager.NetworkCallback? = null private var networkReceiver: BroadcastReceiver? = null private val accountManager = AccountManager.get(getApplication())!! private val accountManager = AccountManager.get(getApplication())!! private val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager init { init { accountManager.addOnAccountsUpdatedListener(this, null, true) accountManager.addOnAccountsUpdatedListener(this, null, true) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // API level <26 networkReceiver = object: BroadcastReceiver() { init { update() } override fun onReceive(context: Context?, intent: Intent?) = update() private fun update() { networkAvailable.postValue(connectivityManager.allNetworkInfo.any { it.isConnected }) } } application.registerReceiver(networkReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) } else { // API level >= 26 networkAvailable.postValue(false) networkAvailable.postValue(false) // check for working (e.g. WiFi after captive portal login) Internet connection // check for working (e.g. WiFi after captive portal login) Internet connection Loading @@ -107,7 +124,7 @@ class AccountListFragment: ListFragment() { .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) .build() .build() networkObserver = object: ConnectivityManager.NetworkCallback() { val callback = object: ConnectivityManager.NetworkCallback() { val availableNetworks = hashSetOf<Network>() val availableNetworks = hashSetOf<Network>() override fun onAvailable(network: Network) { override fun onAvailable(network: Network) { Loading @@ -124,15 +141,21 @@ class AccountListFragment: ListFragment() { networkAvailable.postValue(availableNetworks.isNotEmpty()) networkAvailable.postValue(availableNetworks.isNotEmpty()) } } } } connectivityManager.registerNetworkCallback(networkRequest, networkObserver) connectivityManager.registerNetworkCallback(networkRequest, callback) networkCallback = callback } } } } override fun onCleared() { override fun onCleared() { accountManager.removeOnAccountsUpdatedListener(this) accountManager.removeOnAccountsUpdatedListener(this) if (Build.VERSION.SDK_INT >= 21) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) networkObserver?.let { networkReceiver?.let { getApplication<Application>().unregisterReceiver(it) } else networkCallback?.let { connectivityManager.unregisterNetworkCallback(it) connectivityManager.unregisterNetworkCallback(it) } } } } Loading
app/src/main/res/layout/account_list.xml +3 −2 Original line number Original line Diff line number Diff line Loading @@ -10,16 +10,17 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> android:orientation="vertical"> <TextView <androidx.appcompat.widget.AppCompatTextView android:id="@+id/no_network_info" android:id="@+id/no_network_info" android:layout_width="match_parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="wrap_content" android:layout_margin="12dp" android:layout_margin="12dp" android:gravity="center_vertical" android:gravity="center_vertical" android:visibility="gone" android:visibility="gone" android:drawableLeft="@drawable/ic_signal_cellular_off_dark" app:drawableLeftCompat="@drawable/ic_signal_cellular_off_dark" android:drawablePadding="8dp" android:drawablePadding="8dp" android:text="@string/account_list_no_internet"/> android:text="@string/account_list_no_internet"/> Loading