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

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

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

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

3 ответов

12 просмотров

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

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

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта