Мой типичный рабочий день

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

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

Краш после обновления андроид студио до версии 3.6

В проекте я юзаю Realm для бд (я храню треки которые у вас были в текущем плейлисте и еще много всякого). Оказывается нужно было или даунгрейдить андроид студио до 3.5 или же апнуть реалм плагин до актуальной версии (с 5 до 6). И все запустилось.

Дальше по всем канонам — идем в трекер тасок, берем первую и начинаем делать. Отводим от девелоп новую ветку и начинаем писать код. Давайте больше деталей насчет таски.

Я разрабатываю MixUpload (ссылка на гугл плей маркет) с августа 2019 года и тогда, при первой итерации я сделал вкладку топ 100 максимально упрощенную.

Экран топ 100 треков в версиях <= 2.6.1

Топ 100 треков по миру за текущий день — т.е. всего 1 список треков. Никакой возможности модификации. Сегодня моей таской было — добавить функционала. Дело в том, что можно просмотреть топ 100 не только треков но и миксов и не только за текущую дату, но и за любую другую. Также есть возможность выбрать страну по которой выстраивается топ 100.

Кароче, сегодня я добавил 4 кнопки (звучит очень просто, но это не совсем так и позже я обьясню почему).

В следующем релизе экран топ 100 будет выглядеть так

Экран топ 100 в версии приложения > 2.6.1

Кто-то может подумать, что у меня здесь табы для переключения треков и миксов, но нет. Я сделал кастом вью (не спрашивайте почему, так надо). У него 2 состояния — выбран и невыбран.

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

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

Итак, репозиторий в принципе понятен — сохраняем в кеш (prefmanager) настройки юзера (мы же не хотим каждый раз на старте приложения видеть дефолтные настройки, т.е. если вы выбрали топ миксов по России за 23 февраля, то каждый раз открывая приложение вы будете видеть свой список). После чего дергаем cloudDataStore чтобы получить треки, мапим к юай моделям и отдаем интерактору в виде успеха.

Но я хотел поговорить об особенностях этого приложения. Суть в том, что необходимо различать список треков в юай и список треков в плеере. Ведь список треков в плеере я кладу в реалм и храню постоянно. Значит один список топ 100 должен отличаться от другого. Для этих целей я использую такое понятие как playlistID, который в данном случае будет таким.

"${if (tracksChosen) TOP_TRACKS else TOP_MIXES}_${chosenDate}_$chosenCountry"

В чем суть — например вы загрузили топ 100 миксов по США за сегодня и начали их слушать. Значит тогда, когда вы скролите список в юай — новые треки также должны добавляться и в текущий плейлист. Для этого у меня в репозиториях написан метод syncDataWithPlayer() который сравнивает плейлист айди плеера и того, что в юай. И если они совпадают — треки летят в плеер.

И вот вам еще один секрет приложения — на старте приложения необходимо инициализировать репозиторий для текущего плейлиста — но как мы все понимаем все вкладки разные — топ 100, жанры, лента и т.д. Значит нам нужна фабрика репозиториев. Так и есть. Я сохраняю тип репозитория. На старте приложения инициализирую репозиторий плеера и беру из кеша все нужные данные для этого конкретного репозитория. Т.е. для топ 100 это будут данные по выбранной стране, дате и типу треков. После чего также нужно взять сохраненные треки из бд. Как мы знаем, треков может быть реально много (например в ленте их может быть овер9000) и поэтому апи отдает не сразу все, а по частям. По условно 20 штук за раз. Значит надо сохранять также некое число/количество загруженных порций чтобы догружать следующие треки при скроле в юай. Хотя так же юзер может просто нажимать следующий трек до тех пор пока не дойдет до края списка треков и не нужно будет подгружать еще.

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

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

Но знаете что самое классное в моем типичном рабочем дне — когда ты берешь таску и рассчитываешь закончить за 3 часа и в момент когда отдаешь сборку на тестирование смотришь на часы — ровно так как предполагал — прошло 3 часа.

Если у вас будут вопросы — можете задать их мне в телеграм — @johnnysc

Запись опубликована в рубрике Программирование Java. Добавьте в закладки постоянную ссылку.