214 похожих чатов

Ребята, подскажите, кто как разрешения запрашивает в Чистой Архитектуре? Например, мне

нужно проверить доступ к камере перед ее включением.
Сейчас я делаю так:
1. Событие клика "включить поток" передается в юзкейс
2. Юзкейс дергает гейтвей/репозиторий для совершения звонка (через интерфейс ессно)
3. Гейтвей/репозиторий проверяет разрешения (тут просто - DI подбрасывает зависимость от "проверяльщика" которому для проверки нужен только контекст)
4. Если разрешений нет, то гейтвей/репозиторий отвечает ошибкой "нужны разрешения" с их перечнем (через колбэк)
5. юзкейс получая эту ошибку дергает презентер ("презентуй запрос разрешений") передавая этот перечень (через интерфейс)
6. Презентер дергает фрагмент (через интерфейс) чтобы отобразить ошибку разрешений
7. Фрагмент уже вызывает сам запрос разрешений, и по стандартному колбэку получает результат
8а. Если разрешения получены, то повторно дергает "включить поток" для юзкейса.
8б. Если не получены, то показывает диалог с ошибкой.
Да, схема рабочая, но какая-то сложная, и не очень-то и чистая.
Мне сдается, что ни юзкейс, ни презентер не должны знать о том, что есть список разрешений, которые требуется запросить. Сдается мне, что это должно разруливаться в самом гейтвее/репозитории.
Но засада в том, что для запроса разрешений необходим фрагмент/активити, которые при смене ориентации пересоздаются. Так что держать на них референс в гейтвее нельзя, чтобы утечек не было. Да и сами они теряют референс на колбэк в гейтвее...

В общем, поделитесь опытом, кто как вписывает запрос разрешений в чистую архитектуру, чтобы было по красоте?

3 ответов

14 просмотров

Вообще работа с пермишенами это логика отображения, пусть презентер ей и занимается

У нас используется сущность PermissionManager, которая полностью инкапсулирует всю низкоуровневую логику работы с пермишенами. Время жизни этой сущности соответствует времени жизни презентера. Используем ее в большинстве случаев из презентера, не обращаясь к Вью. В некоторых случаях используем в интеракторах. Например есть LocationService - Rx обёртка над плей сервисами. Есть LocationInteractor, который при необходимости получить локацию сначала запрашивает разрешение у PermissionManager и потом при успехе лезет к LocationService. В том же LocationInteractor можно проверять наличие плей сервисов, и просить устанавливать их при необходимости, а событие onActivityResult обрабатывать в нем же. И все это без ведома вьюшки и презентера. Пример с PermissionManager можешь глянуть здесь https://github.com/MaksTuev/real_mvp_part1

Я юзаю AspectJ для этого

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта