Один логин, разное поведениеВ Jazari Money при логине нельзя поменять код страны, в Jazari One — можно. Как это сделать?
Вот несколько способов, как сделать фичи настраиваемыми под разные бренды
1️⃣ — общий интерфейс AppVariant. Каждое приложение биндит свою реализацию через DI, а feature-модуль просто спрашивает у него что нужно.
interface AppVariant {
val brand: Brand
val supportEmail: String
// ...
}
brand — универсальное поле, которое позволяет писать if'ы. Более правильным решением было бы завести отдельные поля:
interface AppVariant {
val canChangeCountry: Boolean
val defaultCountry: Country?
val supportEmail: String
// ...
}
Но когда отличия накапливаются, на каждое заводить по флагу или другому полю — представьте сколько их будет.
При этом в Jazari Money никогда не предвидится выбора другой страны, а дефолтная страна всегда будет UK. То есть абстрагировать здесь сомнительно, хоть и можно. Проверка бренда, пусть и не такая чистая, зато проще.
Получается примерно так:
phoneState = when (appVariant.brand) {
// всегда UK
Brand.Money -> PhoneCountry(flag = flag_uk, code = "+44", iso = "GB", canChangeCountry = false)
// выбранная страна состояния
Brand.Global -> loginStorage.savedCountry()
}
Минус: фича знает про то, что бренды есть.
Плюс: фича требует минимум настройки и уже может работать с другим брендом.
2️⃣ Поле supportEmail в AppVariant — другое дело. Оно используется в нескольких местах, присутствует в обоих приложениях и имеет разные значения. Здесь уже есть смысл сделать поле вместо if'ов по всем модулям.
3️⃣ Еще один вариант — конфигурация конкретной фичи вместо общей конфигурации приложения:
data class EnterPhoneConfig(
val canChangeCountry: Boolean,
val defaultCountry: Country?,
)
Каждая фича — свой конфиг. AppVariant не разрастается хаотично.
Самая чистая абстракция. Но и кода вокруг неё больше.
Пока у нас не white-label и мы не поставляем SDK, большого смысла в таком решении для фич я не вижу. Но это хорошо работает для инфраструктурных модулей с понятной настройкой — например, параметров пушей или Network слоя.
---
В проекте в итоге используются все три подхода — в разных местах и по разным причинам.
Кажется, это и есть ответ: универсального решения нет.
С поведением разобрались. Что с UI?
→ серия
«Два приложения — один логин»#android #kotlin #androiddev #архитектура