Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29c0a9b5 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Account list fragment network detection: compatibility with Android <6

parent aac25b3b
Loading
Loading
Loading
Loading
+29 −6
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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) {
@@ -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)
                }
                }
        }
        }
+3 −2
Original line number Original line Diff line number Diff line
@@ -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"/>