Предыстория
Сейчас я учусь в 8 классе в городе Кирове. Где-то с октября (сейчас апрель) я изучаю разработку мобильных приложения для андроид. И как это бывает у каждого - я столкнулся с проблемой: а какое приложение мне сделать? И мне крайне повезло. Я не стал делать какой-нибудь фейковый магазин, калькулятор, блокнот, туду лист и всякую подобную заезженную тему.
Прототип дневника
Всё началось случайно. Декабрь. Мне уже приходилось работать с базой данных firebase, но тогда я наткнулся на то, как использовать firebase красиво (чистая архитектура, ооп и всякое такое). Это обучение меня вдохновило и я захотел сделать какое-нибудь приложения с использованием firebase. Мне пришло в голову сделать клон моего электронного дневника. И ниже я приведу скрины как он выглядел. Я даже добавил функционал для учителя, чтобы попрактиковаться (код конечно там лучше не смотреть. Вообще, смотря на свой код даже месяц назад, я понимаю как сильно вырос).
И так я забросил этот проект на почти месяц.
Апи официального дневника
На зимних каникулах я сделал музыкальный плеер, и вот опять эта проблема: я не знаю какое приложение делать следующим. И в одну вечернюю прогулку меня осенило. Есть всякие неофициальные клиенты приложений, например SOVA V RE, которым я пользуюсь вместо ВК. И я подумал, почему бы не попробовать сделать мой дневник не просто местом, где я одиноко накручиваю себе оценки, которые ни на что не влияют, а полноценным клиентом. Тем более далее можно будет распространить это среди одноклассников, а эта идея меня очень вдохновляла.
Как выглядит официальный дневник:
Итак, для тех кто вообще не в курсе, рассказываю. Когда вы заходите на какой-либо сайт, вы переходите по ссылке, затем спустя много всего, что мы опустим, сервер высылает вам сайт. Чтобы получить список оценок, сайт или приложение также переходит по ссылке, а сервер отправляет в ответ уже не сайт, а нужный список оценок. Если я сделаю абсолютно точно такой же запрос в сеть, я получу абсолютно такой же ответ, то есть оценки. Грубо говоря, ссылки, по которым я могу сделать запрос и получить ответ, называются апи. Осталось только понять в каком виде делать запрос, по какому адресу, и как выглядит ответ.
В хроме есть очень удобный функционал для этого. Когда я заходил на вкладку оценок на сайте, сервер высылал готовую html таблицу. Я бы, конечно, мог из неё брать данные, но у меня было ощущение, что в мобильном приложении это делается как-то иначе. Вряд-ли там парсится html таблица. Но с телефоном всё оказалось куда сложнее.
Чтобы посмотреть какие запросы отправляет официальное приложение дневника, мне пришлось очень постараться. Я использовал charles proxy. По тому, как это делать есть много информации в Интернете. Ещё мне пришлось делать всякие махинации с pinning ssl (шифровкой запросов), чтобы наконец-то увидеть запросы. И да, здесь действительно всё было намного проще. Прилагаю скриншот.
В тот же вечер я в очень быстром темпе (а учусь я во 2 смену кстати) написал код, чтобы это работало. И вот самый первый запуск. Всё выглядит не очень, но моей радости не было предела.
Адаптация всего апи
Я думал, что сделать все функции дневника займёт несколько дней. Мне потребовалось несколько часов. Всё работало. Единственное, я не стал добавлять в свой клиент новости из официального дневника. Я не убрал firebase полностью, новости всё ещё берутся оттуда, а официальные новости вообще никак нельзя посмотреть.
Я добавил пару каких-то фич, по типу фильтров на вкладку дневника и ещё чего-то там неинтересного. И опять застой. Спустя какое-то время меня опять посещает вдохновение.
Новый функционал
Я собирался в пух и прах разнести официальный дневник. Сделать так, чтобы все пользовались моим. И начал я с создания аналитики. Это, как я считаю, до сих пор одно из лучших нововведений дневника. Здесь показывается то, как менялся средний балл в течение года или другого периода, сколько всего каких оценок вы получили, график появления оценок. Такую аналитику можно посмотреть и по отдельным предметам.
Вкладка оценок очень преобразилась. Это теперь не просто клон, а совсем другое приложение. Показывается прогресс (например средний балл на 5% лучше, чем неделю назад), можно сортировать по названию, среднему баллу, прогрессу и количеству оценок. Можно выделять цветом контрольные и проверочные работы. Если нажать на оценку, появляется урок, на котором она была получена.
Одна из полезнейших функций калькулятор. До этого школьникам приходилось с трудом считать свой средний балл (фото не подделано, это реальный случай).
Вкладка дневника очень изменилась в дизайне. Я добавил удобный выбор дня. Новости стали намного красивее. Также я добавил кнопку скачивания новой версии, если новость была про обновление. Меню преобразилось до неузнаваемости. Я конечно не дизайнер, но уж сделал как смог. Новый дизайн профиля и экрана логина.
В меню я добавил показ текущего урока (эту штуку можно листать влево-вправо, чтобы увидеть другие уроки дня). Ну и почему бы не добавить смену цвета оценок напоследок.
И ещё вместо скучных прогресс баров я сделал современный skeleton loading.
Самая большая проблема - новые пользователи
Вообще, когда я только начинал делать дневник, я понятия не имел, что такое ssl, pinning ssl, я даже не знал, что такое headers у ссылок. Изучая как оригинальный дневник делает запросы, я столкнулся с большой проблемой. Я получал id пользователя при входе в аккаунт. Далее он используется при отправке запросов. Но также с запросами отправляется apikey. Я конечно же не знал, что это. Только тыкаясь и разбираясь самостоятельно в исходном коде (сильно поломанном конечно же) официального дневника, я понял, откуда берётся этот ключ (кстати, сам этот ключ нужен для защиты от таких как я, для безопасности). Есть нативная функция, которая шифрует айди. Её результат и есть ключ. Но если вы знакомы с java, то понимаете - нативную функцию просто так не посмотреть.
Я немного попытался углубиться во всякие фриды и другие крутые штуки для риверс инженеров, но спустя пару дней понял, что не хочу больше этим заниматься. Они спрятали эту функцию так, что ощущение, если я найду её реализацию, то за мной сразу же выедут. Поэтому я оставил это дело. Я никогда не хотел быть риверс инженером, и мне это совсем не интересно.
И вот итог. Дневник работает только у меня и у очень малой группы людей. Ведь когда я делаю запросы в сеть из официального дневника, понятно дело, там светится apikey пользователя. Мне лишь достаточно записать его и подставить в свой дневник. Так, несколько людей вошли на моём телефоне в свои аккаунты, я через прокси посмотрел их ключи, подставил в свой дневник, и теперь у них всё работает. Но понятно дело, это совсем не то, чего я хотел бы.
Сотрудичество
В русторе как разработчик дневника указан центр оценки качества образования области. Я писал им с предложением о сотрудничестве. Ответ такой: “КОГАУ ЦОКО не занимается данным вопросом”. Можно было бы конечно поискать, к кому можно обратиться за сотрудничеством, но мне это не интересно.
Заключение
За время создания этого проекта, я очень сильно продвинулся в написании кода. Я до дневника и после - два разных человека в плане кодинга. Это бесценный опыт.
Кстати, на данный момент в проекте 11 тысяч строк кода, более 336 коммитов, 77 юнит тестов, покрывающих 14 viewmodels (где-то полностью, где-то почти).
Если у вас есть какие-либо интересующие вопросы по коду или вообще, то я всегда рад ответить в вк.
Спасибо за уделённое время.
Автор: Юдинков Максим