Android service binding fix for API 30

Android 11 (API 30) zmienia korzystanie z zewnętrznych serwisów aplikacji. Korzystając z `compileSdk 30`, bez odpowiedniego wpisu w Manifeście aplikacji `bindService()` zwróci `False`, mimo że z `compileSdk 29` będzie działać poprawnie. Chcę się podzielić rozwiązaniem, po zdecydowanie zbyt długiej walce z tym problemem.

Wzorzec Command (Polecenie) w Kotlinie

Wzorzec Command polega na opakowaniu żądania w konkretny obiekt, posiadający wszystkie informacje niezbędne do wykonania swojego zadania. Można o tym pomyśleć jak o kolejnym etapie refaktoryzacji, gdzie najpierw wydzielamy kod do osobnej metody, a następnie do osobnego obiektu, przyjmującego w konstruktorze argumenty potrzebne do wykonania żądania.

Remote Logger

Podczas pracy nad pewnym projektem nie mogłem korzystać z 'Opcji Deweloperskich' Androida — nie miałem dostępu do logów. Gdyby tylko dało się wysyłać logi Logcata, np. przez websocket i potem łapać je na swoim komputerze... Nie znalazłem takiego narzędzia, więc je sobie napisałem i opisałem proces w tym poście.

Mediator w Kotlinie

Zadaniem Mediatora jest organizować komunikację między bliskimi klasami. Wzorzec `Mediator` uwalnia zależności pomiędzy komponentami. Przejmuje na siebie interakcję między nimi, stając się głównym hubem komunikacyjnym dla grupy klas. Odwracamy sterowanie, ponieważ komponenty zaczynają informować tylko 'co się stało', zamiast nakazywać innym, żeby 'coś zrobiły'. Można go spotkać np. pod postacią `ViewModel` w Androidzie, gdzie oddziela interakcje UI od zmian modelu danych.

Dekorator w Kotlinie

`Dekorator` stosuje się tam, gdzie tworzenie osobnych klas będących kombinacją wszystkich możliwości skończyłoby się ich eksplozją. Wzorzec ten skupia się na stworzeniu warstw obiektów w celu transparentnego i dynamicznego uzupełniania obiektów o kolejne zadania. Dekorator dostarcza obiekt, o takim samym interfejsie co obiekt dekorowany.

Adapter w Kotlinie

Adapter lub Wrapper pozwala `przetłumaczyć` jeden interfejs na inny, oczekiwany przez klienta. Jest to szczególnie przydatne, gdy adaptowany obiekt pochodzi z niezależnej biblioteki i nie chcemy uzależniać naszego systemu od jego interfejsu, tworząc tzw. `anticorruption layer`. Zmiany interfejsu obiektu wpłyną tylko na `Adapter` a nie na resztę kodu.

IntelliJ IDEA jako edytor LaTeX

IntelliJ IDEA całkiem sprawnie radzi sobie z obsługą LaTeX. Śmiem twierdzić, że jest to nawet lepsze doświadczenie niż TexStudio czy Texmaker, które są dedykowane do tego typu projektów. Jednak siła IntelliJ nie polega na możliwościach `out of the box` ale na plugin-ach i ręcznej konfiguracji procesu budowania.

Fasada w Kotlinie

Fasada pozwala a ukrycie szczegółów modułu przed klientami. Zapewnia przestrzeganie `Prawa Demeter`, a użycie ogólnego interfejsu i różnych implementacji znacząco ułatwia testowanie. Dobrze łączy się z innymi wzorcami takimi jak `Strategia`, `Metoda Szablonowa` czy konstrukcyjnymi pozwalającymi na konfigurację obiektu udostępnianego klientom. Fasada dobrze nadaje się na punkt wejścia dla bibliotek, dając klientom dostęp do wysokopoziomowych funkcjonalności i chowając całą wewnętrzną logikę i klasy.

Wzorzec Strategia w Kotlinie

Strategia tworzy rodzinę algorytmów, zamykając różniącą się logikę w osobnych klasach, jednocześnie ukrywając ją przed klientami za wspólnym interfejsem. Umożliwia wymienne stosowanie implementacji. Użycie strategii znacząco upraszcza kod klientów, pozwala uniknąć duplikacji kodu i instrukcji warunkowych. Znacząco ułatwia testowanie — oddzielając testowanie klienta od algorytmów strategii.

Metoda szablonowa w Kotlinie

Metoda szablonowa to bardzo prosty wzorzec, pozwalający oddzielić to, co stałe od tego, co zmienne w rodzinie klas. Polega na utworzeniu abstrakcyjnej klasy nadrzędnej, zawierającej kolejne kroki jakiegoś algorytmu i pozwoleniu klasom dziedziczącym z niej nadpisywać poszczególne kroki, ale nie sam algorytm, który je wykorzystuje.