Mike
Простите за многабукаф :)
а можешь разбить на отдельные сообщения? Тогда отвечать будет проще
⬤ vitaly
Всем привет, знающие леди и джентльмены. Подскажите по некоторым общим вопросам. Есть задача наш сервис (аутентификация пользователя / подтверждение его действия) поставлять для сторонних разработчиков (нацелено на организации типа банков). Первый основной флоу - регистрация пользователя в системе. Регистрация включает в себя генерацию пары ключей, шифрование данных, несколько хттпс реквестов, парсинг пушей с фаербейса, сохранение данных пользовательской учётки (типа юзернейм и юзерсид для секьюрческих целей) в бд. Вопросы у меня такие: 1. Насколько критично выпиливать зависимости от ырыкса и уретрофита по шкале от 1 до 100, учитывая, что первое сильно замедлит перенос существующего функционала в отдельный модуль, который по задумке должен быть общим для нас и для разрабов у клиента, а времени и знаний альтернатив не очень много?
⬤ vitaly
2. Нормально ли тянуть туда рум и вообще зашивать ответственность за сохранение данных для регистрации в библиотеку, или есть какие-то принципиальные вещи, по которым этого лучше не делать?
⬤ vitaly
3. Как лучше настроить проброс пушей внутрь либы? Есть ли какие-то проработанные практики, или тупо в онресиве и методе получения токена просить проставлять какие-то перехватчики?
⬤ vitaly
4. Какие ещё могут быть подводные камни?
Mike
Всем привет, знающие леди и джентльмены. Подскажите по некоторым общим вопросам. Есть задача наш сервис (аутентификация пользователя / подтверждение его действия) поставлять для сторонних разработчиков (нацелено на организации типа банков). Первый основной флоу - регистрация пользователя в системе. Регистрация включает в себя генерацию пары ключей, шифрование данных, несколько хттпс реквестов, парсинг пушей с фаербейса, сохранение данных пользовательской учётки (типа юзернейм и юзерсид для секьюрческих целей) в бд. Вопросы у меня такие: 1. Насколько критично выпиливать зависимости от ырыкса и уретрофита по шкале от 1 до 100, учитывая, что первое сильно замедлит перенос существующего функционала в отдельный модуль, который по задумке должен быть общим для нас и для разрабов у клиента, а времени и знаний альтернатив не очень много?
Что мешает перенести в модуль вместе с ырыксом и ретрофитом? А потом, когда фичи сделаны, играться с выпиливанием.
Arsen
@Harmonizr по поводу абзаца про нул и рх: суть в том, что эта "фп парадигма" (еще называют Railway oriented programming) подразумевает, что в success ветке всегда будут корректные значения, иначе флоу уходит в fail. т.е. нулл маппится в дефолт значение или emptyList или бросается какая-нибудь ошибка типа MyNotFoundError. Ветвление на success\fail происходит на ранней стадии (у источника данных), а делать проверки на нул в колбеке success - это уже поздно, двойная проверка получается.
⬤ vitaly
Что мешает перенести в модуль вместе с ырыксом и ретрофитом? А потом, когда фичи сделаны, играться с выпиливанием.
Вдруг кодеры у клиента посмотрят и скажут "ну нафиг, у них артефакт за 10 мегабайт, стопудняк дурачок туда фреймворков натаскал", вот этого боюсь))
Mike
Вдруг кодеры у клиента посмотрят и скажут "ну нафиг, у них артефакт за 10 мегабайт, стопудняк дурачок туда фреймворков натаскал", вот этого боюсь))
ну 10 — это слишком, конечно, но главное — чтоб хорошо работало, а над отпиливанием лишнего можно попотеть позже
Arsen
null вполне может быть успешным результатом. К ФП это отношения не имеет.
зависит от предпочтений, но обычно возвращать нул - плохая практика
Mike
зависит от предпочтений, но обычно возвращать нул - плохая практика
🤷‍♂️ согласен, существование null в языке — это вообще ошибка, но с этим поздно что-либо делать
Mike
...а настоящие value-типы будут нескоро, тем более в андроиде
Arsen
🤷‍♂️ согласен, существование null в языке — это вообще ошибка, но с этим поздно что-либо делать
но и пускать на самотек тоже не вариант, так хоть можно по максимуму сгладить последствия
Arsen
котлин выручает
Arsen
даже в гугле стали переобуваться и теперь линт просит использовать requireЧто-то() методы, вместо прямых обращений к налабл полям
Mike
даже в гугле стали переобуваться и теперь линт просит использовать requireЧто-то() методы, вместо прямых обращений к налабл полям
Да, вот это вообще очень хороший поворот. Раньше было непонятно, что ожидать от Android SDK. Хорошо, что котлин подтолкнул к таким исправлениям.
Arsen
да , сильно экономит на путешествиях по стеку, так ошибка сразу вылетит, а не когда-то потом в виде бомбы замедленного действия
Mike
4. Какие ещё могут быть подводные камни?
Совместимость по исходникам и совместимость бинарная, особенно библиотек. Протекание библиотек в публичный интерфейс.
⬤ vitaly
Мне кажется, именно «тупо просить проставлять». :)
тема-рематические отношения этого сообщения не распарсил :) тупо просить, потому что это тупо, или тупо просить, потому что иначе хреново?))
⬤ vitaly
Совместимость по исходникам и совместимость бинарная, особенно библиотек. Протекание библиотек в публичный интерфейс.
можно чуть-чуть подробнее про совместимости? Что имеется в виду? Ну, насколько я понимаю, в моих силах этого не допустить.
Mike
можно чуть-чуть подробнее про совместимости? Что имеется в виду? Ну, насколько я понимаю, в моих силах этого не допустить.
Совместимость по исходникам — чтобы код компилировался, когда обновляют библиотеку. Бинарная совместимость — чтобы код работал, когда подменяют бинарник библиотеки на обновлённый.
Mike
Например, Glide регулярно ломает бинарную совместимость, поэтому в библиотеках его использовать нельзя.
Стас 🍕🍕🍕
опаздываю но разве в ырыксе observeOn не рассчитан как раз на многократное применение?
Стас 🍕🍕🍕
а subscribeOn только на первый раз.
Arsen
@Harmonizr к недостаткам мокси я бы еще упомянул хранение состояния в виде "истории дифов", в противовес снепшотам( как в MVI/Redux архитектурах, еще по такому же принципу устроен Git)
Стас 🍕🍕🍕
всё так и есть
типа, тыкаешь обзервон и все что ниже в цепочке - там и выполняется
Стас 🍕🍕🍕
Я помню что как раз так и делала в какой-то ппц сложной цепочке
Arsen
ну даже если опустить все эти заморочки с памятью, то на сцену выходит куча стратегий, которые еще нужно уметь готовить, иначе можно получить совсем не то, что ожидалось. В целом, человеку проще оперировать снепшотами, нежели последовательностью операций. Взять то же тестирование.
Mike
Ну и да, если сделать снэпшоты, получится TEA/MVI :)
Arsen
можно почитать историю конкуренций систем контроля версий, и почему гит в итоге всех натянул)
Arsen
экраны конечно зачастую простые, и оба подхода работают хорошо, а проблемы появляются уже в ейдж кейсах
Denis
Оу. А почему это минус? Скорость применения патча?
В том, что размер истории дифов контролирутеся только стратегией. Может возникнуть ситуация, когда у тебя просто копится говно. Снепшот же всегда один
Denis
когда по дефолту все сохраняется
Denis
любой диф
Denis
но справедливости ради
Denis
там есть и нормальные стратегии
Anonymous
подскажите пожалуйста, в чем отличие между подписками и покупками в inapp в плане реализации? покупки делать умею, а как подписки сделать?
Andrey
Ребят, такой вопрос, не подскажете в какую сторону копать? Нужно горизонтальный прогрес бар трансформировать в круглый?
Vitaly
Для оплаты покупок в InApp Billing нужен License Key Подскажите, где его лучше хранить?
Vitaly
Насколько это секретная информация? Можно ли хранить прямо в коде?
Dmytro
Для оплаты покупок в InApp Billing нужен License Key Подскажите, где его лучше хранить?
он, вроде, нужен для валидации покупок локально ( бек бека ), если у тебя это на беке крутится, то он тебе не нужен
Vitaly
он, вроде, нужен для валидации покупок локально ( бек бека ), если у тебя это на беке крутится, то он тебе не нужен
То есть я могу хранить этот ключ открыто, в виде константы, например, верно?
Anonymous
Абсолютно аналогично Можешь уточнить вопрос Там меняется всего один ключ просто
т.е. просто айди поменять и в консоли в разделе подписки их прописать?
Anonymous
Dmytro
То есть я могу хранить этот ключ открыто, в виде константы, например, верно?
тут не подскажу) всегда можно собрать апк, декомпильнуть апку и глянь, нащел ли ты ключ
Andrei
Подскажите как правильно пожалуйста , стоит ли во ViewModel передавать ссылку на CruidRepo что бы через него инициализировать его и записывать в базу данные изменённой модели ?
Alexander
Привет , после загрузки изображения нужно сместить фокус , изображение растягивает layout , получается что фото на layout добавляется после смещение фокуса ,нужно наоборот Picasso.with(context).load(it).resize(182,192).into(imageview_request_addPhotoAgreement) invisibleView.requestFocus(FOCUS_DOWN) подскажите)
Mike
тут не подскажу) всегда можно собрать апк, декомпильнуть апку и глянь, нащел ли ты ключ
если он там в принципе в каком-то виде есть, то пытаться его скрыть — тупиковый путь.
Turalllb
Не знаете, а как в FlexboxLayout, когда элементы расположены сеткой, понять, что справа в первой строке больше нет вьюх?
Кирилл
Кто-нибудь пробовал делать вращение вокруг своей оси для вектора через objectAnimator в xml?
Alexander
ниче не понятно, но фокус на невидимые элементы невозможно поставить, система не даст добро
фокус на view height 0dp, у меня получается что сначала отрабатывает requestfocus , потом вставляется изображение - почему так хз
Сергій
Всем привет =) В андроид разработке не разбираюсь. Занимаюсь микроконтроллерами, одноплатниками. У меня есть идея/задача: к android (4.4+) устройству подключется внешний экран (через usb, wifi, bluetooth). И что бы на этом экране запускался launcher или выбранное приложение. Т.е. выполняется приложение на андроид устройстве, а отображается на внешнем экране. Основной экран андроид устройства при этом работает отдельно, не задействуется или заблокирован. Возможно ли реализовать такое? Какие технологии или библиотеки могут мне помочь в реализации? Читал вот это: https://source.android.com/devices/graphics/layers-displays Видел вот такие примеры: https://www.youtube.com/watch?v=kNaExTJ49TM https://boundarydevices.com/android-lollipop-dual-display-imx6/ По экранам вроде бы +/- понятно, но как запускать приложения "на виртуальный экран" - не до конца понимаю. Что можно почитать? Заранее благодарю за любые подсказки.
Turalllb
фокус на view height 0dp, у меня получается что сначала отрабатывает requestfocus , потом вставляется изображение - почему так хз
ну наверно потому, что фото грузится паралельно, а UI поток ставит фокус на то что сейчас есть.
Turalllb
если в пикасо найти какой нибудь колбек по окончаю загрузки, то можно там ставить фокус
Ivan
Коллеги, добрый день. Прикручиваю FireBase Google Sign-In На методе GoogleSignIn.getSignedInAccountFromIntent падает с Google sign in failed com.google.android.gms.common.api.ApiException: 8: at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(com.google.android.gms:play-services-base@@17.1.0:4) at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(com.google.android.gms:play-services-auth@@18.0.0:9) at com.misisdevteam.routy.repository.FirebaseAuthRepository.signInWithGoogleAccount(FirebaseAuthRepository.kt:51) at com.misisdevteam.routy.viewModels.LoginViewModel$loginWithGoogle$1$1.invokeSuspend(LoginViewModel.kt:37) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665) Не подскажете, в чем может быть проблема? P.S: Я гуглил, но не смог найти необходимой информации по данной ошибки
⬤ vitaly
Коллеги, добрый день. Прикручиваю FireBase Google Sign-In На методе GoogleSignIn.getSignedInAccountFromIntent падает с Google sign in failed com.google.android.gms.common.api.ApiException: 8: at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(com.google.android.gms:play-services-base@@17.1.0:4) at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(com.google.android.gms:play-services-auth@@18.0.0:9) at com.misisdevteam.routy.repository.FirebaseAuthRepository.signInWithGoogleAccount(FirebaseAuthRepository.kt:51) at com.misisdevteam.routy.viewModels.LoginViewModel$loginWithGoogle$1$1.invokeSuspend(LoginViewModel.kt:37) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665) Не подскажете, в чем может быть проблема? P.S: Я гуглил, но не смог найти необходимой информации по данной ошибки
https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes
Ivan
https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes
Это я видел Там написано: An internal error occurred. Retrying should resolve the problem. Но retrying не решает проблемы)
⬤ vitaly
Это я видел Там написано: An internal error occurred. Retrying should resolve the problem. Но retrying не решает проблемы)
🤷‍♂️ гугл не любят многословность, когда речь касается их тупорылых ошибок
Ivan
🤷‍♂️ гугл не любят многословность, когда речь касается их тупорылых ошибок
Согласен на все 100, поэтому и пришел сюда, вдруг кто здесь сталкивался))