From 7d9052542009f8a7a37e5e4dd3f234dc9f2bcdce Mon Sep 17 00:00:00 2001 From: Dmitry Donskoy Date: Fri, 24 Apr 2020 01:49:19 +0300 Subject: [PATCH] [android] Added guides core --- android/jni/CMakeLists.txt | 1 + android/jni/com/mapswithme/maps/Framework.cpp | 26 +++++++ android/jni/com/mapswithme/maps/Framework.hpp | 4 + .../mapswithme/maps/guides/GuidesManager.cpp | 36 +++++++++ .../src/com/mapswithme/maps/Framework.java | 4 + .../com/mapswithme/maps/MwmApplication.java | 13 ++++ .../guides/GuidesErrorDialogListener.java | 9 +++ .../maps/maplayer/guides/GuidesManager.java | 75 +++++++++++++++++++ .../maps/maplayer/guides/GuidesState.java | 19 +++++ .../guides/OnGuidesChangedListener.java | 6 ++ map/framework.cpp | 4 +- map/framework.hpp | 2 +- 12 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 android/jni/com/mapswithme/maps/guides/GuidesManager.cpp create mode 100644 android/src/com/mapswithme/maps/maplayer/guides/GuidesErrorDialogListener.java create mode 100644 android/src/com/mapswithme/maps/maplayer/guides/GuidesManager.java create mode 100644 android/src/com/mapswithme/maps/maplayer/guides/GuidesState.java create mode 100644 android/src/com/mapswithme/maps/maplayer/guides/OnGuidesChangedListener.java diff --git a/android/jni/CMakeLists.txt b/android/jni/CMakeLists.txt index 33f4372c3d..3ab11ff169 100644 --- a/android/jni/CMakeLists.txt +++ b/android/jni/CMakeLists.txt @@ -54,6 +54,7 @@ set( com/mapswithme/maps/editor/OsmOAuth.cpp com/mapswithme/maps/Framework.cpp com/mapswithme/maps/guides/Guides.cpp + com/mapswithme/maps/guides/GuidesManager.cpp com/mapswithme/maps/isolines/IsolinesManager.cpp com/mapswithme/maps/LightFramework.cpp com/mapswithme/maps/LocationHelper.cpp diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 9d0bfcd9a8..b46985f6fa 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -125,6 +125,7 @@ Framework::Framework() m_work.GetTrafficManager().SetStateListener(bind(&Framework::TrafficStateChanged, this, _1)); m_work.GetTransitManager().SetStateListener(bind(&Framework::TransitSchemeStateChanged, this, _1)); m_work.GetIsolinesManager().SetStateListener(bind(&Framework::IsolinesSchemeStateChanged, this, _1)); + m_work.GetGuidesManager().SetStateListener(bind(&Framework::GuidesSchemeStateChanged, this, _1)); m_work.GetPowerManager().Subscribe(this); } @@ -176,6 +177,12 @@ void Framework::IsolinesSchemeStateChanged(IsolinesManager::IsolinesState state) m_onIsolinesStateChangedFn(state); } +void Framework::GuidesSchemeStateChanged(GuidesManager::GuidesState state) +{ + if (m_onGuidesStateChangedFn) + m_onGuidesStateChangedFn(state); +} + bool Framework::DestroySurfaceOnDetach() { if (m_vulkanContextFactory) @@ -626,6 +633,11 @@ void Framework::SetIsolinesListener(IsolinesManager::IsolinesStateChangedFn cons m_onIsolinesStateChangedFn = function; } +void Framework::SetGuidesListener(GuidesManager::GuidesStateChangedFn const & function) +{ + m_onGuidesStateChangedFn = function; +} + bool Framework::IsTrafficEnabled() { return m_work.GetTrafficManager().IsEnabled(); @@ -1785,6 +1797,20 @@ Java_com_mapswithme_maps_Framework_nativeIsIsolinesLayerEnabled(JNIEnv * env, jc return static_cast(frm()->LoadIsolinesEnabled()); } +JNIEXPORT void JNICALL +Java_com_mapswithme_maps_Framework_nativeSetGuidesLayerEnabled(JNIEnv * env, jclass, jboolean enabled) +{ + auto const value = static_cast(enabled); + frm()->GetGuidesManager().SetEnabled(value); + frm()->SaveGuidesEnabled(value); +} + +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_Framework_nativeIsGuidesLayerEnabled(JNIEnv * env, jclass) +{ + return static_cast(frm()->LoadGuidesEnabled()); +} + JNIEXPORT void JNICALL Java_com_mapswithme_maps_Framework_nativeSaveSettingSchemeEnabled(JNIEnv * env, jclass, jboolean enabled) { diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index 6d75e3ab6e..bc49f76eb2 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -71,6 +71,7 @@ namespace android void TrafficStateChanged(TrafficManager::TrafficState state); void TransitSchemeStateChanged(TransitReadManager::TransitSchemeState state); void IsolinesSchemeStateChanged(IsolinesManager::IsolinesState state); + void GuidesSchemeStateChanged(GuidesManager::GuidesState state); void MyPositionModeChanged(location::EMyPositionMode mode, bool routingActive); @@ -81,6 +82,7 @@ namespace android TrafficManager::TrafficStateChangedFn m_onTrafficStateChangedFn; TransitReadManager::TransitStateChangedFn m_onTransitStateChangedFn; IsolinesManager::IsolinesStateChangedFn m_onIsolinesStateChangedFn; + GuidesManager::GuidesStateChangedFn m_onGuidesStateChangedFn; bool m_isChoosePositionMode; @@ -171,6 +173,8 @@ namespace android void SetTrafficStateListener(TrafficManager::TrafficStateChangedFn const & fn); void SetTransitSchemeListener(TransitReadManager::TransitStateChangedFn const & fn); void SetIsolinesListener(IsolinesManager::IsolinesStateChangedFn const & fn); + void SetGuidesListener(GuidesManager::GuidesStateChangedFn const & fn); + bool IsTrafficEnabled(); void EnableTraffic(); void DisableTraffic(); diff --git a/android/jni/com/mapswithme/maps/guides/GuidesManager.cpp b/android/jni/com/mapswithme/maps/guides/GuidesManager.cpp new file mode 100644 index 0000000000..12283145de --- /dev/null +++ b/android/jni/com/mapswithme/maps/guides/GuidesManager.cpp @@ -0,0 +1,36 @@ +#include +#include "com/mapswithme/maps/Framework.hpp" +#include "com/mapswithme/core/jni_helper.hpp" +#include "com/mapswithme/platform/Platform.hpp" + +using namespace std::placeholders; + +extern "C" +{ +static void GuidesStateChanged(GuidesManager::GuidesState state, + std::shared_ptr const & listener) +{ + LOG(LINFO, (static_cast(state))); + JNIEnv * env = jni::GetEnv(); + env->CallVoidMethod(*listener, + jni::GetMethodID(env, *listener, "onStateChanged", "(I)V"), + static_cast(state)); +} + + +JNIEXPORT void JNICALL +Java_com_mapswithme_maps_maplayer_Guides_GuidesManager_nativeAddListener(JNIEnv *env, jclass clazz, jobject listener) +{ + CHECK(g_framework, ("Framework isn't created yet!")); + g_framework->SetGuidesListener(std::bind(&GuidesStateChanged, + std::placeholders::_1, + jni::make_global_ref(listener))); +} + +JNIEXPORT void JNICALL +Java_com_mapswithme_maps_maplayer_Guides_GuidesManager_nativeRemoveListener(JNIEnv * env, jclass clazz) +{ + CHECK(g_framework, ("Framework isn't created yet!")); + g_framework->SetGuidesListener(nullptr); +} +} diff --git a/android/src/com/mapswithme/maps/Framework.java b/android/src/com/mapswithme/maps/Framework.java index 8b02bc677a..177c612cf0 100644 --- a/android/src/com/mapswithme/maps/Framework.java +++ b/android/src/com/mapswithme/maps/Framework.java @@ -442,6 +442,10 @@ public class Framework public static native boolean nativeIsIsolinesLayerEnabled(); + public static native void nativeSetGuidesLayerEnabled(boolean enabled); + + public static native boolean nativeIsGuidesLayerEnabled(); + @NonNull public static native MapObject nativeDeleteBookmarkFromMapObject(); diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index c9204f122f..0e144c1124 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -23,6 +23,7 @@ import com.mapswithme.maps.geofence.GeofenceRegistry; import com.mapswithme.maps.geofence.GeofenceRegistryImpl; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.location.TrackRecorder; +import com.mapswithme.maps.maplayer.guides.GuidesManager; import com.mapswithme.maps.maplayer.isolines.IsolinesManager; import com.mapswithme.maps.maplayer.subway.SubwayManager; import com.mapswithme.maps.maplayer.traffic.TrafficManager; @@ -64,6 +65,10 @@ public class MwmApplication extends Application implements AppBackgroundTracker. @NonNull private IsolinesManager mIsolinesManager; + @SuppressWarnings("NullableProblems") + @NonNull + private GuidesManager mGuidesManager; + private boolean mFrameworkInitialized; private boolean mPlatformInitialized; @@ -191,6 +196,7 @@ public class MwmApplication extends Application implements AppBackgroundTracker. mBackgroundTracker.addListener(mVisibleAppLaunchListener); mSubwayManager = new SubwayManager(this); mIsolinesManager = new IsolinesManager(this); + mGuidesManager = new GuidesManager(this); mConnectivityListener = new ConnectivityJobScheduler(this); mConnectivityListener.listen(); @@ -292,6 +298,7 @@ public class MwmApplication extends Application implements AppBackgroundTracker. TrafficManager.INSTANCE.initialize(null); SubwayManager.from(this).initialize(null); IsolinesManager.from(this).initialize(null); + GuidesManager.from(this).initialize(null); mPurchaseOperationObservable.initialize(null); mBackgroundTracker.addListener(this); mFrameworkInitialized = true; @@ -418,6 +425,12 @@ public class MwmApplication extends Application implements AppBackgroundTracker. nativeOnTransit(foreground); } + @NonNull + public GuidesManager getGuidesManager() + { + return mGuidesManager; + } + private static class VisibleAppLaunchListener implements AppBackgroundTracker.OnVisibleAppLaunchListener { @Override diff --git a/android/src/com/mapswithme/maps/maplayer/guides/GuidesErrorDialogListener.java b/android/src/com/mapswithme/maps/maplayer/guides/GuidesErrorDialogListener.java new file mode 100644 index 0000000000..7d65f9728f --- /dev/null +++ b/android/src/com/mapswithme/maps/maplayer/guides/GuidesErrorDialogListener.java @@ -0,0 +1,9 @@ +package com.mapswithme.maps.maplayer.guides; + +import androidx.annotation.NonNull; +import com.mapswithme.maps.maplayer.isolines.IsolinesState; + +public interface GuidesErrorDialogListener +{ + void onStateChanged(@NonNull GuidesState type); +} diff --git a/android/src/com/mapswithme/maps/maplayer/guides/GuidesManager.java b/android/src/com/mapswithme/maps/maplayer/guides/GuidesManager.java new file mode 100644 index 0000000000..694f176f8d --- /dev/null +++ b/android/src/com/mapswithme/maps/maplayer/guides/GuidesManager.java @@ -0,0 +1,75 @@ +package com.mapswithme.maps.maplayer.guides; + +import android.app.Application; +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.mapswithme.maps.Framework; +import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.base.Initializable; +import com.mapswithme.maps.maplayer.isolines.IsolinesErrorDialogListener; +import com.mapswithme.maps.maplayer.subway.OnIsolinesChangedListener; + +public class GuidesManager implements Initializable +{ + @NonNull + private final OnGuidesChangedListener mListener; + @NonNull + private final Application mApplication; + + public GuidesManager(@NonNull Application application) + { + mApplication = application; + mListener = this::onStateChanged; + } + + private void onStateChanged(int index) + { + GuidesState state = GuidesState.values()[index]; + state.activate(mApplication); + } + + public boolean isEnabled() + { + return Framework.nativeIsGuidesLayerEnabled(); + } + + private void registerListener() + { + nativeAddListener(mListener); + } + + public void setEnabled(boolean isEnabled) + { + if (isEnabled == isEnabled()) + return; + + Framework.nativeSetGuidesLayerEnabled(isEnabled); + } + + public void toggle() + { + setEnabled(!isEnabled()); + } + + @Override + public void initialize(@Nullable Void param) + { + registerListener(); + } + + @Override + public void destroy() + { + } + + @NonNull + public static GuidesManager from(@NonNull Context context) + { + MwmApplication app = (MwmApplication) context.getApplicationContext(); + return app.getGuidesManager(); + } + + private static native void nativeAddListener(@NonNull OnGuidesChangedListener listener); +} diff --git a/android/src/com/mapswithme/maps/maplayer/guides/GuidesState.java b/android/src/com/mapswithme/maps/maplayer/guides/GuidesState.java new file mode 100644 index 0000000000..7fdf97c37d --- /dev/null +++ b/android/src/com/mapswithme/maps/maplayer/guides/GuidesState.java @@ -0,0 +1,19 @@ +package com.mapswithme.maps.maplayer.guides; + +import android.content.Context; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import com.mapswithme.maps.R; + +public enum GuidesState +{ + DISABLED, + ENABLED, + NO_DATA, + NETWORK_ERROR; + + public void activate(@NonNull Context context) + { + } +} diff --git a/android/src/com/mapswithme/maps/maplayer/guides/OnGuidesChangedListener.java b/android/src/com/mapswithme/maps/maplayer/guides/OnGuidesChangedListener.java new file mode 100644 index 0000000000..fc93b507bf --- /dev/null +++ b/android/src/com/mapswithme/maps/maplayer/guides/OnGuidesChangedListener.java @@ -0,0 +1,6 @@ +package com.mapswithme.maps.maplayer.guides; + +public interface OnGuidesChangedListener +{ + void onStateChanged(int index); +} diff --git a/map/framework.cpp b/map/framework.cpp index d1c3d3021a..6b05601176 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -3031,9 +3031,9 @@ bool Framework::LoadGuidesEnabled() return enabled; } -void Framework::SaveGuidesEnabled(bool guidesEnabled) +void Framework::SaveGuidesEnabled(bool enabled) { - settings::Set(kGuidesEnabledKey, guidesEnabled); + settings::Set(kGuidesEnabledKey, enabled); } void Framework::EnableChoosePositionMode(bool enable, bool enableBounds, bool applyPosition, diff --git a/map/framework.hpp b/map/framework.hpp index b957ed5b88..f6f3a065c3 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -787,7 +787,7 @@ public: void SaveIsolonesEnabled(bool enabled); bool LoadGuidesEnabled(); - void SaveGuidesEnabled(bool trafficEnabled); + void SaveGuidesEnabled(bool enabled); dp::ApiVersion LoadPreferredGraphicsAPI(); void SavePreferredGraphicsAPI(dp::ApiVersion apiVersion);