Moxy - View, Presenter, Обзор [RU, Android] / Мобильный разработчик

Поделиться
HTML-код
  • Опубликовано: 23 ноя 2024

Комментарии • 120

  • @ЕвгенийТюрин-с6к
    @ЕвгенийТюрин-с6к 2 года назад +4

    Спасибо за видео пишу из 2022 года и это до сих пор актуально и востребовано на проектах.

  • @oleksandrhorokhov7387
    @oleksandrhorokhov7387 6 лет назад +9

    С удовольствием смотрю все видео, редкий случай когда просмотрев видео-урок без каких-то проблем начинаешь применять у себя в проекте успешно)) Для меня, как для начинающего - это очень классно!!)) Спасибо огромное!!

    • @MobileDeveloper
      @MobileDeveloper  6 лет назад +2

      Александр Смаилов спасибо огромное, очень приятно читать такие комментарии ) будет ещё очень много видео )

  • @КахарманБалтабаев-б2о

    Специально выучил Котлин, что смотреть ваши уроки. И ни капли не сожалею!

  • @mariyazharenova4506
    @mariyazharenova4506 Год назад

    Спасибо большое за подробное видео! Очень помогло)))

  • @ИванИванов-в4н9п
    @ИванИванов-в4н9п 2 года назад +1

    Классный урок, Алексей 👍

  • @ki11qwerty47
    @ki11qwerty47 4 года назад +2

    всем привет! во первых - большое спасибо автору за труд! очень нравится подача материала) а во вторых зашел внести свои пять копеек, если кто то сидит и пытается завести Moxy с поддержкой androidX для создания MvpAppCompatActivity иТД. Используйте свежую официальную версию - там есть поддержка androidx без необходимости сторонних форков. Смотрите свежую версию тут: github.com/moxy-community/Moxy -___- убил 1.5дня

    • @MobileDeveloper
      @MobileDeveloper  4 года назад

      Спасибо, там вроде в комментах писали об этом я даже один закрепил

  • @lRedCreepl
    @lRedCreepl 5 лет назад +1

    Большое спасибо за такой урок! Наконец начинаю нормально разбираться в архитектурах

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Спасибо! Рад, что понравилось )

  • @TheKrushik
    @TheKrushik 5 лет назад +12

    Хотелось бы видео про mvvm, livedata, repository(room+retrofit) желательно

  • @anatoliifrolov6959
    @anatoliifrolov6959 4 года назад +2

    Спасибо за видео! Все по полочкам разложено и понятно!!!

  • @Andrey-pu1lv
    @Andrey-pu1lv 5 лет назад +1

    Сегодня только наткнулся на канал) Про Android надо все посмотреть, очень круто)

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Буду благодарен если порекомендуете друзьям )

  • @TheVincet1998
    @TheVincet1998 3 года назад

    Спасибо за видео! все очень понятно и доступно

  • @mycanalcool
    @mycanalcool 5 лет назад

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

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Спасибо вам ) это лучшая поддержка

  • @ЕгорМатвеев-ц7ф
    @ЕгорМатвеев-ц7ф 4 года назад

    Лучший канал по андроид разработке)) затронуты самые важные темы и истолкованы максимально доступно, я кайфую) особенно нравится манера автора доносить истины о мобильной разработке метафоричным, образным языком (корабли, маги из ночного дозора, святая корова, ну вы поняли)! Спасибо!

    • @MobileDeveloper
      @MobileDeveloper  4 года назад

      Спасибо большое) это очень приятно ))

  • @alexandernifanin7366
    @alexandernifanin7366 6 лет назад

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

    • @MobileDeveloper
      @MobileDeveloper  6 лет назад +1

      Спасибо большое :)

    • @alexandernifanin7366
      @alexandernifanin7366 6 лет назад

      Забыл спросить. Как сохраняются данные при повороте экрана? Надо ли их класть в saveInstanceState/arguments? Что происходит с коллбеками? Допустим, есть фрагмент, из которого вызван диалоговый фрагмент с коллбеком обратно, а затем происходит поворот экрана. Как сделать, чтобы коллбек восстановился (поскольку диалоговое окно будет отображено)?

    • @MobileDeveloper
      @MobileDeveloper  6 лет назад +1

      Здесь сложный момент. Переворот экрана хендлится Мокси автоматически, потому что презентер переживает этот поворот. Соответственно в повернувшемся стейте восстановятся все команды из очереди в соответствие со стратегией. А насчет callback, почему бы не использовать parentFragment? Если вы вызываете диалоговый фрагмент из фрагмент, то внутри него будет ссылка на parentFragment а дальше вы можете действовать а-ля (parentFragment as? CallbackInterface)?.someFunction()

  • @farkhodkh2760
    @farkhodkh2760 4 года назад +4

    Очень редко бывают видео презентации на русском языке строго по сущности темы, т.е. без "воды". Эта одна из таких. Огромное спасибо автору!

  • @alextokarev7750
    @alextokarev7750 3 года назад

    Благодарю за труд, очень хорошее видео)

  • @ianagamurar
    @ianagamurar 5 лет назад

    Давно искала подобное видео, спасибо большое

  • @andrew3937
    @andrew3937 3 года назад

    спасибо за такой топовый видос! это огонь

  • @anatolychekulov99
    @anatolychekulov99 5 лет назад

    Спасибо большое!) У вас на канале много полезных видео. Возможно, есть смысл записать видео про библиотеку cicerone.

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Спасибо ) такое есть в планах, да

  • @sergeyjoke
    @sergeyjoke Год назад

    Спасибо.

  • @alexkoty5877
    @alexkoty5877 Год назад

    Скажите пожалуйста как Moxy переживает смену конфигурации? Как это сделано?

  • @mikluho-maclay
    @mikluho-maclay 6 лет назад +1

    Отличный урок, почти все понятно стало, но есть несколько вопросов:
    1. Как вид стратегии StateStartegyType во View определяет, какие функции вызвать повторно, какие пропускать? Я ведь просто указываю список нужных мне команд и не описываю их функциональность
    2. Что находится в Model? Все говорят там находится вся "бизнес логика", а что это такое?) можно какой-нибудь пример как это выглядит
    3. и еще вопрос не по теме: всегда ли нужно прописывать findViewById для поиска элемента и дальнейшей работы с ним (с точки зрения правильности разработки)? просто в котлине можно просто прописывать в коде сразу id ресурса, например, my_xml_button.setOnClickListener{...} без предварительного findViewById. Или так делать неграмотно?
    А также есть предложение по следующим видео:
    - Как динамически получать информацию с какого-нибудь сайта, например, как получать новостную ленту с сайта pikabu.ru, заливать данные в RecyclerView (или во ViewPager еще интересней) и выводить на экране в виде ленты с постами(текст, картинки). С использованием Moxy конечно, чтобы попрактиковаться
    - Dagger2. Что это такое, зачем это нужно и как с этим работать
    Спасибо!

    • @MobileDeveloper
      @MobileDeveloper  6 лет назад +1

      Pavel Shikleyev 1) presenter сохраняет стэк команд с определенной стратегией. После подключения новой вью он просто по порядку достаёт из стека эти команды.
      Стратегия определяет как именно будут складываться команды в стек
      2) я буду делать ролик как я начинаю работу над проектом. Я там упомяну что это модель
      3) нет не всегда. Это наследие java android. В Котлин появилась синтетика (то, что вы указали) и лучше использовать ее, но главное не забыть про ограничение что все id должны быть уникальными.
      Насчёт видео сниму да видео может не на примере Пикабу но сниму )

    • @alekseyreyngardt3732
      @alekseyreyngardt3732 5 лет назад

      @@MobileDeveloper вы уверены что команды складываются в стек а не в очередь?

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад +1

      @@alekseyreyngardt3732 спасибо! Вы абсолютно правы команды складываются в очередь, а не стек.

  • @AndrewA239
    @AndrewA239 2 года назад

    Алексей, спасибо огромное. Очень ценное видео. Начал внедрять MVP и Moxy. Не пойму что делать с настройками приложения? У меня некоторые параметры подтягиваются из SharedPreferencies, его можно взять из контекста Activity. Но вы не рекомендуете пробрасывать Context в презентер. Как быть?

    • @MobileDeveloper
      @MobileDeveloper  2 года назад +1

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

    • @AndrewA239
      @AndrewA239 2 года назад

      @@MobileDeveloper Спасибо за ответ.

  • @ВадимА-й8ф
    @ВадимА-й8ф 5 лет назад

    спасибо за труд!

  • @radiosh66
    @radiosh66 5 лет назад

    Добрый день, Алексей! Большое спасибо за ваш труд. По возможности, расскажите, пожалуйста, о плюсах и минусах использования сопрограмм в котлине, особенно в связке с kotlin-coroutines-retrofit. На вид конструкции с .await() выглядят значительно удобнее реактивных аналогов.

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Спасибо! ) Вы имеете ввиду корутины? Да я сейчас сам присматриваюсь как их в проект запихать )

    • @radiosh66
      @radiosh66 5 лет назад

      @@MobileDeveloper Да да, они самые. Мы тоже сейчас начинаем их использовать и после rx это кажется прорывом, особенно если есть понимание работы async/await из C#. Неужели с ними действительно все так гладко? Кстати, пользуясь случаем, хочу предложить вам обмен опытом (за плечами порядка 5-ти лет работы с .NET), возможно, вам это интересно?

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Ну Rx мне удобен пока что и в продакшн я корутины еще какое-то время пускать не буду. Люди пишут, что работает хорошо, но пока нет какой-то концепции как красиво это завязать с другими библиотеками, чтобы это все красиво выглядело (например для ретрофита есть rxjavacallfactory и gsonconverterfactory они очень хорошо вместе работают). Насчет C# спасибо за предложение, но я пока не понимаю как мы можем это организовать. Напишите, мне пожалуйста в вк мы обсудим как мы можем обменяться опытом. Буду очень благодарен :)

  • @alekseichemyakin2156
    @alekseichemyakin2156 4 года назад

    А не лучше ли создание презентера закинуть в даггер( раз вы его уже используете) и инжектить как остальные зависимостия?

    • @MobileDeveloper
      @MobileDeveloper  4 года назад

      Тут речь про мокси, у него свои аннотации

  • @ЕвгенийОсипов-и1ч
    @ЕвгенийОсипов-и1ч 5 лет назад

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

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Ну вы же определённый тип фрагментов подгружаете для них будут свои классы фрагментов. В них все как обычно презентер вью и вперёд )

    • @ЕвгенийОсипов-и1ч
      @ЕвгенийОсипов-и1ч 5 лет назад

      @@MobileDeveloper но тогда попытавшись вызвать в презентере метод из view, получаю nullpoint.

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      @@ЕвгенийОсипов-и1ч если речь идет о Moxy, то используя InjectViewState и InjectPresenter вы никогда не получите null ) Потому что viewstate это по сути массив из реализаций вьюх. В худшем случае он просто пустой)

  • @namesecondname7863
    @namesecondname7863 5 лет назад

    Заметил у Вас в проекте пакет services, используя Moxy, где целесообразнее их вызывать и обрабатывать результат?

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад +1

      Ну сервисы стартуют в Активити там же я получаю результат бродкаст рисивера и пересылаю это в презентер, а он уже раскидывает

  • @МаксимАлмазХ
    @МаксимАлмазХ 3 года назад

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

    • @MobileDeveloper
      @MobileDeveloper  3 года назад

      Нет, почему вы так решили? Репозиторий ещё один слой абстракции, а запросы лучше делать там, где удобно вашему проекту

    • @МаксимАлмазХ
      @МаксимАлмазХ 3 года назад

      @@MobileDeveloper я просто для себя не могу определиться где же лучше всего делать запросы. Я вообще стал для api делать отдельную папку с разными версиями ApiClienta которые меняются в зависимости от BaseUrl, делаю папку с ApiService в которых лежат интерфейсы в которых методы для запросов ретрофита (ApiClientov) , и делаю папку для имплементации этих интерфейсов в зависимости от запросов и там реализую эти запросы, потом возвращаю в качестве результата модель запроса и работаю уже с ней. И как бы я не совсем понял, нужно ли писать запросы только в презентерах или где то в недрах репозиториев, где тот тонкий момент стандартизации, я хочу понять правильную архитектуру для работы с запросами. З.ы. та модель с которой я работаю мне удобна, но я готов ее пересмотреть на какую то более удобную архитектуру.

  • @markkhakimulin592
    @markkhakimulin592 5 лет назад

    Сними обзор как правильно вызывать сервисы и откуда.Если их дергать из активити то при повороте они умрут тоже вместе с активити.И вообще откуда лучше их вызывать?!

  • @morytsmith6693
    @morytsmith6693 2 года назад +1

    Где можно взять исходный код из видео?

    • @MobileDeveloper
      @MobileDeveloper  2 года назад

      К сожалению, уже нигде. Во многом то, что в этом видео сильно устарело

  • @nailapps7501
    @nailapps7501 6 лет назад +2

    Расскажи про RxJava.

  • @ruslansharipov8958
    @ruslansharipov8958 5 лет назад

    Периодически появляется проблема с внедрением презентера. В разных проектах лечилась по-разному, где-то обновлением версии котлина, где-то дополнительными параметрами для kapt.
    А так да, библиотека супер крутая.

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад +1

      Да у меня в логах бывают падения даже, но не могу у себя воспроизвести

    • @ФеликсДзержинский-л9б
      @ФеликсДзержинский-л9б 5 лет назад

      Здравствуйте! Вы можете платно помочь разобраться с Moxy? Создал новый проект. Поставил мокси.. при билде выдает ошибку Invoke-customs are only supported starting with Android O (--min-api 26)
      Я учусь разрабатывать на андроид. Постоянно нужна платная помощь! Пожалуйста если Вы можете помогать то добавьте мой скайп lihushop

  • @andrewscott2966
    @andrewscott2966 5 лет назад

    Алексей, а разве правильно, что у вас View знает о репозитории? Потому что вы получаете в конструкторе презентера репозиторий? Правильней было бы сделать инит в презентере и обьявить репозиторий? Или я что-то не понимаю в Клин подходе)

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Да вы все правильно говорите я теперь так и делаю. Опять же не до всех правильных мыслей доходишь сразу ))

    • @andrewscott2966
      @andrewscott2966 5 лет назад

      @@MobileDeveloper Спасибо за ответ, очень полезное видео) У меня уже очередь стоит из ваших роликов) Осталось только про Clean вам записать, а если в all in связке с Dagger, Moxy, Rx - было бы великолепно) Просто я смотрю у вас везде Domain есть и вроде бы вы придерживаетесь Клина, но не говорите про это)

  • @ВладиславСоболь-ш6и

    Насколько MVP + Moxy сейчас вообще актуально? Сейчас ведь гугл активно продвигает именно MVVM, есть jetpack, да и чего стоит только одна viewmodel. Несмотря на это, многие компании требуют именно MVP.

    • @MobileDeveloper
      @MobileDeveloper  4 года назад

      Ну вы сами ответили на свой вопрос ) до сих пор очень многие компании пишут на MVP) поэтому да, актуально )

  • @IsakDzhumaliev
    @IsakDzhumaliev 4 года назад

    Здравствуйте, хотелось бы сказать что вышла новая версия, можете написать в описании?
    github.com/moxy-community/Moxy - здесь актуальная версия Moxy

    • @MobileDeveloper
      @MobileDeveloper  4 года назад

      Постараюсь не забыть добавить

  • @preenxus3425
    @preenxus3425 5 лет назад

    А как инициализируется CardsRepository и AuthRepository? Я что-то в AddCardActivity не заметил инициализации, у них разве что есть аннотация @Inject. Это даггер?

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Вы могли бы скинуть таймметку?)

    • @preenxus3425
      @preenxus3425 5 лет назад

      @@MobileDeveloper например, вот здесь видно эту часть экрана 45:30

    • @preenxus3425
      @preenxus3425 5 лет назад

      ​@@MobileDeveloper @Inject lateinit var cardsRepository: CardsRepository
      вот так у вас написано.

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      А да это аннотации даггера

  • @preenxus3425
    @preenxus3425 5 лет назад

    12:18 "model - это та штука, которой вы обмениваетесь между view и presenter'ом"
    То есть model это сам факт обменивания или что? никак не могу понять что такое model?

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

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

  • @preenxus3425
    @preenxus3425 5 лет назад

    А на исходник можно посмотреть?

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Исходник чего?)

    • @preenxus3425
      @preenxus3425 5 лет назад

      @@MobileDeveloper ну этого проекта, что в видео.

    • @preenxus3425
      @preenxus3425 5 лет назад

      @@MobileDeveloper хотелось бы поразбираться в коде, самому понавигироваться, посмотреть

    • @preenxus3425
      @preenxus3425 5 лет назад

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

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

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

  • @preenxus3425
    @preenxus3425 5 лет назад

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

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      В Лайве не получается разобрать сложный материал. Ну и плюс это один из первых блинов того формата был )

    • @preenxus3425
      @preenxus3425 5 лет назад +2

      @@MobileDeveloper с нового проекта тогда как по мне, а то тут открываешь видео и сразу столько всего на тебя навалилось

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Скоро будет анонс скажем так нового формата взаимодействия )

    • @preenxus3425
      @preenxus3425 5 лет назад

      @@MobileDeveloper будем ждать))

    • @preenxus3425
      @preenxus3425 5 лет назад

      @@MobileDeveloper почитал немного статей, видео посмотрел про MVP / Moxy, вернулся, пересмотрел и стало понятнее ваше видео)

  • @fromsi137
    @fromsi137 5 лет назад +2

    Канал, который уберет канал startandroid?)

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад +1

      Ну если вы репостните ))) Шутка ) такой цели не было. Цель - попытаться доступно изложить весьма разрозненный материал. Плюс на русском языкк

    • @fromsi137
      @fromsi137 5 лет назад

      @@MobileDeveloper у Вас это хорошо получается, думаю, что стоит сделать плейлист для начинающих(где Котлин).
      Просто предложил идею, т.к. вы хорошо преподносите материал.

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад +2

      Спасибо большое ) Есть идея сделать для начинающих, но всего я просто не успеваю

    • @fromsi137
      @fromsi137 5 лет назад

      @@MobileDeveloper главное начать :)))))

  • @ФеликсДзержинский-л9б

    Здравствуйте! Вы можете платно помочь разобраться с Moxy? Создал новый проект. Поставил мокси.. при билде выдает ошибку Invoke-customs are only supported starting with Android O (--min-api 26)
    Я учусь разрабатывать на андроид. Постоянно нужна платная помощь! Пожалуйста если Вы можете помогать то добавьте мой скайп lihushop

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Отписался в другом комментарии

    • @АлександрФ-э6б
      @АлександрФ-э6б 5 лет назад

      Тоже такая ошибка была, решается просто:
      В (stackoverflow.com/questions/49891730/invoke-customs-are-only-supported-starting-with-android-0-min-api-26) app/build.gradle добавить:
      android {
      compileOptions {
      sourceCompatibility JavaVersion.VERSION_1_8
      targetCompatibility JavaVersion.VERSION_1_8
      }
      }

    • @ФеликсДзержинский-л9б
      @ФеликсДзержинский-л9б 5 лет назад

      @@АлександрФ-э6б Спасибо Александр!

  • @hauskolkrabe9995
    @hauskolkrabe9995 5 лет назад

    Интересное видео.
    Спасибо за проделанную вами работу
    Возможно вы знаете решение этой проблемы?
    stackoverflow.com/questions/55539654/why-didnt-moxy-initialize-the-presenter-kotlin-android?noredirect=1#comment97782715_55539654

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Спасибо вам что смотрите )) Где то здесь писали уже нужно добавить Kotlin-kapt и добавить в Градл к библиотеке ее kapt))

    • @hauskolkrabe9995
      @hauskolkrabe9995 5 лет назад +1

      @@MobileDeveloper Спасибо. Все работает

    • @alexpodshivalov1010
      @alexpodshivalov1010 5 лет назад

      Добаить в код MainActivity mPresenter = HelloWorldPresenter

  • @Miro_Hernandes
    @Miro_Hernandes 5 лет назад

    хватит говорить спиннер!!!!

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      У вас аллергия на слово спиннер?)😂😂

    • @Miro_Hernandes
      @Miro_Hernandes 5 лет назад

      @@MobileDeveloper ну не совсем)) просто есть вьюха - "спиннер", а вы подразумеваете "прогресс бар" ( ну лоадер, на худой конец)

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

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

    • @Miro_Hernandes
      @Miro_Hernandes 5 лет назад

      @@MobileDeveloper А так, вы збс.... хорошая работа. Не заметил, есть ли у вас или нет... Но запилите видяшечку про repository. Это неотъемлимая часть MVP... но поскольку она как правило специфичная, то этот момент редко раскрывают полностью. У вас он подсовывается с DI... Расскажите об этом. Многим может быть непонятно... А то есть view, presenter.... но где же model?? Заранее спасибо. Вы делаете отличную работу!

    • @MobileDeveloper
      @MobileDeveloper  5 лет назад

      Спасибо большое вам ) про репозитории скоро будет в рамках архитектуры ) как раз сейчас делаю цикл )

  • @Symbi0x7
    @Symbi0x7 4 года назад

    Алексей, спасибо за видео. Заметил, что у тебя в AddCardActivity инжектятся репозитории, но насколько знаю представление не должно ничего знать о модели. По идее, эти репозитории должны инжектиться в презентере. Это так или есть какие-то исключения? Подскажи, пожалуйста, почему у тебя сделано именно так?

    • @MobileDeveloper
      @MobileDeveloper  4 года назад +1

      Все правильно вы говорите. Сейчас так не делаю. Тогда мне это не казалось чем-то страшным)

    • @Symbi0x7
      @Symbi0x7 4 года назад

      @@MobileDeveloper понял. В принципе, так и подумал. Еще раз спасибо за ваш труд ;)