Size: a a a

Android Live 🤖

2020 July 13
Android Live 🤖
Всем привет!

С самого начала ведения этого канала, я не рассказывал о том, кто я, где работаю и чем занимаюсь, я не связывал канал с собой. Мне кажется, что это неправильно, особенно когда на канале уже больше 5000 человек. Так давайте же исправим это! 😊

Меня зовут Александр Горшков, и я автор этого канала. Уже больше 5 лет я работаю Android-разработчиком из которых последние 2 года – удалённо. Мне очень нравится этот формат работы, так как он позволяет удачно планировать своё время и много путешествовать, чем я собственно и пользуюсь.

Сейчас моя работа связана с проектом в сфере агрономии, где наша команда оцифровывает жизнь одного из крупнейших российских холдингов, делая жизнь и работу агрономов проще.

Кроме этого, я организатор GDG сообщества у себя в городе Брянск. Об этом сообществе вы не раз читали у меня на канале.

Мне всегда можно написать в личные сообщения @al_gorshkov.
Ваш фидбек нереально заряжает писать новые посты и делать «движухи». Если вдруг у вас есть какие-то идеи для канала или вам не хватает какой-то информации, связанной с Android — вы всегда можете написать мне об этом.

Возможно, кому-то интересно, чем я живу вне канала, поэтому вот ссылка на мой Instagram: https://www.instagram.com/al.gorshkoov

Спасибо что вы здесь!
До новых постов! 😎
источник
2020 July 15
Android Live 🤖
​​Single click в Android
#разработка #статьи #опрос

Казалось бы, что может быть проще, чем сделать клик на кнопку. Используй стандартный View.OnClickListener и будь уверен, что кнопка нажмётся. Однако, не всё может быть столь очевидно.

Опытные разработчики сталкивались с какими-то задвоенными действиями в приложении. Например, два запроса в сеть вместо одного. Часто причиной подобного поведения является именно стандартный ClickListener.

Решения может быть два:
• блокировка кнопки до появления какой-то реакции или ответа;
• добавление небольшой задержки при нажатии на кнопку.

Любопытно, что аннотация @OnClick из библиотеки ButterKnife, использовала именно DebouncingOnClickListener под капотом.
Но сегодня, когда основная масса разработчиков использует Kotlin synthetics или View Binding, мы забываем про этот «хак».

Автор в статье напоминает об этой фиче и рассказывает, как просто использовать его, совмещая с extension-функциями Kotlin. Получилось довольно удобно, и теперь можно делать:

my_button.setOnCLick(intervalMillis = 500) {
   // Do stuff
}

вместо стандартного клика.

Кто считает, что клик с задержкой — это костыль?
источник
2020 July 17
Android Live 🤖
Ask me anything! — Badoo
#статьи

На Хабре есть довольно интересная рубрика, где все желающие могут пообщаться с ребятами из различных команд.
На мой взгляд, это круто, так как не каждый может побывать на конференциях, и встретиться с интересующей командой.

Думаю, что приложение Badoo особо не нуждается в представлении. 🤓
В Android-приложениях этой компании больше 1,3 млн строк кода, а в Android-команде более 20 разработчиков. Основной язык разработки — Kotlin, архитектурные паттерны — MVI и RIBs, база данных — SQLite.
А сегодня разработчики отвечают на вопросы из комментариев.

Задать интересующий вопрос можно тут.
источник
2020 July 20
Android Live 🤖
​​Как именовать цвета в Android?
#статьи #разработка

Нейминг переменных — одна из самых неочевидных вещей при написании нового кода.  А правильное именование цветов — это отдельная тема, которой уделяют внимание мало разработчиков.

Уверен, что вы видели подобные цвета в каких-то проектах: login_button_background или confirmed_bg_gradient_end. Основная проблема — это отсутствие возможности переиспользовать эти цвета без ущерба к смыслу.

Вторым распространённым подходом является нейминг в стиле палитры Material Colors.  Например, тут вы можете увидеть цвета red_50, red_100, green_a100 и т.д. Проблема в том, что если вы видите цвета с цифрами на конце, то это не дает полное представление о том, как выглядит этот цвет. Например, красный с индексом 50 — это цвет, который больше похож на розовый. Это делает их повторное использование также затруднительным.

Интересный подход предлагает автор этой статьи. Он предлагает использовать сервис, который подберет название для абсолютно любого цвета. Тут вы получаете преимущество в отвязке от компонентов приложения и возможность полного переиспользования.

Как по мне, любопытный подход, который можно взять на вооружение.
источник
2020 July 22
Android Live 🤖
​​Как обеспечить безопасность приложения?
#разработка #статьи #комментарии

Для большинства приложений — безопасность очень важная вещь. Это особенно она важна, если вы работаете с данными пользователей или у вас есть покупки. Ведь никто не хочет, чтобы платной версией приложения пользовались бесплатно. 😉

Автор в статье дал несколько советов, которые значительно улучшат безопасность внутри приложения.

обфускаций кода — наверное, первая и самая важная вещь, которая должна быть у вас включена. Для этого нужно прописать minifyenabled = true в вашем build.gradle приложения. Начиная с Android Studio 3.5 по умолчанию включен R8 вместо pro-guard, что, судя по всему, делает реверс-инжениринг приложения тяжелее. Обязательно проверьте своё приложение после включения этого флага и уделите особое внимание enum-классам.

проверка на root — по сути root позволяет пользователям делать на их устройстве чуть больше, чем обычным пользователям, например изменение системных файлов или доступ ко внутреннему хранилищу приложения. Запрет использования приложения на root-устройствах может быть критичным.
Мне не приходилось делать проверку на root, но судя по всему, есть решение в виде библиотеки RootBeer.

зашифрованное соединение с сервером — не мне рассказывать, что большинство приложений связаны с сервером. Обязательно проверьте, насколько безопасно это соединение: это обязательно должно быть https соединение. Можно добавить ещё Certificate Pinning, которым вы будете шифровать каждый запрос на сервер. Пример есть тут.

шифрованное локальное хранилище — тут важно оценить «важность» тех данных, которые хранятся на устройстве. Если эти данные позволяют выполнять запросы на сервер от лица пользователя (например, это token), то обязательно стоит задуматься о безопасном хранении этой информации. Для шифрования sharedpreferences можно использовать security-crypto, который хоть и не находится в релизной стадии, но уже работает довольно сносно.

debug mode и логи — никогда не кладите в логи какую-то важную информацию. Проверьте, включен ли deguggable = false в релизном билде.

А что ещё важно учитывать, чтобы сделать приложение безопасным? Давайте обсудим в комментариях
источник
2020 July 24
Android Live 🤖
​​Firebase App Distribution
#разработка

Одним из способом доставки билда тестировщикам, является Firebase App Distribution. Это хороший и простой способ. И у него есть следующие преимущества:
• бесплатный;
• нет лимитов на размер файла приложения;
• работает и на iOS и на Android;
• можно добавлять группы тестировщиков;
• можно приглашать в тестирование по ссылке;
• добавление release notes к каждому билду;
• интеграция с Android Studio.

Для меня ключевым является последний пункт. Даже если у вас в проекте нет CI-системы, то вы легко можете выполнить одну gradle-команду, чтобы загрузить свежую версию приложения в Firebase с release notes и оповестить всех ваших тестировщиков.

Оповещением займется сам Firebase, а мы давайте посмотрим, как же получить release notes от HEAD в git до последнего тега. Пусть все коммиты с префиксом {ADD} — это наши release notes.
Для этого выполним команды:
1) def tagNumber = "git describe --abbrev=0 --tags".execute().text.trim() — вернёт там последий тэг
2) def releaseNotes = ("git --no-pager log ${tagNumber}...HEAD --no-merges --date-order --format=%s --grep {ADD}").execute().text.trim() — вернёт нам список коммитов с префиксом {ADD}
3) new File("release_notes.txt").text = releaseNotes — сохраним всё в файл

А дальше чуть-чуть настроим Firebase:

firebaseAppDistribution {
   releaseNotesFile = project.rootProject.file('release_notes.txt')
}


Укажем, что хотим взять release notes именно из этого файла, а остальные настройки лучше посмотреть тут.

Осталось только объединить описанные выше команды в одну при помощи gradle task, назовём её logs и выполним эти команды:

task getLogsAssembleAndDistributeQaRelease(type: GradleBuild) {
   
tasks = ['clean',
            'logs',
            'appDistributionUploadQaRelease']
}

В итоге наш билд улетит в Firebase, главное дождаться сборки и не выключить компьютер. 😉
источник
2020 July 28
Android Live 🤖
Друзья, нужна ваша помощь.

На канале хочу запустить новую рубрику. Суть её состоит в том, чтобы брать интервью у разработчиков, живущих в других странах и городах.
Будем разговаривать про уровень жизни в стране, культурные привычки, наличие работы, насколько легко туда переехать, нравится ли жить там, сколько стоит жизнь, ну и самое важное — какой зарплатный уровень и налоги.
Получится обширная статья про страну, направленная на жизнь разработчика. Ну а цифры буду суммировать в табличку, чтобы сделать вывод: «Где же лучше жить разработчику?»

Скажите, насколько было бы вам интересно видеть эту рубрику? Какие страны хотелось бы видеть прежде всего и в каком формате?

Лично мне это кажется интересным, ведь информации из первых рук в Интернете не так много. Пишите в комментариях или мне в личку @al_gorshkov и, конечно, голосуйте реакциями. 🤓
источник
2020 July 29
Android Live 🤖
Ого, понял, что идея с рубрикой вам зашла!

Особая благодарность подписчикам, которые написали мне в личку с предложением рассказать о своём городе. Если кто-то ещё хочет, но при этом стесняется — не надо переживать, пишите мне @al_gorshkov, уверен, что остальным будет интересно прочитать о вашем опыте.😌
источник
2020 July 30
Android Live 🤖
Android Academy про Android 11
#конференции

Уже прошло пару месяцев с момента появления Android 11, но всё равно ещё есть доклады, которые рассказывают о новых фишках и деталях.

Ребята из Android Academy Global делают мероприятие, где будет 3 темы:

1️⃣ Jetpack Dagger Hilt, Мануэль Виво, Google
2️⃣ ActivityResultApi and AppStartUp Api, Алексей Быков, Revolut
3️⃣ Jetpack Paging 3, Дмитрий Мовчан, Revolut

Оно будет уже совсем скоро, 4 августа в 19:00 по Москве. А зарегистрироваться можно тут.
источник
2020 August 03
Android Live 🤖
​​Оптимизация приложения для автозаполнения
#разработка

Совсем недавно, столкнулся с интересным, и на первый взгляд, странным багом. У одного пользователя приложения при вводе параметров в EditText появлялось всплывающее сообщение с выбором логина и пароля для входа в него (в приложение).
Пришлось капнуть в сторону решения этого бага, и выяснил одну деталь, которую я раньше игнорировал.

При создании нового EditText в xml, он предлагает ввести атрибут importantForAutofill. Чтобы убрать warning, можно просто игнорировать этот атрибут или добавить в EditText параметр tools:ignore="Autofill". В этом случае, вы уберёте warning, но сможете поймать похожий на мой баг.

Однако лучше не полениться и оптимизировать своё приложение для сервисов автозаполнения. 😊
Например, если вы не хотите, чтобы ваш EditText был доступен для заполнения, используйте в нём параметр android:importantForAutofill="no". Но, например, для ввода логина или пароля, можно поставить этот атрибут yes и добавить новый атрибут android:autofillHints="password" для паролей и android:autofillHints="emailAddress" для e-mail.

В этом случае, система будет предлагать пользователю сохранять параметры для входа вашего приложения в менеджер паролей. Иногда это работает автоматически, но чтобы улучшить качество вашего продукта, можно добавить парочку этих нехитрых параметров.

Подробнее про автозаполнение и доступны константы можно прочитать тут.
источник
2020 August 05
Android Live 🤖
​​Жизнь в Израиле
#интервью #экспаты

Итак, начнём новую рубрику на канале!

Наш первый гость — это Андрей Раньков. Он проживает в Израиле, город Кфар-Саба (15 км от Тель-Авива) вместе с женой и двумя детьми. Андрей является Mobile Lead в компании Appcard.

У каждого из вас есть возможность спросить его о жизни в Израиле, легко ли туда попасть разработчику, каков уровень жизни да и вообще всё, что вы давно хотели спросить у местного жителя, но не знали у кого.

Ссылка на форму, где можно задавать свои вопросы тут.

А если у вас есть предложения или вопросы по этому формату, или же вы проживаете в других странах и хотите поделиться опытом, то пишите мне @al_gorshkov.
источник
2020 August 06
Android Live 🤖
​​Используйте In-App Review API для Google Play ревью
#разработка

Мне кажется, что для многих разработчиков получение оценки приложения от пользователя (да и рейтинг приложения в целом) — довольно важная часть взаимодействия с пользователями. Но тот факт, что пользователь оставил оценку приложению — довольно сложно отследить.

Наконец-то Google даёт нам API для того, чтобы пользователь мог поставить оценку приложения прямо в нем. 👍🏻
Подробнее о том, как работает API можно почитать тут.

По сути, это API — часть Play Core Library, которая сделана для Java/Kotlin, C++ и Unity. Google подчёркивает, что важно определить, где в вашем приложении самое лучшее место для того, чтобы попросить пользователя оставить оценку.
источник
2020 August 11
Android Live 🤖
​​Анимация как в Google почте
#разработка #статьи

Ни для кого не секрет, что пользователей привлекают приятные анимации в приложении. Google старается делать инструменты для создания анимаций в приложении всё более доступными, а мне по-прежнему нравятся статьи, где описываются крутые примеры с тем, как создавать анимации. 🙃

В этой статье автор описывает, как сделать анимацию открытия почты приложения Google-почта. На мой взгляд, получилась приятная и ненавязчивая анимация, которую можно использовать в качестве основной при открытии экранов вашего приложения.
источник
2020 August 17
Android Live 🤖
​​KotlinX Datetime
#разработка #библиотека

Совсем недавно разработчики из JetBrains анонсировали библиотеку для работы с датами kotlinx-datetime версии 0.1.

Это здорово, потому что до последнего момента не было возможности работать с датами напрямую из Kotlin. И если мы, как Android-разработчики, могли напрямую ссылаться на API java.time.*, то при работе с мультиплатформой такой возможности не было.

Более детально о работе с этой библиотекой можно прочесть тут
источник
Android Live 🤖
​​Давненько на канале не проводилось конкурсов. Это нужно срочно исправлять😉

Как и обычно, вам нужно будет решить небольшую задачку, решение которой должно быть максимально коротким.
Кто уже давно на канале, возможно, участвовал в подобных активностях.

Старт конкурса 19 августа в 18:00. Задачку, как всегда, можно будет решить в течении 48 часов.

В этот раз за призы отвечают ребята из команды Badoo.
И вас ждёт 3 призовых места:
🥇место — толстовка + сумка + мерч;
🥈 место — футболка + сумка + мерч;
🥉 место — сумка + мерч.

Кстати, команда Badoo Tech, ведёт интересный Telegram канал, где делится своим опытом. Подписан и давно читаю: @badoo_tech
источник
2020 August 19
Android Live 🤖
​​Эти PIN-коды могут быть легко подобраны
#статьи

Наткнулся на любопытное исследование безопасности pin-кодов, которые используют пользователи для разблокировки смартфонов.
Не секрет, что сегодня система обязательно запрашивает пин-код как, альтернативный биометрии, способ разблокировки телефона.

Мне кажется, что мало кто отдаёт себе отчёт, насколько безопасным является их код для разблокировки. Сегодня я хочу поделиться с вами исследованием, где публикуются списки небезопасных pin-кодов. Можно попробовать найти в нём свой собственный.  😏

Интересно, что исследователи пришли к выводу, что 6-значные коды фактически не увеличивают безопасность, так как в этом случае пользователи стараются вводить более простые коды: даты, запоминаемые коды или шаблоны клавиатуры.

Ссылка на исследование тут.
источник
Android Live 🤖
​​Бесконечная строка
#конкурс

У вас есть строка, которая теоретически может повторяться бесконечное количество раз.
Но кроме этой строки есть и ограничитель, который заставляет эту строку остановиться на заданном числе. Ваша задача посчитать, сколько раз встречается символ a в этой бесконечной, но ограниченной числом, строке.

Входные параметры
s — строка, которая становится бесконечной;
n — число-ограничитель до которого нужно посчитать количество символов a;

Выходные параметры
Целое число — количество символов a в этой строке.

Ограничения
1 <= s.length() <=100
1 <= n <=10^6

Пример входных данных
aba
10

Пример выходных данных
7

Объяснение
Строка aba, которая может повторяться бесконечно ограничивается числом 10 и превращается в  abaabaabaa. И количество символов a в ней равно 7.

Шаблон на языке Kotlin.

Условия конкурса
1. Решения принимаются в течении 48 часов, то есть до 21 августа 2020 года, 18:00. Необходимо отправить только тело функции.

2. Отправить можно только одно решение.

3. Можно исправлять отправленное решение неограниченное количество раз. Принятым будет считаться решение, отправленное последним.

4. Победителем будет являться самое короткое тело функции func().

5. В подсчете количества символов учитывается только тело функции. Например, в примере return 0; количество символов равняется 9. Это и определяет длину решения.

6. Переименовывать функцию нельзя, как и изменять входные параметры. Убирать return также запрещается.

7. Требований к форматированию нет, важно рабочее решение. Можно убирать пробелы между переменными и писать код в одну строку, если это не нарушит работоспособность решения.

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

Обратите внимание, что решения, которые не удовлетворяют условиям конкурса не будут учитываться при проверке. Очень часто участники забывают о том, что нужно отправить только внутреннюю часть функции (тело функции), а не всю функцию, включая её заголовок, поэтому будьте внимательны при отправке итогового решения.

Также, если кто-то хочет помочь в проверке решений при помощи тестов, то пишите мне.

Решение нужно отправить в форму. Желаю всем удачи!
источник
2020 August 21
Android Live 🤖
​​Распознавание рисунков при помощи ML Kit
#статьи #разработка

Довольно интересной областью разработки является машинное обучение. Если вы хотели попробовать эту область, но не знали как к ней подступиться, то предлагаю вам этот вариант.

Автор рассматривает Digital Ink Recognition API из ML Kit, которое распознаёт написанный вручную текст или изображение с экрана. По его словам, результаты довольно точные.

Любопытно, что приложение также может работать оффлайн, правда при этом надо скачать модель в виде 20 мегабайт.

Описание того, как сделать такое приложение и ссылка на готовое можно найти тут.
источник
2020 August 24
Android Live 🤖
​​Результаты конкурса «​​Бесконечная строка»
#конкурс

Итак, самое время подвести итог нашего конкурса.
В этот раз в конкурсе участвовало 65 решений. Довольно много было и решений, которые не удовлетворяли условиям конкурса: присутствовали и удаления return из функции, и ошибки каста Long в Int.
Такие решения не прошли отбор, так как условия чётко оговаривали правила того, что нельзя никак менять параметры функции, равно как и удалять return. 😊

В результате победили решения, которые имели 52 символа:

1) return(0..n-1).count{s[it.toInt()%s.length]=='a'}*1L@Namolem
2) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L@amihusb
3) return(0..n.toInt()-1).count{s[it%s.length]=='a'}+0L@luckycactus

Так как решения участников имеют однинаковую длину, то рандомное распределение призов выглядит следующим образом:
1) толстовка + сумка + мерч — достаются номеру 3, или @luckycactus
2) футболка + сумка + мерч — достаются номеру 2, или @amihusb
3) сумка + мерч — достаются номеру 1, или @Namolem

Ссылка на видео с рандомным распределением тут.

Спасибо команде Badoo на отличный мерч и призы.
Кроме того, отдельное спасибо @g_apollo и @KoteykaEvil за помощь в проверке заданий.

Также благодарю всех кто участвовал в конкурсе! И поздравляю победителей! 😎

Конкурс далеко не последний, поэтому вновь спрашиваю вас: какие призы вам были бы наиболее интересны при проведении подобных конкурсов? Напишите, пожалуйста, мне.
источник
2020 August 25
Android Live 🤖
​​Android Lint Framework — введение
#разработка #статьи

Android Studio даёт довольно много инструментов для того, чтобы писать качественный код. Одним из таких является Lint: IDE подсказывает вам о каких-то неточностях в вашем коде и распространённых багах, к которым можем привести этот код.

Однако самым главным преимуществом является то, что каждый сам может написать свои правила для кода. 😎 Автор этой статьи описывает шаги для написания своего lint-правила:  

🔹какие зависимости подключить;
🔹от какого класса наследоваться;
🔹как прописать типы классов, на которые будет распространяться правило;
🔹как применить написанное правило.

Также есть неплохой репозиторий от Uber, где содержится целый набор lint-проверок.
источник