Settings Panel, czyli szybkie panele w Androidzie

Oficjalnie mamy już Android Q, czyli wersję 10 (a szkoda, że nie X :/ ). Przez najbliższe tygodnie będę prezentował, jakie to funkcje przyniósł nam wujek Google. Jedną z ciekawych rozwiązań nowego systemu są panele ustawień, czyli Settings Panel.

Co to są panele ustawień (Settings Panel)?

Panele ustawień umożliwiają twórcom aplikacji dołączanie monitów, za pomocą których użytkownik może zmienić ustawienia systemu. Jest to tak naprawdę ruchomy okno dialogowe, które zawiera ustalony podzbiór ustawień w celu rozwiązania konkretnego problemu. 

Do tej pory osoba korzystająca z aplikacji musiała opuścić aplikację, aby zmienić ustawienia urządzenia. Jako twórca aplikacji chcesz, aby ludzie angażowali się w Twoją aplikację. Wchodzili w interakcję oraz spędzali z nią dużo czasu. Dlatego ważne jest, aby nie odsyłać użytkownika do innych miejsc niż Twoja aplikacja.

Panele ustawień pojawiają się nad aplikacją wywołującą, aby wykonać akcję bez konieczności otwierania ustawień przez użytkownika i opuszczania bieżącego ekranu. Niestety (na chwilę obecną) istnieją tylko cztery akcję, z których możemy skorzystać. Są to panele ustawień:

  • Łączność z Internetem,
  • NFC,
  • Wi-Fi,
  • Głośność. 

Jak wdrożyć Settings Panel w swoim projekcie?

Aby wyświetlić panel ustawień wystarczy napisać bardzo mało kodu, a dokładniej jedną linijkę:

startActivity(Intent (panel) )

Gdzie „panel” to argument Intenta, który jest odwołaniem do wartości ciągu zdefiniowanej w klasie Panel. Możemy korzystać z następujących akcji:

  • ACTION_INTERNET_CONNECTIVITY — pokaże okno dialogowe, które zawiera ustawienia umożliwiające połączenie z Internetem.
  • ACTION_NFC — pokaże okno dialogowe, które zawiera ustawienia związane z NFC.
  • ACTION_VOLUME — pokaże okno dialogowe, które zawiera wszystkie strumienie głośności.
  • ACTION_WIFI — pokaże okno dialogowe, które zawiera elementy sterujące Wi-Fi.

Osobiście uważam, że to bardzo mało akcji. Przydałoby się więcej ich. Na przykład do włączenie BT, lokalizacji itp. Możesz też zwrócić uwagę na ACTION_WIFI, ponieważ jest nie potrzebne. To samo możemy zrobić za pomocą ACTION_INTERNET_CONNECTIVITY. Google tutaj nie popisało się.

Uzupełnij wiedzę o: Skróty aplikacji w Androidzie

Przykład praktyczny

Poniżej znajduje się przykład, który prezentuje wszystkie akcję. Dodatkowo mamy przycisk, który sprawdza, czy urządzenie jest połączone z internetem. Jeśli nie ma, jest wyświetlana informacja o tym fakcie i proponujemy włączenie go.

Niestety Google nie zaimplementowało interfejsu, który by zwracał czy użytkownik wykonał akcję. Aby rozwiązać ten problem, wykorzystujemy metodę startActivityForResult(). Dzięki temu jesteś wstanie zweryfikowac czy użytkownik wykonał akcję, o którą prosiliśmy.

class MainActivity : AppCompatActivity() {

    companion object {
        private const val REQUEST_CODE = 100
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun doAction(view: View) {

        var panelIntent : String? = null

        when(view){
            BTN_ACTION_INTERNET_CONNECTIVITY -> panelIntent = Settings.Panel.ACTION_INTERNET_CONNECTIVITY
            BTN_ACTION_NFC -> panelIntent = Settings.Panel.ACTION_NFC
            BTN_ACTION_WIFI -> panelIntent = Settings.Panel.ACTION_WIFI
            BTN_ACTION_VOLUME -> panelIntent = Settings.Panel.ACTION_VOLUME
            BTN_CHECK_NETWORK -> checkNetwork()
        }

        if (panelIntent != null) startActivity( Intent(panelIntent) )

    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE) {
            checkNetwork()
        }
    }

    private fun checkNetwork() {
        if (isOnline())
            displayMessage("Cconnected")
        else
            displayMessage("Not connected internet", true)
    }

    private fun displayMessage( text: String, action : Boolean = false) {

        Snackbar.make(linearLayout, text, Snackbar.LENGTH_INDEFINITE).apply {
            if (action) {
                setAction("Enable") { startActivityForResult (Intent( Settings.Panel.ACTION_INTERNET_CONNECTIVITY), REQUEST_CODE ) }
                setActionTextColor(resources.getColor(R.color.colorPrimary))
            }
        }.show()
    }

    private fun isOnline(): Boolean {
        val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val netInfo = cm.activeNetworkInfo
        return netInfo != null && netInfo.isConnectedOrConnecting
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    <Button
        android:id="@+id/BTN_ACTION_INTERNET_CONNECTIVITY"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="doAction"
        android:text="ACTION INTERNET CONNECTIVITY"
        />

    <Button
        android:id="@+id/BTN_ACTION_NFC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="doAction"
        android:text="ACTION NFC"
        />

    <Button
        android:id="@+id/BTN_ACTION_WIFI"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="doAction"
        android:text="ACTION WIFI"
        />

    <Button
        android:id="@+id/BTN_ACTION_VOLUME"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="doAction"
        android:text="ACTION VOLUME"
        />

    <Button
        android:id="@+id/BTN_CHECK_NETWORK"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:onClick="doAction"
        android:text="CHECK NETWORK"
        />

</LinearLayout>
Settings Panel w Androidzie

Jeśli urządzenie ma aktywne połączenie z Internetem, odpowiednia wiadomość zostanie wyświetlona. W przeciwnym razie Snackbar pokaże okienko z monitem o połączenie się z Internetem. Po kliknięciu jego użytkownik zobaczy panel ustawień z łącznością internetową. Dalej może włączyć Wi-Fi i wybrać sieć lub wybrać sieć komórkowa. Kiedy zostanie naciśnięty przycisk „Gotowe”, metoda onActivityResult, ponownie sprawdzi połączenie internetowe.

Settings Panel – podsumowanie

Panele ustawień to świetne rozwiązanie, ale nie idealne. Szkoda, że tak mało akcji znajduje się w klasie Panel. Oby w przyszłych wersjach pojawiły się nowe opcje. A Ty co myślisz o Settings Panel?