два приложения тинькофф на одном телефоне
Как сделать два приложения из одного. Опыт Тинькофф Джуниор
Привет, меня зовут Андрей и я занимаюсь приложениями Тинькофф и Тинькофф Джуниор для платформы Android. Хочу рассказать о том, как мы собираем два похожих приложения из одной кодовой базы.
Тинькофф Джуниор — это мобильное банковское приложение, ориентированное на детей до 14 лет. Оно похоже на обычное приложение для взрослых, только в него добавлены некоторые функции (например, темы оформления), а другие, наоборот, выключены (например, кредитки).
.
На старте проекта мы рассматривали различные варианты его реализации и приняли ряд решений. Сразу же стало очевидно, что два приложения (Тинькофф и Тинькофф Джуниор) будут иметь значительную часть общего кода. Мы не хотели делать форк от старого приложения, а потом копировать исправления ошибок и новый общий функционал. Чтобы работать с двумя приложениями сразу, мы рассматривали три варианта: Gradle Flavors, Git Submodules, Gradle Modules.
Gradle Flavors
Многие наши разработчики уже пробовали использовать Flavors, плюс мы могли применить многомерную сборку (multi-dimensional flavors) для использования с уже существующими flavors.
Однако Flavors имеют один фатальный недостаток. Android Studio считает кодом только код активного флейвора — то есть то, что лежит в папке main и в папке флейвора. Остальной код считается текстом наравне с комментариями. Это накладывает ограничения на некоторые инструменты студии: поиск использования кода, рефакторинг и другие.
Git Submodules
Еще один вариант реализации нашей идеи — использовать сабмодули гита: вынести общий код в отдельный репозиторий и подключать его как сабмодуль к двум репозиториям с кодом конкретного приложения.
Этот подход увеличивает сложность работы с исходным кодом проекта. Также разработчикам все равно пришлось бы работать со всеми тремя репозиториями, чтобы вносить правки при изменении API общего модуля.
Многомодульная архитектура
Последний вариант — перейти на многомодульную архитектуру. Этот подход лишен недостатков, которые есть у двух других. Однако переход на многомодульную архитектуру требует временных затрат на рефакторинг.
На момент начала работы над Тинькофф Джуниор у нас было два модуля: маленький модуль API, описывающий работу с сервером, и большой монолитный модуль application, в котором была сосредоточена основная часть кода проекта.
В итоге мы хотели получить два модуля приложений: adult и junior и некий общий core-модуль. Мы выделили два варианта:
У нас было время в запасе, и мы решили начать разработку по первому варианту (модуль common) с условием перейти к быстрому варианту, когда у нас закончится время на рефакторинг.
В итоге так и случилось: мы перенесли часть проекта в модуль common, а потом оставшийся модуль application превратили в библиотеку. В результате сейчас мы получили такую структуру проекта:
У нас есть модули с фичами, что позволяет нам разграничивать «взрослый», общий или «детский» код. Однако модуль application всё еще достаточно большой, и сейчас там хранится около половины проекта.
Превращаем приложение в библиотеку
В документации есть простая инструкция по превращению приложения в библиотеку. Она содержит четыре простых пункта и, казалось бы, никаких трудностей быть не должно:
Однако конвертация заняла несколько дней и итоговый дифф получился таким:
Что же пошло не так?
Прежде всего в библиотеках идентификаторы ресурсов — это не константы. В библиотеках, как и в приложениях, генерируется файл R.java со списком идентификаторов ресурсов. И в библиотеках значения идентификаторов не являются константными. Джава не позволяет делать свитч по неконстантным значениям, и все свитчи нужно заменить на if-else.
Далее мы столкнулись с коллизией пакетов.
Предположим, у вас есть библиотека, у которой package = com.example, и от этой библиотеки зависит приложение с package = com.example.app. Тогда в библиотеке будет сгенерирован класс com.example.R, а в приложении, соответственно, com.example.app.R. Теперь создадим в приложении активити com.example.MainActivity, в которой попробуем обратиться к R-классу. Без явного импорта будет использован R-класс библиотеки, в котором не указаны ресурсы приложения, а только ресурсы библиотеки. Однако Android Studio не подсветит ошибку и при попытке перейти из кода к ресурсу всё будет окей.
Dagger
В качестве фреймворка для инъекции зависимостей мы используем Dagger.
В каждом модуле, содержащем активити, фрагменты и сервисы, у нас есть обычные интерфейсы, в которых описаны inject-методы для этих сущностей. В модулях приложений (adult и junor) интерфейсы-компоненты даггера наследуются от этих интерфейсов. В модулях мы приводим компоненты к необходимым для данного модуля интерфейсам.
Мультибиндинги
Разработку нашего проекта значительно упрощает использование мультибиндингов.
В одном из общих модулей мы определяем интерфейс. В каждом модуле приложения (adult, junior) описываем реализацию этого интерфейса. С помощью аннотации @Binds указываем даггеру, что всякий раз вместо интерфейса необходимо инжектить его конкретную реализацию для детского или взрослого приложения. Также мы нередко собираем коллекцию реализаций интерфейса (Set или Map), при этом такие реализации описаны в разных модулях приложения.
Флейворы
Для разных целей мы собираем несколько вариантов приложения. Флейворы, описанные в базовом модуле, должны быть описаны и в зависимых модулях. Также для корректной работы Android Studio необходимо, чтобы во всех модулях проекта были выбраны совместимые варианты сборки.
Выводы
За короткий срок мы реализовали новое приложение. Теперь мы отгружаем новый функционал в двух приложениях, написав его один раз.
При этом мы потратили некоторое время на рефакторинг, попутно уменьшив технический долг, и перешли на многомодульную архитектуру. По пути мы столкнулись с ограничениями со стороны Android SDK и Android Studio, с которыми успешно справились.
10 лайфхаков для владельцев карты Tinkoff Black от Тинькофф Банка
Владельцы карты Tinkoff Black получают процент на остаток и кэшбэк за покупки. Но у карты есть и другие особенности, которые позволяют сделать её использование ещё более выгодным. Рассказываем о лайфхаках, которые помогут сэкономить.
1. Можно не платить за обслуживание
Обслуживание карты стоит 99 ₽ в месяц (1188 ₽ в год).
Бесплатно можно обслуживаться, если выполнять одно из этих условий:
иметь вклад или кредит в Тинькофф Банке на сумму от 50 тысяч ₽;
хранить на карте как минимум 30 тысяч ₽ в течение месяца.
Найти карту другого банка
2. Каждый месяц можно выбирать категории повышенного кэшбэка
Повышенный кэшбэк начисляется при сумме покупок от 20 ₽. Если не выбрать категорию кэшбэка, то он начисляться не будет.
Возможность выбора новых категорий повышенного кэшбэка появляется в последний день каждого месяца. Например, 31 мая можно выбрать категории на июнь.
Чтобы получить максимум кэшбэка — выбирайте категории, в которых вы тратите больше всего денег.
Не забывайте, что кэшбэк из раздела «Спецпредложения» нужно активировать перед оплатой. Иначе она пройдёт как обычная покупка.
Кэшбэк начисляется рублями, а не бонусами или баллами. Деньги возвращаются на счёт по итогам месяца. Их можно снять через банкомат или потратить по карте.
3. Мелкие покупки лучше оплачивать другой картой
За обычные покупки банк начисляет 1% от потраченной по карте суммы. На практике это 1 ₽ с каждых 100 ₽ в чеке. Но стоит учитывать, что кэшбэк начисляется только с каждых полных 100 ₽. Если сумма меньше, то бонуса не будет. Например, банк не начислит кэшбэк за покупки на 10, 20, 50 и 99 ₽. Если сумма покупки будет 199 ₽, то кэшбэк составит 1 ₽.
В реальной жизни покупки редко будут равны сумме, кратной 100 ₽, и часть кэшбэка с потраченных за месяц денег вы не получите. Так что мелкие покупки с чеком до 100 ₽ лучше оплачивать другой картой, по которой есть бонусы за такие операции. Например, картой «Польза» от Хоум Кредита.
4. При крупных тратах нужно следить за лимитом кэшбэка
Максимальная сумма кэшбэка в обычной и повышенной категориях покупок ограничена 3000 ₽ в месяц. Чтобы получить эти деньги за обычные покупки, нужно потратить 300 тысяч ₽, а если тратить только в выбранных категориях с кэшбэком 5%, то потребуется всего 60 тысяч ₽. За б о льшие траты кэшбэк начисляться не будет.
Максимальный размер бонусов за покупки у партнёров может составлять 6000 ₽ в месяц.
Итого каждый клиент может возвращать до 9000 ₽ кэшбэка каждый месяц. Как только у вас закончился лимит кэшбэка по карте Tinkoff Black, начинайте тратить деньги по другой карте с бонусами.
Кэшбэк по карте Tinkoff Black
За обычные покупки
До 3 тысяч ₽ в месяц
За покупки в выбранной категории
До 3 тысяч ₽ в месяц с учётом кэшбэка за обычные покупки
За покупки у партнёров
До 6 тысяч ₽ в месяц
5. Можно открыть счёт в 30 валютах и выгодно их обменивать
Каждая карта Tinkoff Black может стать мультивалютной, то есть быть привязанной к нескольким валютам. Это бесплатно. Владелец карты может, например, открыть счёт в американских долларах, евро, фунтах стерлингов, грузинских лари, турецких лирах и т. д. Карту можно привязать к любой валюте и быстро изменить её при необходимости.
Счёт в иностранной валюте можно пополнить с рублёвого счёта. Курс при этом будет приближен к биржевому. Именно поэтому самый выгодный курс будет с понедельника по пятницу с 10:00 до 18:30, когда работает Московская биржа. В другое время он может быть выше.
Как открыть счёт в другой валюте
В приложении банка нажмите «+», который располагается рядом с изображением карты, а затем выберите опцию «Открыть счёт в новой валюте».
Платить с валютного счёта выгодно в стране, где обращается купленная вами валюта. Например, счётом с евро — в Европе. Если платить с рублёвого счёта за рубежом, есть риск переплатить из-за конвертации.
Не забывайте переключать валютный счёт. Если ваша карта привязана к долларовому счёту, а вы оплатите покупки в «Пятёрочке», то потеряете часть суммы на конвертации из долларов в рубли.
Для привязки карты к другому валютному счёту нужно нажать на изображение карты в приложении, выбрать опцию «Действия», затем — нажать «Связать с другим счётом».
6. Может быть комиссия при снятии наличных за границей
Банк позволяет без комиссии снимать от 3 до 100 тысяч ₽ «в любых банкоматах по всему миру». Но это не всегда работает за границей, где нужно снять местную валюту. Иногда комиссию может взять иностранный банк, через банкомат которого снимаются наличные.
В разделе «Помощь» на сайте Тинькофф есть пояснение: «Иностранные банкоматы могут брать свою комиссию, к сожалению, с этим мы ничего поделать не можем».
Избежать комиссии помогут такие советы:
выбирайте банкоматы крупных и известных банков;
если банкомат предупреждает о комиссии, то попробуйте найти другой;
найти банкомат, который не берёт комиссию, можно на сайте Тинькофф Банка или через его приложение (на главном экране выбрать «Ещё», затем «Инфо» и опцию «Банкоматы»).
7. Можно открыть бесплатную карту для близких
Если вы хотите предоставить доступ к своему банковскому счёту близким (например, супруге, детям или родителям), то можете бесплатно выпустить им дополнительную карту. Для этого нужно нажать на кнопку «Открыть новый продукт» в приложении Тинькофф Банка. Потребуются паспортные данные человека, которому вы открываете карту.
8. Можно также поделиться счётом
Вы можете предоставить доступ к счёту карты Tinkoff Black любому человеку, который также является клиентом Тинькофф Банка. Сделать это можно при нажатии значка «шестерёнка» в правом верхнем углу экрана. Затем в меню выбираете опцию «Предоставить доступ к счёту». Потом нужно указать имя и фамилию человека, которому вы хотите дать доступ. Выберите тип доступа: полный или частичный (видеть только баланс). Далее вы сможете установить лимиты на расход и снятие денег с вашего счёта. После подтверждения СМС другой человек получит доступ к вашему счёту, если примет это предложение.
Так к счёту можно подключить до пяти человек.
9. Но лучше для членов семьи выбрать отдельную карту
Ещё одна карта Tinkoff Black позволит:
Больше зарабатывать на кэшбэке. Если вам не предложили нужные категории повышенного кэшбэка, то есть вероятность, что это произойдёт с близким человеком. Тогда такие покупки выгодно оплачивать его картой.
Получать процент на остаток с больших сумм. Если на вашей карте больше 300 тысяч ₽, то процент на остаток будет начисляться только на сумму до 300 тысяч ₽ (при условии трат от 3000 ₽ в месяц). На всё, что больше — нет. Например, на вашей карте лежит 500 тысяч ₽. Банк начислит процент на остаток только на 300 тысяч ₽, оставшиеся 200 тысяч ₽ не будут приносить доход. Их выгодно перевести на другую карту для получения процентов.
Больше переводить без комиссий. По карте Tinkoff Black можно бесплатно переводить каждый месяц до 20 тысяч ₽ по номеру карты в любой банк. Если у ваших близких есть ещё одна карта, то можете пользоваться ей — тогда лимит составит уже 40 тысяч ₽ в месяц.
10. Можно получить металлическую карту
У Тинькова есть второй вариант карты Tinkoff Black для богатых людей, который называется Tinkoff Black Metal. Её отличие от простой «чёрной» карты в:
кэшбэке до 30 тысяч ₽ в месяц (у обычной карты — 3 тысячи ₽);
5% (4% с 22 мая 2020 года) на любой остаток (у обычной — до 300 тысяч ₽);
переводах на карты другого банка до 50 тысяч ₽ в месяц (у обычной — до 20 тысяч ₽);
туристической страховке на пять человек с покрытием до 100 тысяч долларов (у обычной нет такой опции).
Стоимость обслуживания — 1990 ₽ в месяц (23 880 ₽ в год). Но за карту не нужно платить, если тратить по ней от 200 тысяч ₽ в месяц или хранить на счетах в Тинькофф Банке от 3 миллионов ₽.
Тарифы актуальны на 19 мая 2020 года. Они могут измениться в любое время. При написании статьи мы не сотрудничали с Тинькофф Банком.