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

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

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

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

3 ответов

5 просмотров

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

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

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

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

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

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
@ahndmn @ayaw0_0 здарова, на чем пишете?
Aiwan \ (•◡•) / _bot
7
Коллеги, как получить PId для собственного процесса из под линукса?
Роман Лях (rgreat)
6
Карта сайта