tonykolomeytsev / mpeiapp Goto Github PK
View Code? Open in Web Editor NEWMpeiX - Расписание пар, карта корпусов и личный кабинет БАРС для студентов и преподавателей НИУ МЭИ
License: MIT License
MpeiX - Расписание пар, карта корпусов и личный кабинет БАРС для студентов и преподавателей НИУ МЭИ
License: MIT License
Некоторые группы занимаются физрой на стадионе круглый год, если просто тащить place с сайта, то можно ввести пользователей в заблуждение.
Вместо "Спортзал" писать "Спортзал, стадион или иное место занятия спортом" или типа того.
При тапе по плитке занятия на экране feed и на экране timetable должны появляться подробности о преподавателе, о местоположении занятия, о кафедре препода, замечания от студентов.
Сейчас, в версии 0.9.8, предложение обновиться появляется только на экране feed. Большинство чаще смотрит экраны расписания и БАРСа, отчего тупо пропускают такую важную инфу, как обновление.
Экран Feed по факту, не удобен и не очень нужен сейчас, хоть и выполняет функцию просмотра и смены расписания.
Нужно польностью пересмотреть логику экрана и сделать его более полезным для пользователя.
Возможно, стоит показывать аналитику по оценками и парам. Показывать только предстоящие пары на след. день, домашние работы, выход на экран настроек и т.д.
Нужно хорошо подумать над тем, что действительно должно быть на главном экране.
Получение отчётов о сбоях в Firebase
На карточке пары, которая идёт в данный момент, можно отображать "загрузку", показывающую, сколько уже длится пара и сколько времени до ее окончания.
height WRAP_CONTENT иногда не работает в BarsDetails
И вообще заняться её оптимизацией, визуальной и программной.
В конце ленты показывать заглушку, сообщающую о том, что знать будущее опасно.
Позволить пользователям добавлять дз и комментарии к любой паре. По свайпу карточки занятия влево создавать заметку.
Очень много boilerplate кода во всех фрагментах. Количество экранов быстро растет. Основные функции нужно поместить в родительский класс BaseFragment.
Запихать туда детект клавиатуры, inject презентера, работа с тулбаром/статусбаром, inflate вьюхи и т.д.
При открытии ленты пролистывать расписание к предстоящей паре, чтобы не приходилось листать до нее. Выделить предстоящую пару каким-нибудь цветом и текстом.
Надо переверстать карточки в feed и timetable, визуально выделить главную информацию.
В timetable изменить способ отображения времени пар. Троеточие между цифрами может вводить в заблуждение.
Обозначать разными маркерами кофейни, бургерные, пиццерии, магазины и остальные заведения различных типов
Если нужно будет через Firebase сообщить пользователям что-либо, можно использовать баннеры: https://material.io/components/banners/
Из-за отсутствия у DayFragment конструктора без аргументов, приложение падает, если восстанавливает своё состояние на экране TimetableFragment.
В ViewPager для всех дней недели используются дубликаты фрагмента DayFragment с разными наборами данных, которые передаются в конструкторе. Как восстанавливать данные после того как фрагмент был убит - хороший вопрос)))
Показывать в AddFragment последние загруженные расписания, чтобы не набирать номера группы заново и не загружать их с сайта заново.
Создать новые события аналитики для того чтобы понять, какие экраны приложения пользователи используют чаще.
Про создание новых событий: https://firebase.google.com/docs/analytics/events?platform=android
Про user-properties: https://firebase.google.com/docs/analytics/user-properties?platform=android
Отчет из крашлитики:
Fatal Exception: java.lang.IndexOutOfBoundsException: Empty list doesn't contain element at index 0.
at kotlin.collections.EmptyList.get(EmptyList.java:1)
at kotlin.collections.EmptyList.get(EmptyList.java:1)
at com.example.map.MapFragmentPresenter$onResume$1.onChanged(MapFragmentPresenter.java:7)
at com.example.map.MapFragmentPresenter$onResume$1.onChanged(MapFragmentPresenter.java:7)
at androidx.lifecycle.LiveData.assertMainThread(LiveData.java)
at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java)
at androidx.lifecycle.LiveData.assertMainThread(LiveData.java)
at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java)
at kekmech.ru.repository.PlacesRepositoryImpl$updateBuildings$1.onComplete(PlacesRepositoryImpl.java:8)
Похоже, какие-то проблемы если пользователь не смог загрузить places
Реализовать смену темы налету (BaseFragment) и подобрать оптимальную цветовую палитру.
В разделе БАРС карточки дисциплин не кликаются, если клик попадает в RecyclerView с оценками.
Позволить пользователю менять расписание не только с экрана ленты, но и с других экранов.
В подробностях о дисциплине БАРС указывать, экзамен по ней сдается, курсовая или зачёт.
Пока всего один пользователь столкнулся с этим багом. Надо поправить. Возникает, если нажать одновременно более чем на одну дисциплину.
Crashlitycs Stack trace:
Fatal Exception: java.lang.IllegalArgumentException: navigation destination kekmech.ru.mpeiapp:id/action_barsFragment_to_barsDetailsFragment is unknown to this NavController
at androidx.navigation.NavController.navigate(NavController.java:10)
at androidx.navigation.NavController.navigate(NavController.java:10)
at androidx.navigation.NavController.navigate(NavController.java:10)
at androidx.navigation.NavController.navigate(NavController.java:10)
at kekmech.ru.mainscreen.MainNavRouter.a(MainNavRouter.java:20)
at kekmech.ru.bars.main.BarsFragmentPresenter.onItemClick(BarsFragmentPresenter.java:5)
at kekmech.ru.bars.main.BarsFragmentPresenter.access$onItemClick(BarsFragmentPresenter.java:2)
at kekmech.ru.bars.main.BarsFragmentPresenter$updateWithScore$1$1$1.invoke(BarsFragmentPresenter.java:2)
at kekmech.ru.bars.main.BarsFragmentPresenter$updateWithScore$1$1$1.invoke(BarsFragmentPresenter.java:2)
at kekmech.ru.coreui.adapter.BaseClickableItem$updateViewHolderNative$1$1.run(BaseClickableItem.java:2)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:693)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7076)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
Подключить API Yandex карт, спрятать API_KEY. Показывать расположение корпусов, общаг, столовок.
Новым пользователям сразу после запуска приложения вместо карточке "день самостоятельных занятий" предлагать ввести номер группы
Ограничить максимально допустимую частоту переключения, как это сделано в в приложениях известных соцсетей. Минимальное время между переключениями должно быть где-то 200 - 300 мс.
Уведомлять пользователя о том, что вышла новая версия приложения.
В отчетах Crashlitycs подробная информация. На версии 0.9.4.
AddFragment должен быть в виде bottom sheet dialog, не перекрывающим полностью предыдущий экран (feed). Так как смена группы это частый use case, надо чтобы взаимодействие происходило максимально легко, без переходов на другие экраны, чтобы легко отменялось.
Так как макет барса верстался со скоростью света ради релиза, нужно привести его в порядок к четвергу.
Выделить наименования пар, приглушить цвета оценок.
Сделать так чтобы информация читалась быстрее.
Все данные о корпусах, общагах и столовых поместить в коллекцию places.
При открытии списка групп, либо диалога обновления, systemNav (наэкранная навигация) становится темно-серого цвета, это некрасиво. Надо оставить белый цвет.
Решение: https://pumpingco.de/blog/easy-tricks-to-boost-the-native-android-integration-of-your-cross-platform-apps/
Не работает смена расписания на нечетную неделю.
Если не дождаться, пока слайдер с буквами корпусов докрутится, и переключить экран, то приложение падает.
Fatal Exception: kotlin.KotlinNullPointerException
at com.example.map.MapFragmentPresenter.selectBuilding(MapFragmentPresenter.kt:116)
at com.example.map.MapFragmentPresenter.access$selectBuilding(MapFragmentPresenter.kt:32)
at com.example.map.MapFragmentPresenter$onResume$1$1.invoke(MapFragmentPresenter.kt:68)
at com.example.map.MapFragmentPresenter$onResume$1$1.invoke(MapFragmentPresenter.kt:32)
at com.example.map.view.MapFragment$onViewCreated$1.invoke(MapFragment.kt:43)
at com.example.map.view.MapFragment$onViewCreated$1.invoke(MapFragment.kt:23)
at kekmech.ru.coreui.slider.EnumSlider$1$1.invoke(EnumSlider.kt:41)
at kekmech.ru.coreui.slider.EnumSlider$1$1.invoke(EnumSlider.kt:11)
at kekmech.ru.coreui.slider.EnumSliderLayoutManager$onTouchRelease$1.run(EnumSliderLayoutManager.kt:79)
*словил NPE в Kotlin: * 👍
Показывать оценки за КМ по всем предметам семестра.
На время разработки закрыть экран заглушкой "В разработке".
Добавить встроенный браузер в раздел БАРС, в котором будет происходить автоматический логин, на случай, если парсер вдруг перестанет работать. Ну и разобраться, почему на некоторых китайских девайсах падает приложение во время inflate WebView.
При воскрешении приложения на экране подробностей, пользователь увидит пустую табличку. Исправить можно сохранением id дисциплины в shared preferences
Раздел "места" может включать в себя сачок, библиотеку, тир, и много мест, которые нельзя отнести ни к корпусам, ни к общагам.
Сейчас для получения страничек с расписанием используется Webkit. Нужно перейти на параллельные POST/GET запросы, это значительно должно ускорить получение данных.
В ВСК показывать расписание на следующую неделю и писать что-то вроде "Грядущая неделя".
На вкладке timetable при переходе в ландшафтный режим отображать все 5 рабочих дней недели с парами. То есть показывать расписание сразу на всю неделю.
Показывать оценки за контрольные мероприятия и предстояние контрольные мероприятия в разделе БАРС.
В ленте отображать импортированные из групп ВК мероприятия. Учитывать группы ПБ, Профкома, подслушку.
Придумать, каким образом переносить данные с ВК в приложение. Возможно firebase может помочь.
При вводе номера группы сообщать, если номер некорректный или группы несуществует. Не допускать бесконечной загрузки.
Не загружать каждый раз из БД данные о парах, а кэшировать их каким-либо способом. Возможно, стоит использовать LiveDatа в качестве контейнера для списков пар и текущего статуса.
Иногда заходит не с первого раза, показывает старый рейтинг предыдущего пользователя
Для наследников BaseFragment реализовать встроенный механизм Inflating'a view stub'ов для ускорения загрузки фрагментов и улучшения общего UX.
В дни праздников в ленте показывать выходной, а не только по субботам и воскресеньям.
Поменять UI карты, т.к. слайдер для корпусов это не очень удобно, а остальные виды локаций вообще хз как запихать в такое мелкое окно. Вероятно стоит сделать что-то вроде немодального bottom sheet с нормальным функционалом карты.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.