Александр
Кул стори боб
Anonymous
Давайте все ему дизлайков поставим))
Данил
Ну это 2 разных запроса. Апи конечно как писал выше не ахти, но что есть. Вот и думаю как проще бы сделать....
Ну тогда вас остается только под каждый запрос свой отдельный Response делать
Данил
У нас именно так, в ответ на авторизацию прилетает token, который уже хранят
Данил
У него есть время жизни, по этому через какое - то время запрашивается новый
neikist
Ну отправили Login и пароль и все, зачем в приложении то их хранить,
Еще раз, есть кривые бекенды написанные в незапамятные времена которые никто менять не будет.
awawa
Ну отправили Login и пароль и все, зачем в приложении то их хранить,
Кривой интерфейс со стороны сервера. А если сервер не умеет в токены? Я на работе сейчас пишу прилу, у нас сервер пока что в токены не умеет. Вся авторизация через пароли. И каждый раз просить пользователя вводить пароль не хочется. Поэтому храню пароли в открытом виде (в EncryptedSharedPreferences), как лох🤷‍♂️
awawa
В общем всякое бывает
Данил
Ну тогда в таком случае, не хранить, либо галочку поставить, что не безопасно и хранить в shared preferences
Nick
Так смысл хэшировать если хранить нужно?)))
Именно) для авторизации на бекенде, не данные пользователя
awawa
У нас пока бек не научился в токены мы еще AES шифровали используя пин код как ключ. Понятно что подобрать его как делать нефиг, но все же чуть лучше чем в открытом виде.
Я юзаю сейчас шифрованные префы из androidx.security. Там тоже AES256GCM. Но что там за ключ - хз. Его как-то сама либа предоставляет. В любом случае у нас дырка больше не в хранении пароля, а в нешифрованном трафике) Так что пока оставляю как есть
neikist
У них там вроде 21 минимальный
Nick
Именно) для авторизации на бекенде, не данные пользователя
Так в чем хранить то? Голый хардкод плохой вариант
awawa
У нас слишком низкий min api чтобы androidx.security использовать.
23 минимальный. У нас 21 минимальный. На 5 дроиде приходится брать обычные префы. Но там вроде в новой альфе сделали совместимость с 21. Надо будет переписать
awawa
HTTPs не используете?
Ой, у нас голый UDP трафик вообще
Данил
У нас пока 17 апи
у нас 18, но я думаю до 21 повышу, так как новая Android Studio уже минимальную версию 5.0 поставила
awawa
У нас пока 17 апи
Я пробовал с 17, потом удалось убедить руководство в том, что нам ниже 5 андроида поддерживать не нужно :D
neikist
Так в чем хранить то? Голый хардкод плохой вариант
Security through obscurity. Те же префы что @awawa0_0 описывал, либо шифрование с ключем из пина с солью. Если прям нет возможности и правда на токены перейти
Roman
а в чём проблема, у телеграмма открытые исходники, посмотри как они реализовывали
Да, там все собрано не из xml, а на месте из кода, кучка анонимных наследников разных view, которые несут в себе бизнесс логику. У них даже fab сделан кастомно из frame layout из кода. Не очень информативно.
awawa
Обычные префы это грустно
Это да, но я программист - птица гордая. Пока меня начальство не пнёт повышать секурность, ничего не делаю. Ну и жду релиз стабильной версии 1.1.0 security. У них там 21 поддержка должна быть
Vadim
Привет такая история есть две строки для которых применяю стили span после этого создаю переменную где эти строки складываю с помощью SpannableStringBuilder, но увы стиль не применятеся. в чём может быть проблема? https://gist.github.com/mnewlive/07a712e01ec0d0c865d56cdf0615d039
Anonymous
{ "result": { "token": "", "refresh_token":"" }, "error": { "errorCode": "", "message": "", } } Как юзать Retrofit с RxJava2CallAdapterFactory, если в случае ошибки, у меня вызывется Exception? А я должен получить Response и вытащить оттуда errorBody... RxJava2CallAdapterFactory в таком случае не прокатит?
awawa
Но ведь потом пиздюлей дадут тебе
Да у нас пока про безопасность и речи не идёт. Я ж говорю - голый UDP трафик гоняем без шифрования. Оттуда пароль даже проще вытащить, наверное. Что уж там хранение. Но по совести, конечно, надо бы нормально сделать.
Anonymous
хотнл задать вопрос Griffits_Devid_Head_First._Programmirovanie_dlya_Android._2-e_izd норм книга для новичка?
Alexander
Ребят, подскажите, плиз, по такому вопросу. Firebase + Clean Architecture + Kotlin Есть три модуля: data, domain, presentation Зависимость: data <- domain <- presentation ——— Запросы Firebase делаются в модуле data. (Такие, как .addOnSuccessListener, .addListenerForSingleValueEvent со своим ovverride OnDataChange() и т.д.) Вопрос: каким образом передавать обратно в модуль domain гарантированный результат из этих методов? Ведь мы не знаем, когда придёт ответ с сервера и, кроме того, не имеем возможности юзать классы из domain, т.к. это ограничения clean-архитектуры.
Vadim
Ну так все правильно. Ты перегоняешь свои два спанабл стринг билдера к обычным строкам
ну да, мне же надо их после отобразить в textView суть в том что стили не применяются к ним, и даже если меняю цвет для какой то из строк то всё равно всё одним цветом.
Данил
Как отключить подчеркивание для textinputeditext в textinputlayout? Пробовал inputType в значении none и text
neikist
ну да, мне же надо их после отобразить в textView суть в том что стили не применяются к ним, и даже если меняю цвет для какой то из строк то всё равно всё одним цветом.
Сначала конкатенируй строки и в спаннабл закидывай, а потом к результату уже спаны применяй. String же никаких стилей не содержит. А ты именно в стринг свои билдеры превращаешь конкатенацией
Vadim
Сначала конкатенируй строки и в спаннабл закидывай, а потом к результату уже спаны применяй. String же никаких стилей не содержит. А ты именно в стринг свои билдеры превращаешь конкатенацией
понял, только вопрос, спаны же я хочу применить к отдельным строкам в данном случае две и то есть получется я создаю сначало spannable переменную в неё складываю строки и после как я могу применить span к конкретной строке?
Vadim
Эээ... Ну так ты же в setSpan указываешь диапазон. В твоем же коде есть.
ну я диапазон делал всегда от 0 до длины строки, а так как тут конкатенация двух строк то по идее и диапазон изменится?
Vadim
Эээ... Ну так ты же в setSpan указываешь диапазон. В твоем же коде есть.
переделал на что то подобное, но почему то он закаршивает например не всю строку хотя беру всю его длину
SE
Привет всем Нужен совет. У меня архитектура MVVM. У меня есть страница, где я должен показать данные с cети. Кроме этого я кэширую данные результата сервера. Валидность кэша 1 час. Всё работа касательно запросов в сеть и кэширование результатов ответа сервера происходит в Repository. Мне нужно сделать так, чтобы если запрос в сеть вернёт ошибку сервера, то в течение 1 часа показывать данные из кэша. Пока у меня есть два решение проблемы, они похожие между собой, разница только в том, что в одном месте проверку я делаю в Repository, а другом месте во ViewModel. Первый вариант, если произойдёт ошибка сервера, то в Repository в onErrorResumeNext узнать тип ошибки, если тип ошибки будет серверная ошибка, то зафиксировать время когда произошла ошибка и исходя из этого последующий час при запросе данных отправлять данные из кэша. Второй вариант, если произойдёт ошибка сервера, то во ViewModel при обработки ответа с Repository в onError узнать тип ошибки, если тип ошибки будет серверная ошибка, то зафиксировать время когда произошла ошибка и исходя из этого последующий час при запросе данных отправлять данные из кэша. Какой вариант лучше, делать проверки в Repository или во ViewModel? Или есть ли какие-то лучше решение данной задачи? Это как я получаю данные с Repository https://gist.github.com/githubgist123/7e027675bb4db07fef606e23f39f8a96
awawa
Привет всем Нужен совет. У меня архитектура MVVM. У меня есть страница, где я должен показать данные с cети. Кроме этого я кэширую данные результата сервера. Валидность кэша 1 час. Всё работа касательно запросов в сеть и кэширование результатов ответа сервера происходит в Repository. Мне нужно сделать так, чтобы если запрос в сеть вернёт ошибку сервера, то в течение 1 часа показывать данные из кэша. Пока у меня есть два решение проблемы, они похожие между собой, разница только в том, что в одном месте проверку я делаю в Repository, а другом месте во ViewModel. Первый вариант, если произойдёт ошибка сервера, то в Repository в onErrorResumeNext узнать тип ошибки, если тип ошибки будет серверная ошибка, то зафиксировать время когда произошла ошибка и исходя из этого последующий час при запросе данных отправлять данные из кэша. Второй вариант, если произойдёт ошибка сервера, то во ViewModel при обработки ответа с Repository в onError узнать тип ошибки, если тип ошибки будет серверная ошибка, то зафиксировать время когда произошла ошибка и исходя из этого последующий час при запросе данных отправлять данные из кэша. Какой вариант лучше, делать проверки в Repository или во ViewModel? Или есть ли какие-то лучше решение данной задачи? Это как я получаю данные с Repository https://gist.github.com/githubgist123/7e027675bb4db07fef606e23f39f8a96
Я не эксперт в этом. Но, имхо, логичнее проверку надо делать в репозитории. Типа вью модель не должна знать откуда берутся данные, ей пофигу. Она данные попросила - репозиторий выдал. А где эти данные брать пусть сам репозиторий и решает
Павел
Ребят можно ли как то программно задать все пермишены для нотификаций на ксяоми?
awawa
Получается если я добавлю проверку типа ошибки в Repository, то Repository будет решать отправлять ошибку во ViewModel или нет. Это будет норм?
Я вижу это так: вью модель просит данные у репозитория. Репозиторий посмотрел в сеть - пришла ошибка, значит следующий час отдаёт данные из кеша, если пришли данные - отдал данные из сети. Если приходит какая-то другая ошибка и репозиторию нечего отдавать - бросает во вью модель ошибку и пусть уже она разбрается что с этим делать. Хотя последнее мне не очень-то нравится
Данил
Получается если я добавлю проверку типа ошибки в Repository, то Repository будет решать отправлять ошибку во ViewModel или нет. Это будет норм?
У меня сейчас по всему приложению идет обертка Result с 4 параметрами (Success, Error, FatalError, InternetError) на уровне RemoteRepository, разбирается response и результат упаковывается в Result. А на всех остальных кровнях проверяется, этот Result, к каком type он относится
awawa
Ребят можно ли как то программно задать все пермишены для нотификаций на ксяоми?
У телеги есть вот такая штука для вызова окна пермишинов на сяоми, может поможет. https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/messenger/XiaomiUtilities.java
awawa
Мне помогло для настройки показа прилки поверх других окон
Alexsandr
Что то не увеличиваеться webView Хотя использую webView.getSettings().setSupportZoom(true); webView.getSettings().setDisplayZoomControls(true);
Anonymous
В чем разница между onRestoreInstanceState и onCreate Bundle? когда они вызываются
awawa
В чем разница между onRestoreInstanceState и onCreate Bundle? когда они вызываются
Насколько я знаю, разницы между ними нет никакой. И восстанавливать данные можно в onCreate(). Просто эти два метода вызываются в разное время. Иногда нужно восстановить данные уже после onStart(), тогда используют onRestoreInstanceState()
Проксимов
@serqoldstar не спамь людям в личку
Ivan
Ребят, привет! Такой вопрос, в приложении есть биллинг, если ставить со студии релизную, при этом подписывать таким же ключом, как потом на маркете, то пишет, что биллинг не поддерживается в приложении. Если залить на маркет, то все нормально. проблема в том, что не могу потестить подписки. В чем мб проблема?
Данил
Я так с Referall Library мучался, не знал какой url придет. А чтобы придет нужно сначала в Pm залить. Поэтому пришлось внедрять в 2 обновления
Ivan
Надо обязательно лить в гп вроде как. Сам мучаюсь с этим, горит уже.
Дело в том, что у меня есть свой аккаунт и там я могу установить релизную версию и все нормально, тестовые подписки работают, а это другой акк
Ivan
как бы под нужным аккаунтом тоже зашел, к которому консоль привязана
Ivan
ключ точно релизный и гугл не переподписывает?
ну я прописал в конфиге путь и пароли для кей стора
Ivan
по идее должен ими подписывать
Nikolai
хотя у меня платежи ходят даже с дебаг сертификатом
Oleg
Версия такая же
Google play сервисам необходимо понимать что версия приложения установлена c Google Play. Для этого необходимо подписать релизным ключом и установить версию кода уже опубликованного приложения, не повышая версию кода. Ну еще можно залить в alpha или beta для тестирования покупок
Ivan
в бете залита
Oleg
в бете залита
значит что-то сделано неправильно. Я так тестирую уже много лет.
Egor
Ребят. Пытаюсь записать файл в папку загрузки. Проверяю путь файла, он такой /Download/TikTokDownloads/tiktok_1593175124964.mp4. При попытке вызвать destFile.createNewFile(), мне кидает ошибку No such file or directory. В чем подвох? Путь же верный вроде.
awawa
Какой андроид? На 10 же нельзя напрямую лезть в ФС
Egor
Какой андроид? На 10 же нельзя напрямую лезть в ФС
Тестирую на 10. Но эта фигня у меня везде. На 9 тоже.
Egor
Я уже везде mkdirs прописал для всех файлов
The The
Какой андроид? На 10 же нельзя напрямую лезть в ФС
можно как бы, если компилировать с поддержкой легаси
IG
Ребя, всем доброго дня. Я получаю данные с одного сервера и в случае если они не получены обрабатываю исключение и заполняю всё нулевыми значениями. Теперь, если данные не получены, нужно попытаться их получить с другого сервера, и если нет, то уже тогда заполнить нулями. Подскажите, как это сделать, используя try и catch