diff --git a/android/app/src/main/cpp/app/organicmaps/util/Config.cpp b/android/app/src/main/cpp/app/organicmaps/util/Config.cpp
index 3794f7434..c934152b6 100644
--- a/android/app/src/main/cpp/app/organicmaps/util/Config.cpp
+++ b/android/app/src/main/cpp/app/organicmaps/util/Config.cpp
@@ -123,4 +123,33 @@ extern "C"
frm()->SaveTransliteration(value);
frm()->AllowTransliteration(value);
}
+
+ JNIEXPORT jboolean JNICALL
+ Java_app_organicmaps_util_Config_nativeGetTrafficHttpEnabled(JNIEnv * env, jclass thiz)
+ {
+ return frm()->LoadTrafficHttpEnabled();
+ }
+
+ JNIEXPORT void JNICALL
+ Java_app_organicmaps_util_Config_nativeSetTrafficHttpEnabled(JNIEnv * env, jclass thiz,
+ jboolean value)
+ {
+ frm()->SaveTrafficHttpEnabled(value);
+ frm()->SetTrafficHttpEnabled(value);
+ }
+
+ JNIEXPORT jstring JNICALL
+ Java_app_organicmaps_util_Config_nativeGetTrafficHttpUrl(JNIEnv * env, jclass thiz)
+ {
+ std::string value = frm()->LoadTrafficHttpUrl();
+ return jni::ToJavaString(env, value);
+ }
+
+ JNIEXPORT void JNICALL
+ Java_app_organicmaps_util_Config_nativeSetTrafficHttpUrl(JNIEnv * env, jclass thiz,
+ jstring value)
+ {
+ frm()->SaveTrafficHttpUrl(jni::ToNativeString(env, value));
+ frm()->SetTrafficHttpUrl(jni::ToNativeString(env, value));
+ }
} // extern "C"
diff --git a/android/app/src/main/java/app/organicmaps/maplayer/LayersUtils.java b/android/app/src/main/java/app/organicmaps/maplayer/LayersUtils.java
index ad022fd86..21aca4c7f 100644
--- a/android/app/src/main/java/app/organicmaps/maplayer/LayersUtils.java
+++ b/android/app/src/main/java/app/organicmaps/maplayer/LayersUtils.java
@@ -11,6 +11,7 @@ public class LayersUtils
availableLayers.add(Mode.OUTDOORS);
availableLayers.add(Mode.ISOLINES);
availableLayers.add(Mode.SUBWAY);
+ availableLayers.add(Mode.TRAFFIC);
return availableLayers;
}
}
diff --git a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java
index 5286c26d1..edb1a5eff 100644
--- a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java
+++ b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java
@@ -9,6 +9,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
+import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -57,6 +58,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
initAutoDownloadPrefsCallbacks();
initLargeFontSizePrefsCallbacks();
initTransliterationPrefsCallbacks();
+ initTrafficHttpEnabledPrefsCallbacks();
+ initTrafficHttpUrlPrefsCallbacks();
init3dModePrefsCallbacks();
initPerspectivePrefsCallbacks();
initAutoZoomPrefsCallbacks();
@@ -84,6 +87,16 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
pref.setSummary(locale.getDisplayLanguage());
}
+ private void updateTrafficHttpUrlSummary()
+ {
+ final Preference pref = getPreference(getString(R.string.pref_traffic_http_url));
+ String summary = Config.getTrafficHttpUrl();
+ if (summary.length() == 0)
+ pref.setSummary(R.string.traffic_http_url_not_set);
+ else
+ pref.setSummary(summary);
+ }
+
private void updateRoutingSettingsPrefsSummary()
{
final Preference pref = getPreference(getString(R.string.prefs_routing));
@@ -111,6 +124,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
updateVoiceInstructionsPrefsSummary();
updateRoutingSettingsPrefsSummary();
updateMapLanguageCodeSummary();
+ updateTrafficHttpUrlSummary();
}
@Override
@@ -170,6 +184,36 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
});
}
+ private void initTrafficHttpEnabledPrefsCallbacks()
+ {
+ final Preference pref = getPreference(getString(R.string.pref_traffic_http_enabled));
+
+ ((TwoStatePreference)pref).setChecked(Config.getTrafficHttpEnabled());
+ pref.setOnPreferenceChangeListener((preference, newValue) -> {
+ final boolean oldVal = Config.getTrafficHttpEnabled();
+ final boolean newVal = (Boolean) newValue;
+ if (oldVal != newVal)
+ Config.setTrafficHttpEnabled(newVal);
+
+ return true;
+ });
+ }
+
+ private void initTrafficHttpUrlPrefsCallbacks()
+ {
+ final Preference pref = getPreference(getString(R.string.pref_traffic_http_url));
+
+ ((EditTextPreference)pref).setText(Config.getTrafficHttpUrl());
+ pref.setOnPreferenceChangeListener((preference, newValue) -> {
+ final String oldVal = Config.getTrafficHttpUrl();
+ final String newVal = (String) newValue;
+ if (!oldVal.equals(newVal))
+ Config.setTrafficHttpUrl(newVal);
+
+ return true;
+ });
+ }
+
private void initUseMobileDataPrefsCallbacks()
{
final ListPreference mobilePref = getPreference(getString(R.string.pref_use_mobile_data));
diff --git a/android/app/src/main/java/app/organicmaps/util/Config.java b/android/app/src/main/java/app/organicmaps/util/Config.java
index 2f9cdbf88..908ecc7e8 100644
--- a/android/app/src/main/java/app/organicmaps/util/Config.java
+++ b/android/app/src/main/java/app/organicmaps/util/Config.java
@@ -354,6 +354,26 @@ public final class Config
nativeSetTransliteration(value);
}
+ public static boolean getTrafficHttpEnabled()
+ {
+ return nativeGetTrafficHttpEnabled();
+ }
+
+ public static void setTrafficHttpEnabled(boolean value)
+ {
+ nativeSetTrafficHttpEnabled(value);
+ }
+
+ public static String getTrafficHttpUrl()
+ {
+ return nativeGetTrafficHttpUrl();
+ }
+
+ public static void setTrafficHttpUrl(String value)
+ {
+ nativeSetTrafficHttpUrl(value);
+ }
+
public static boolean isNY()
{
return getBool("NY");
@@ -507,4 +527,8 @@ public final class Config
private static native void nativeSetLargeFontsSize(boolean value);
private static native boolean nativeGetTransliteration();
private static native void nativeSetTransliteration(boolean value);
+ private static native boolean nativeGetTrafficHttpEnabled();
+ private static native void nativeSetTrafficHttpEnabled(boolean value);
+ private static native String nativeGetTrafficHttpUrl();
+ private static native void nativeSetTrafficHttpUrl(String value);
}
diff --git a/android/app/src/main/res/values/donottranslate.xml b/android/app/src/main/res/values/donottranslate.xml
index 976c1ecd7..ca0b7d69d 100644
--- a/android/app/src/main/res/values/donottranslate.xml
+++ b/android/app/src/main/res/values/donottranslate.xml
@@ -36,6 +36,8 @@
GeneralSettings
Navigation
Information
+ TrafficHttpEnabled
+ TrafficHttpUrl
Transliteration
PowerManagment
KeepScreenOn
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 36eb21197..b4da42ecc 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -833,6 +833,14 @@
When enabled, the app will work on the lockscreen even when the device is locked.
Map language
+
+ Enable live traffic data
+
+ When enabled, the app will periodically retrieve traffic information from the configured URL.
+
+ Traffic service URL
+
+ Not set
Map data from OpenStreetMap
diff --git a/android/app/src/main/res/xml/prefs_main.xml b/android/app/src/main/res/xml/prefs_main.xml
index 3ce113a9f..507e2f078 100644
--- a/android/app/src/main/res/xml/prefs_main.xml
+++ b/android/app/src/main/res/xml/prefs_main.xml
@@ -106,6 +106,18 @@
app:singleLineTitle="false"
android:persistent="false"
android:order="18"/>
+
+