eigenein / openwifi-client-android Goto Github PK
View Code? Open in Web Editor NEWOpen WiFi Android Client Application
Home Page: https://play.google.com/store/apps/details?id=info.eigenein.openwifi
Open WiFi Android Client Application
Home Page: https://play.google.com/store/apps/details?id=info.eigenein.openwifi
Open Wi-Fi networks map. – Makes the map of Wi-Fi networks as you walk around even if the application is minimized. – Displays the coverage of each Wi-Fi network. – Customizable map view: normal or hybrid. – Customizable Wi-Fi search interval. Join us on Facebook: https://www.facebook.com/groups/openwifi.project/ Follow us on Twitter: https://twitter.com/owifi Join us on VK: http://vk.com/owifi Join our community on Google+: https://plus.google.com/communities/106829221677020050162 0.1.8 – Project is closed. Sync feature is removed. 0.1.7.3 – Added a menu command to forcibly close the application. – Sync is 5-10 times faster. – Fixed a crash when connecting to a Wi-Fi network. – Fixed a crash in statistics screen. – Filtering of networks on scan is slightly improved. 0.1.7.2 – Fixed the crash when a location provider is unavailable. – Removed unused advanced setting. – Local database size is slightly reduced. 0.1.7.1 Fixed a crash on Android 2.2. 0.1.7 This update changes the map refreshing algorithm. The new algorithm should work many times faster than the old one. The update requires full re-sync as the cache structure was changed. Full change list: – The cache structure was changed. New map refreshing algorithm was implemented. – "Wi-Fi is disabled" notification icon was changed to the standard one. – Active sync notification was added. – Statistics loading animation was added. – Rare failures were fixed. – Open source licenses screen was added. – Icons were added to the social network buttons. 0.1.6-beta – Significantly increased the speed of displaying networks on the map. – The icons of networks have been returned. – It is now possible to sync from server to client without authenticating. – Fixed a crash in the case if Google Maps or Google Play services are not installed. – Action Bar buttons are now highlighted when pressed. – Reduced APK size by 100kB. 0.1.5 – Switched to Google Maps Android API v2: more map features, faster map refreshing, less traffic for map data. – Android 2.1 is no longer supported due to switching to the newer Google Maps version. – Network counters are temporary removed – until the next update. – Fixed the network icon color for the Hybrid view. – Optimized APK size. 0.1.4 – Help screen. It is available from the overflow menu and will be shown once on the very first application startup. – Authentication is completely re-implemented and should fix authentication issues on some devices. – Application look and feel for Android < 3.0 is now similar to Android 3.0+. – Default search interval is changed to 10 seconds. – Added messages about not yet implemented features. 0.1.3 Known issue: if you do not see any networks in Minsk then tap "Settings" → "Sign in again" → "Synchronize Now". – Fixed last synced time summary in settings. – Added new permission to allow logging in with Google on some devices. – Fixed network areas color on the Satellite map view. 0.1.2 – The very first syncing autostart. – Using secured connection. – "Synchronize Now" option shows syncing status. – Network labels size is the same for different screens. – Using traffic compression. – Networks layer updating progress bar. – Authentication using Google Account. – Changed the order of preferences. 0.1.0 – Initial release.
Нужно соптимизировать процесс и уменьшить размер страницы. Большие задержки возникают из-за обновления флагов в локальной базе.
Поискать участки кода, которые требуют регулярного тестирования и написать для них тесты. Первая идея - код проверки наличия подключения к сети Интернет.
Идея пассивного поиска основывается на двух фичах:
Если приложение сможет перехватить результаты поиска сетей, и на этот момент будет известно местоположение, можно сохранить результаты в базу.
Профит:
Некритическая задача с сомнительной пользой. Теоретически, может привести некоторое количество пользователей, ищущих приложение "на ходу".
Тем самым, мы избавим себя от некоторой части криков пользователей, что приложение высаживает батарею до нуля.
Приложение должно уведомлять о таком событии. Нотификация должна предоставлять возможность быстро возобновить сканирование.
При включении сканирования проверять заряд батареи и переспрашивать пользователя, если заряд ниже критического.
В контекстном меню сети нужно предлагать поделиться информацией о точке. Фактически, это вызовет клиент, который может запостить некий текст с инфой о точке и нашем приложении (может привести к нам некоторое количество пользователей). :)
Инфа аналогична фиче "Поделиться местоположением", поэтому, искать инфу для реализации нужно в этом направлении.
Суть фичи заключается в синхронизации данных в небольшой, локальной относительно текущего местоположения, области.
Тем самым, мы поможем пользователям подключиться "здесь и сейчас", затратив лишь небольшое количество дорогого мобильного трафика.
Фичу можно сделать премиумной.
USER_COMMENT=
ANDROID_VERSION=4.1.1
APP_VERSION_NAME=0.1.0
BRAND=htc_europe
PHONE_MODEL=HTC One S
CUSTOM_DATA=
STACK_TRACE=java.lang.RuntimeException: Unable to start receiver info.eigenein.openwifi.receivers.ScanResultsReceiver: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2577)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5511)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at info.eigenein.openwifi.helpers.location.LocationTracker.getLocation(LocationTracker.java:50)
at info.eigenein.openwifi.receivers.ScanResultsReceiver.onReceive(ScanResultsReceiver.java:32)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2566)
... 10 more
java.lang.NullPointerException
at info.eigenein.openwifi.helpers.location.LocationTracker.getLocation(LocationTracker.java:50)
at info.eigenein.openwifi.receivers.ScanResultsReceiver.onReceive(ScanResultsReceiver.java:32)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2566)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5511)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
at dalvik.system.NativeStart.main(Native Method)
Действительно, если точка станет защищенной, то при текущей реализации клиенты перестанут о ней сообщать, и информация о точке всегда будет заведомо неверной.
Можно также попытаться скрыто хранить существующие данные о такой точке некоторое время в надежде, что она может стать открытой.
Многие публичные сети, которые ловит приложение, являются по умолчанию бесполезными - например, куча принтеров. Все они имеют довольно шаблонные SSID'ы и можно матчить SSID на предмет соответствия одному из шаблонов, и предлагать пользователю скрыть сразу все сети с таким шаблоном.
Но нужно найти способ донести пользователю, почему мы предлагаем скрыть такие сети.
Премиум?
Полезная фича для старта. Будет круто, если удастся прикрутить к UserEcho.
Чтобы они появились, нужно явно заставить приложение запустить обновление слоя сетей (например, подвигать картой).
Нужно сделать такой вызов:
PreferenceManager.setDefaultValues(this, R.xml.advanced_preferences, false);
https://developer.android.com/guide/topics/ui/settings.html#Defaults
Это было бы прикольно, но непонятно пока, что делать с точками, которые недоступны в текущей локации.
Тут можно либо использовать ту же кнопку, что и в MainActivity
, либо ToggleButton
/ Switch
. Просто будет способствовать большей дружелюбности интерфейса.
Точка входа здесь: https://developer.android.com/guide/topics/ui/controls/togglebutton.html
Настроек становится много. Есть смысл поделить их на разные preference screen. Кандидаты:
Почитать: Using subscreens
Это позволит использовать новый компонент карт в современных устройствах. Здесь наверняка придется написать кучу адаптеров для абстрагирования от конкретной версии карт.
Хорошо бы в рамках этой же задачи добавить расширенную настройку для явного переключения версии карт – как минимум сильно упростит отладку.
Низкоприоритетная задача - просто выглядит оно не очень круто.
Возможность ручного обновления оставляем, автоматическое ограничиваем, чтобы снизить нагрузку на сервер. После старта проекта период делаем небольшим, чтобы лавина пользователей не видела пустой карты. затем - увеличиваем в одном из обновлений.
Реализуется просто, если запилить #5 – просто проверяем, давно ли было последнее.
Подозреваю, что таски на выборку сетей работают нереально долго и не прерываются (то есть, подозрение на долго выполняющийся запрос).
USER_COMMENT=
ANDROID_VERSION=2.1-update1
APP_VERSION_NAME=0.1.0
BRAND=LGE
PHONE_MODEL=GT540
CUSTOM_DATA=
STACK_TRACE=java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1876)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:774)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1295)
at android.os.AsyncTask.execute(AsyncTask.java:394)
at info.eigenein.openwifi.activities.MainActivity.startRefreshingScanResultsOnMap(MainActivity.java:221)
at info.eigenein.openwifi.activities.MainActivity.access$100(MainActivity.java:34)
at info.eigenein.openwifi.activities.MainActivity$1.onMovedOrZoomed(MainActivity.java:63)
at info.eigenein.openwifi.helpers.map.TrackableMapView.fireMovedOrZoomed(TrackableMapView.java:58)
at info.eigenein.openwifi.helpers.map.TrackableMapView.dispatchDraw(TrackableMapView.java:41)
at android.view.View.draw(View.java:6561)
at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
at android.view.View.draw(View.java:6561)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
at android.view.View.draw(View.java:6561)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1903)
at android.view.ViewRoot.draw(ViewRoot.java:1349)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1114)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4363)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:885)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
at dalvik.system.NativeStart.main(Native Method)
Просто, чтобы было меньше желающих посмотреть в протокол.
Поможет при поддержке пользователей. Есть также смысл использовать стегу для записи Support ID и какой-нибудь контрольной суммы, чтобы убедиться, что изображение не модифицировано.
Для тех, кто захочет ее отключить и синхронизироваться через любое подключение.
Предусмотреть кейс, когда синхронизация выполняется "прямо сейчас".
Не смотрится черное на черном. :) Пример: иконка Wi-Fi в списке сетей.
Здесь все понятно: нужно как и на клиенте, удалять старые, никому не нужные записи.
Есть смысл пока не торопиться с этой задачей и посмотреть реальный объем данных на сервере, позапускать различные запросы и измерить скорость их выполнения.
Не факт, что это легко реализуемо, но было бы круто.
Нужно убедиться, что работает сжатие и т.п.
Найти способ автоматически подставлять релизный ключ в релизной версии приложения.
После запиливания синхронизации появилась денормализация данных. Кроме того, код усложнен из-за наличия двух сущностей вместо одной. Кроме того, появляются "потерянные" местоположения, которые удалить очевидным путем не так просто. + Raw queries с join'ами. Итого:
StoredScanResult
и StoredLocation
.MyScanResult
, объединяющую две предыдущие.Нужно обеспечить одностороннюю синхронизацию на клиент с интерфейсом для отключения всей фичи и индивидуальных пунктов.
В силу того, что обновление слоя сетей выполняется довольно долго, до ее оптимизации стоит добавить индикацию обновления карты.
Должна быть выбрана по умолчанию.
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.