Архитектура приложения сочетает принципы подходов MVI и MVVM Данная архитектура не использует паттерн Command для реализации MVI, объекты типа Action, Effect заменены функциями, дабы избежать дополнительных аллокаций объектов.
- class ViewProperty - lite реализация LifeData, не требует передачи объекта LifecycleOwner, но при подписке возвращает объект Disposal, от которого View(Fragment) может отписаться.
- interface marker ViewState - имплементируется конкретной реализацией ViewState, необходим для создания контракта, содержит в себе поля типа ViewProperty
- interface Dispatcher - имплементируется классом ViewModel, в нем декларируются события к которым имеет доступ View(Fragment)
- interface StateHolder - наследуется интерфейсом Dispatcher, предоставляет доступ View(Fragment) к ViewState
- interface StateController - выполняет функции Reducer, наследуется от интерфейса StateHolder
- class Store - содержит бизнес логику приложения
- Если экран не передает никаких action и у него отсутствует State, который необходимо хранить существует реализация без ViewState и Dispatcher, достаточно унаследовать реализацию Fragment от класса BaseFragment
- Если экран передает action, но имеет state, существует реализация для Fragment - класс FragmentWithDispatcher и для Dispatcher - интерфейс Dispatcher
- Для экранов который могу передавать эвены и имеют state необходимо использовать реализацию для Fragment - FragmentStateful, Dispatcher - DispatcherStateful
- Kotlin - требование ТЗ
- RecyclerView - отображение списков
- Material - LifecycleActivity
- Lifecycle - ViewModel
- Dagger 2 - для экспериментов с архитектурой, в целом не нужен
- Cicerone - легковесная библиотека, как и Dagger, для приложения с 2 экранами лишнее, но экспериментов с архитектурой пойдет
- RxJava, RxAndroid - можно удалить
- Glide - в Road Map на удаление
- Добавить WindowInsets на экране результата для поддержки навигации 10 Android
- Удалить библиотеку Glide, выполнять операцию Crop на верней поверхности изображения, чтобы было видно лицо
- На старых телефонах подтормаживает при открытии экрана результата, проверить systrace(телефон тормозит сам по себе временами, возможно вина не в приложении, но сомневаюсь)
- Поддержка горизонтальной ориентации(не придумал как можно использовать 9-patch кнопки на горизонтальной ориентации)
- Улучшить поддержку планшетов(на данный момент настраиваются количество колонок на экране результата и максимальный размер кнопок, на экране Игры)
- Cards на экране результата слишком маленькие и перекрывают все изображение когда имя актера и название шоу длинное
- Экран истории игр
- Добавить время которое дается для выбора героя(на экране игры)
- Архитектура
- Добавить в UI-тесты кейсы на проверку порядка GameCard на экране Game и Result и проверить, что ответы совпадают
- Изменить API Swipeable элементов
- Заменить дизайн кнопок на экране игры
- Добавить обработку ошибок чтения из Assets
- Core компонент разрабатывался почти с нуля и на данный момент имеет некоторые недостатки
- Так как в приложении почти нет бизнес-логики возможно стоило бы перенести код из Repository в Store
- В приложении имеются UI-тесты для основных кейсов работы с View
- UI приложения написан исключительно в коде для дальнейших замеров производительности
- В плане архитектуры еще подумаю как реорагизовать StateController и ViewModel(Dispatcher) сейчас выглядят неважно, так же обнаружил проблему с обработкой
- Swipeable API разрабатывался на основе https://github.com/yuyakaido/CardStackView