[android] Streamline LocationHelper #3944
Labels
No labels
Accessibility
Accessibility
Address
Address
Android
Android
Android Auto
Android Auto
Android Automotive (AAOS)
Android Automotive (AAOS)
API
API
AppGallery
AppGallery
AppStore
AppStore
Battery and Performance
Battery and Performance
Blocker
Blocker
Bookmarks and Tracks
Bookmarks and Tracks
Borders
Borders
Bug
Bug
Build
Build
CarPlay
CarPlay
Classificator
Classificator
Community
Community
Core
Core
CrashReports
CrashReports
Cycling
Cycling
Desktop
Desktop
DevEx
DevEx
DevOps
DevOps
dev_sandbox
dev_sandbox
Directions
Directions
Documentation
Documentation
Downloader
Downloader
Drape
Drape
Driving
Driving
Duplicate
Duplicate
Editor
Editor
Elevation
Elevation
Enhancement
Enhancement
Epic
Epic
External Map Datasets
External Map Datasets
F-Droid
F-Droid
Fonts
Fonts
Frequently User Reported
Frequently User Reported
Fund
Fund
Generator
Generator
Good first issue
Good first issue
Google Play
Google Play
GPS
GPS
GSoC
GSoC
iCloud
iCloud
Icons
Icons
iOS
iOS
Legal
Legal
Linux Desktop
Linux Desktop
Linux packaging
Linux packaging
Linux Phone
Linux Phone
Mac OS
Mac OS
Map Data
Map Data
Metro
Metro
Navigation
Navigation
Need Feedback
Need Feedback
Night Mode
Night Mode
NLnet 2024-06-281
NLnet 2024-06-281
No Feature Parity
No Feature Parity
Opening Hours
Opening Hours
Outdoors
Outdoors
POI Info
POI Info
Privacy
Privacy
Public Transport
Public Transport
Raw Idea
Raw Idea
Refactoring
Refactoring
Regional
Regional
Regression
Regression
Releases
Releases
RoboTest
RoboTest
Route Planning
Route Planning
Routing
Routing
Ruler
Ruler
Search
Search
Security
Security
Styles
Styles
Tests
Tests
Track Recording
Track Recording
Translations
Translations
TTS
TTS
UI
UI
UX
UX
Walk Navigation
Walk Navigation
Watches
Watches
Web
Web
Wikipedia
Wikipedia
Windows
Windows
Won't fix
Won't fix
World Map
World Map
No milestone
No project
No assignees
2 participants
Due date
No due date set.
Dependencies
No dependencies set.
Reference: organicmaps/organicmaps-tmp#3944
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "rt-location-refactor"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Signed-off-by: Roman Tsisyk roman@tsisyk.com
Это чему-то мешает? Вроде логично при таймауте выключать позицию
Попросили как раз не выключать и искать далее, мол gps не успевает прочухаться. Оно работает в Androiid сейчас, просто индикация была сломана. В iOS мне кажется, что отключается.
Изменений очень много, сложно оценить, как оно будет работать, и где всплывут проблемы. Надо тестировать. Соберёшь, пожалуйста, beta версию отсюда? Хотя бы для нас сначала, приватную.
Почему выбран именно 1 час, а не, например, 5 минут? У совершенно очень очевидно сейчас на экране, что позиция старая. Пользователь может некоторое время смотреть на какое-то совсем не релевантное место на карте, вместо честного ожидания.
@vng разве у нас нет такого колбэка? Ведь именно из ядра должно прилетать, что роут завершён.
У нас эта логика сработает без перезапуска приложения, если юзер в ОМ отключит GP Services?
Только мне такой подход с асинхронными колбэками кажется странным? Других вариантов нет?
Почему не start? Кажется неправильным вызывать stop() тогда, когда ничего не было запущено.
Может лучше вынести всё, что требует activity, туда? Сваливание в всего "кучу" в helper не выглядит хорошей идеей, особенно на фоне Android Auto и Track Recorder.
Можно подробнее про "попросили искать дальше"? Что именно будет происходить сейчас? После 30 секундного таймаута дальше будет бесконечно крутиться радар и не гаснуть экран, пока пользователь явно не нажмёт кнопку с радаром, чтобы остановить поиск позиции?
Да, сделаю if (!isActive()) start(); здесь. Немного перезаложился без необходимости.
Я могу вынести всё это напрямую в MwmActivity исходя из соображений, что это единственный UI юзер этого хелпера. Может быть, тогда мы сможем его рано или поздно убить совсем.
Будем делать так? Код MwmActivity станет еще больше, но в целом поддержка будет проще.
Да, это однозначная самая кривая часть этой реализации данной подсистемы. Проблема в том, что FusedLocationProvider имеет полностью асинхронный дизайн API инициализации. То есть мы даже не можем синхронно дождаться начала подписки на GPS и можем получить ошибку когда-нибудь позже, асинхронно. Прямо сейчас на практике одна из ошибок приходит вообще синхронно. Это приводит к тому, что start() не успевает завершиться, но мы уже прыгаем в другой метод и пытаемся там что-то делать. Но и закладываться на синхронность нельзя, потому что API асинхронное и поведение под капотом может поменяться незаметно.
В AndroidNativeLocationProvider мы пародируем это поведение в целях унификации. Там есть один кейс, когда мы прям в процессе инициализации детектим, что локация тю-тю и продолжать нет смысла. При этом есть абсолютно такой же асинхронный кейс, когда юзер тупо отключает какой-нибудь провайдер в настройках системы. Пока выглядит так, что обрабатывать всё асинхронно будет более надежно.
Здесь бы неплохо зашел message-passing based подход на акторах, но это требует времени для поиска работоспособного фреймворка. Не могу дать какой-то разумный estimate на этот дизайн.
Предложите любое значение для этой константы. Могу поставить 5 минут. Самое главное, что я убираю принудительный запрос getLastLocation() из кода ниже, т.к. считаю это причиной возникновения протухшей локации и весьма доставшего меня бага "Внуково" (organicmaps/organicmaps#2034). Пока наблюдения показывают, что при наличии рабочего GPS локация из subscription приходит моментально и смысла запрашивать всякий мусор из getLastLocation() нет никакго.
Нет, это для обработки отключения в системе. Оно срабатывает при отключении wifi + mobile data. Fused просто отваливается моментально.
По идее там вообще в ядре можно всё разрулить. Я пока не решаю эту проблему. Просто перенес код из LocationHelper в MwmActivity без изменения семантики. Стало выглядеть лучше.
Будет бесконечно крутиться радар и искаться локация. Нажатие на кнопку с радаром у нас не ведет к отключению локации и лишь переключает между режимами. Таким образом, локация будет искаться вечно или пока прилага не уйдет в фоне. Это именно то, на что жаловались. Есть или смысл показывать диалог каждые 30 секунд? Не знаю. Я могу оставить эту строчку и вставить moveToNextMode() перед показом диалога. Тогда core будет думать, что локация перезапустилась и диалог вылезет еще раз через 30 секунд. Хотя текущая логика isErrorDialogAnnyoing работает именно на скрытие этого диалога совсем. Я лишь выпилил дублирующийся флажок из Android части.
Главный кейз, который должен работать с last location — это когда после работы с ОМ, ОМ сворачивается, интернет отключается и девайс блокируется. И после этого, через несколько минут, снова открывается ОМ. Что будет сейчас в таком случае? (важно чтобы в фоне не было других приложений с активной локацией).
Этот комментарий бы да в код. И другие некоторые комментарии тоже. Чем больше, тем лучше, чтобы потом не забыть важные детали.
Т.е. предлагается забрать у пользователей возможность перестать палить батарею, не выходя из приложения? И теперь единственный способ остановить поиск локации в ОМ будет запретить локацию в системе (сразу для всех приложений)? Мне не кажется это хорошей идеей.
Надо либо оставлять текущее поведение, либо добавлять явное отключение поиска позиции (переход в no follow no position) по тычку в крутящийся радар, как описано в #3450
Так или иначе, если все же решишь убрать таймаут, то оставь там коммент мол так и так - это больше не надо. Поможет потом вообще вычистить эту логику с таймерами.
Я сам натыкался на это и после беглого просмотра что-то там не сходится. В пределах этого PR вполне достаточно коммента Ромы.
Но ведь другие активити (Download resources, Search) тоже работают с позицией.
Давайте пока не трогать это место, PR и так уже очень и очень большой.
Отключается по нажатию кнопки Stop.
Локация начнет искаться заново с холодного старта. Данный патч не добавляет поддержку локации в фоновом режиме и никак не меняет это поведение.
2d2d7a4a70/android/flavors/gms-enabled/app/organicmaps/location/GoogleFusedLocationProvider.java (L85-L119)
, но при этом иногда (не всегда) вызов callback может происходить в блокирующем режиме. В данном патче я всего прогоняю onLocationDisabled через event loop чтобы всегда было одинаковое неблокирующее поведение. Мы запускаем локацию, она тупит какое-то время и асинхронно фейлится.По коду и так очевидно и понятно, что это системная проверка и с нашими настройками никак не связана. Наши настройки отключают GoogleFusedLocationProvider, а не системный Fused. Системный fused отключать не надо.
По факту Activity в LocationHelper нужна только для показа диалогов с ошибками. В случае Splash там стоит специальная проверка на пермишены сверху. Я в целом думал там сделать attach()/deattach() чтобы можно было бы обрабатывать не только пермишены, но и отключенные сервисы локации. Наверное, пусть пока этот LocationHelper останется с его attach()/deattach() семантикой и ничего инлайнить в MwmActivity не будем.
This PR has been updated. Please check
docs/ANDROID_LOCATION_TEST.md
for the test plan.Логика по продолжению поиска после 30 секунд была добавлена ранее по запросу @biodranik. Данный патч не добавляет никакие новые режимы в кнопку локации. Поведение диалога также не меняется. Меняется лишь реализация (удаляются ненужные флажки) и фиксится проблема с неправильной индикацией кнопки. Без изменения данной строчки кода всё также будет работать, просто юзер будет видеть перечёркнутую иконку, хотя по факту локация будет продолжать искаться. Мне, конечно, было бы сильно проще просто увеличить там таймаут до условных 5 минут или вообще выпилить этот диалог к черту за отсутствием необходимости.
Вообщем, какие-нибудь actionable комментарии приветствуются, а пока я тут ничего больше делать не буду.
Я не до конца понимаю, какое сейчас будет поведение. Можешь описать подробно, что увидит пользователь в ответ на свои действия?
No more comments. Need to beta test it.