нужно проверить доступ к камере перед ее включением.
Сейчас я делаю так:
1. Событие клика "включить поток" передается в юзкейс
2. Юзкейс дергает гейтвей/репозиторий для совершения звонка (через интерфейс ессно)
3. Гейтвей/репозиторий проверяет разрешения (тут просто - DI подбрасывает зависимость от "проверяльщика" которому для проверки нужен только контекст)
4. Если разрешений нет, то гейтвей/репозиторий отвечает ошибкой "нужны разрешения" с их перечнем (через колбэк)
5. юзкейс получая эту ошибку дергает презентер ("презентуй запрос разрешений") передавая этот перечень (через интерфейс)
6. Презентер дергает фрагмент (через интерфейс) чтобы отобразить ошибку разрешений
7. Фрагмент уже вызывает сам запрос разрешений, и по стандартному колбэку получает результат
8а. Если разрешения получены, то повторно дергает "включить поток" для юзкейса.
8б. Если не получены, то показывает диалог с ошибкой.
Да, схема рабочая, но какая-то сложная, и не очень-то и чистая.
Мне сдается, что ни юзкейс, ни презентер не должны знать о том, что есть список разрешений, которые требуется запросить. Сдается мне, что это должно разруливаться в самом гейтвее/репозитории.
Но засада в том, что для запроса разрешений необходим фрагмент/активити, которые при смене ориентации пересоздаются. Так что держать на них референс в гейтвее нельзя, чтобы утечек не было. Да и сами они теряют референс на колбэк в гейтвее...
В общем, поделитесь опытом, кто как вписывает запрос разрешений в чистую архитектуру, чтобы было по красоте?
Вообще работа с пермишенами это логика отображения, пусть презентер ей и занимается
У нас используется сущность PermissionManager, которая полностью инкапсулирует всю низкоуровневую логику работы с пермишенами. Время жизни этой сущности соответствует времени жизни презентера. Используем ее в большинстве случаев из презентера, не обращаясь к Вью. В некоторых случаях используем в интеракторах. Например есть LocationService - Rx обёртка над плей сервисами. Есть LocationInteractor, который при необходимости получить локацию сначала запрашивает разрешение у PermissionManager и потом при успехе лезет к LocationService. В том же LocationInteractor можно проверять наличие плей сервисов, и просить устанавливать их при необходимости, а событие onActivityResult обрабатывать в нем же. И все это без ведома вьюшки и презентера. Пример с PermissionManager можешь глянуть здесь https://github.com/MaksTuev/real_mvp_part1
Я юзаю AspectJ для этого
Обсуждают сегодня