diff --git a/OsmAnd-java/src/main/java/net/osmand/data/Building.java b/OsmAnd-java/src/main/java/net/osmand/data/Building.java index 0adacd411a..5e16f755fc 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/Building.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/Building.java @@ -182,10 +182,10 @@ public class Building extends MapObject { @Override public String toString() { - if(interpolationInterval !=0){ - return name+"-"+name2 +" (+"+interpolationInterval+") "; - } else if(interpolationType != null) { - return name+"-"+name2 +" ("+interpolationType+") "; + if (interpolationInterval != 0) { + return name + "-" + name2 + " (+" + interpolationInterval + ") "; + } else if (interpolationType != null) { + return name + "-" + name2 + " (" + interpolationType + ") "; } return name; } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index df8c2bd5be..37c16393fa 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -1004,17 +1004,12 @@ public class SearchUICore { String subType2 = a2.getSubType() == null ? "" : a2.getSubType(); int cmp = 0; - - if (FILTER_DUPLICATE_POI_SUBTYPE.contains(subType1)) { - cmp = 1; - } else if (FILTER_DUPLICATE_POI_SUBTYPE.contains(subType2)) { - cmp = -1; - } - - if (cmp != 0) { - return cmp; + boolean subtypeFilter1 = FILTER_DUPLICATE_POI_SUBTYPE.contains(subType1); + boolean subtypeFilter2 = FILTER_DUPLICATE_POI_SUBTYPE.contains(subType2); + if (subtypeFilter1 != subtypeFilter2) { + // to filter second + return subtypeFilter1 ? 1 : -1; } - cmp = c.collator.compare(type1, type2); if (cmp != 0) { return cmp; diff --git a/OsmAnd/AndroidManifest-free.xml b/OsmAnd/AndroidManifest-gplayFree.xml similarity index 100% rename from OsmAnd/AndroidManifest-free.xml rename to OsmAnd/AndroidManifest-gplayFree.xml diff --git a/OsmAnd/AndroidManifest-freehuawei.xml b/OsmAnd/AndroidManifest-huawei.xml similarity index 100% rename from OsmAnd/AndroidManifest-freehuawei.xml rename to OsmAnd/AndroidManifest-huawei.xml diff --git a/OsmAnd/AndroidManifest-freedev.xml b/OsmAnd/AndroidManifest-nightlyFree.xml similarity index 93% rename from OsmAnd/AndroidManifest-freedev.xml rename to OsmAnd/AndroidManifest-nightlyFree.xml index 09ecf8a880..6ec6d5a12e 100644 --- a/OsmAnd/AndroidManifest-freedev.xml +++ b/OsmAnd/AndroidManifest-nightlyFree.xml @@ -10,7 +10,7 @@ android:value="fb792288460976727"/> [^<]*<", ">" + "" + "<") - } - return line; -} - task updateNoTranslate(type: Copy) { from('.') { include 'no_translate.xml' @@ -130,7 +127,7 @@ task validateTranslate { line.contains("1\$ ") || line.contains("2\$ ") || line.contains("3\$ ") || line.contains("%1s") || line.contains(" 1\$s") || (line.contains("% \$") || line.contains("% 1") || line.contains("% 2") || - line.contains("% 3") || line.contains("% s"))) { + line.contains("% 3") || line.contains("% s"))) { throw new GradleException("Incorrect translation " + it.getAbsolutePath() + " " + line); } } @@ -151,7 +148,7 @@ task collectVoiceAssets(type: Sync) { } task cleanNoTranslate(type: Delete) { - delete('res/values/no_translate.xml') + delete('res/values/no_translate.xml') } task collectFonts(type: Copy) { @@ -180,7 +177,7 @@ task collectHelpContentsAssets(type: Copy) { include "*.html" } from("../../help/website/blog_articles") { - include "osmand-3-8-released.html" + include "osmand-3-9-released.html" } into "assets/feature_articles" } @@ -277,8 +274,6 @@ task collectExternalResources { // Legacy core build import org.apache.tools.ant.taskdefs.condition.Os -import java.util.regex.Pattern - task buildOsmAndCore(type: Exec) { Gradle gradle = getGradle() String tskReqStr = gradle.getStartParameter().getTaskRequests().toString().toLowerCase() @@ -297,7 +292,7 @@ task buildOsmAndCore(type: Exec) { flavour = flavour.length() == 0 ? "X86_ONLY" : "" } } - + description "Build Legacy OsmAndCore" if (!Os.isFamily(Os.FAMILY_WINDOWS)) { @@ -325,38 +320,11 @@ task cleanupDuplicatesInCore() { } } -afterEvaluate { - android.libraryVariants.all { variant -> - variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore) - } -} - task appStart(type: Exec) { - // linux + // linux commandLine 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' // windows - // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' -} - -project.afterEvaluate { - publishing { - repositories { - ivy { - url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./" - version = "0.1-SNAPSHOT" - } - } - publications { - aar(IvyPublication) { - artifact bundleLegacyFatDebugAar { - classifier 'debug' - } - artifact bundleLegacyFatReleaseAar { - classifier 'release' - } - } - } - } + // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' } dependencies { @@ -369,7 +337,7 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.preference:preference:1.1.0' - implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') + implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') implementation group: 'commons-logging', name: 'commons-logging', version: '1.2' implementation 'commons-codec:commons-codec:1.11' @@ -387,29 +355,21 @@ dependencies { // JS core implementation group: 'org.mozilla', name: 'rhino', version: '1.7.9' // size restrictions -// implementation 'com.ibm.icu:icu4j:50.1' +// implementation 'com.ibm.icu:icu4j:50.1' // implementation 'net.sf.trove4j:trove4j:3.0.3' -// qtcoreImplementation fileTree(include: ['QtAndroid.jar', 'QtAndroidBearer.jar'], dir: 'libs') -// qtcoredebugImplementation fileTree(include: ['QtAndroid.jar', 'QtAndroidBearer.jar'], dir: 'libs') - legacyImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@jar" -// qtcoredebugImplementation "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" -// qtcoredebugImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" -// qtcoreImplementation "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" -// qtcoreImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" - implementation ("com.getkeepsafe.taptargetview:taptargetview:1.12.0"){ + + implementation("com.getkeepsafe.taptargetview:taptargetview:1.12.0") { exclude group: 'com.android.support' } implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1' - implementation ("com.github.HITGIF:TextFieldBoxes:1.4.5"){ + implementation("com.github.HITGIF:TextFieldBoxes:1.4.5") { exclude group: 'com.android.support' } - implementation('com.github.scribejava:scribejava-apis:7.1.1'){ + implementation('com.github.scribejava:scribejava-apis:7.1.1') { exclude group: "com.fasterxml.jackson.core" } implementation 'com.jaredrummler:colorpicker:1.1.0' implementation 'org.bouncycastle:bcpkix-jdk15on:1.56' - - implementation 'com.google.android.gms:play-services-location:17.1.0' -} +} \ No newline at end of file diff --git a/OsmAnd/build-library.gradle b/OsmAnd/build-library.gradle new file mode 100644 index 0000000000..b8cf0a21a5 --- /dev/null +++ b/OsmAnd/build-library.gradle @@ -0,0 +1,64 @@ +apply plugin: 'com.android.library' +apply plugin: 'ivy-publish' +apply from: 'build-common.gradle' + +android { + + defaultConfig { + minSdkVersion 15 + } + + lintOptions { + tasks.lint.enabled = false + } + + sourceSets { + main { + manifest.srcFile "AndroidManifest-library.xml" + java.srcDirs = ["src", "src-gms", "src-google"] + } + } + + productFlavors { + // CoreVersion + // Build that doesn't include 3D OpenGL + legacy { + dimension "coreversion" + } + } +} + +def replaceNoTranslate(line) { + return line; +} + +afterEvaluate { + android.libraryVariants.all { variant -> + variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore) + } +} + +project.afterEvaluate { + publishing { + repositories { + ivy { + url = System.getenv("OSMAND_BINARIES_IVY_ROOT") ?: "./" + version = "0.1-SNAPSHOT" + } + } + publications { + aar(IvyPublication) { + artifact bundleLegacyFatDebugAar { + classifier 'debug' + } + artifact bundleLegacyFatReleaseAar { + classifier 'release' + } + } + } + } +} + +dependencies { + implementation 'com.google.android.gms:play-services-location:17.1.0' +} diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index 9f909d50c8..ffaa03af01 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' +apply from: 'build-common.gradle' // Global Parameters accepted // TARGET_APP_NAME - app name // APK_NUMBER_VERSION - version number of apk // APK_VERSION_SUFFIX - build number like #99999Z, appended (for dev builds) to Manifest's versionName as X.X.X#99999Z -// Z means flavor: M=-master, D=-main-default, B=-Blackberry, Des=-design, MQA=-main-qt-arm, MQDA=-main-qt-default-arm, S=-sherpafy +// Z means flavor: M=-master, D=-main-default, Des=-design, MQA=-main-qt-arm, MQDA=-main-qt-default-arm, S=-sherpafy // APP_EDITION - date stamp of builds -// APP_FEATURES - features +play_market +gps_status -parking_plugin -blackberry -free_version -amazon // 1. To be done Filter fonts // @@ -17,15 +17,7 @@ apply plugin: 'com.android.application' // // Less important -task printc { - configurations.each { if(it.isCanBeResolved()) println it.name } -} - android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" - // compileNdkVersion "android-ndk-r17b" - signingConfigs { development { storeFile file("../keystores/debug.keystore") @@ -44,21 +36,15 @@ android { defaultConfig { minSdkVersion System.getenv("MIN_SDK_VERSION") ? System.getenv("MIN_SDK_VERSION").toInteger() : 15 - targetSdkVersion 29 versionCode 390 versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode - multiDexEnabled true versionName "3.9.0" versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName - // Stops the Gradle plugin’s automatic rasterization of vectors - // vectorDrawables.generatedDensities = ['hdpi'] - vectorDrawables.useSupportLibrary = true } lintOptions { lintConfig file("lint.xml") - abortOnError false warningsAsErrors false } @@ -79,55 +65,33 @@ android { // exclude '/META-INF/NOTICE.md' //} - // This is from OsmAndCore_android.aar - for some reason it's not inherited - aaptOptions { - // Don't compress any embedded resources - noCompress "qz" - cruncherEnabled = false - // Flag notifies aapt to keep the attribute IDs around - // additionalParameters "--no-version-vectors" - } - - dexOptions { - javaMaxHeapSize "4g" - } - sourceSets { - main { - manifest.srcFile "AndroidManifest.xml" - jni.srcDirs = [] - jniLibs.srcDirs = ["libs"] - aidl.srcDirs = ["src"] - java.srcDirs = ["src"] - resources.srcDirs = ["src"] - renderscript.srcDirs = ["src"] - res.srcDirs = ["res"] - assets.srcDirs = ["assets"] - } debug { manifest.srcFile "AndroidManifest-debug.xml" } - full { + androidFull { java.srcDirs = ["src-nogms", "src-google"] } - fullGms { + gplayFull { java.srcDirs = ["src-gms", "src-google"] } - free { - java.srcDirs = ["src-nogms", "src-google"] - manifest.srcFile "AndroidManifest-free.xml" - } - freeGms { + gplayFree { java.srcDirs = ["src-gms", "src-google"] - manifest.srcFile "AndroidManifest-free.xml" + manifest.srcFile "AndroidManifest-gplayFree.xml" } - freedev { + nightlyFree { java.srcDirs = ["src-nogms", "src-google"] - manifest.srcFile "AndroidManifest-freedev.xml" + manifest.srcFile "AndroidManifest-nightlyFree.xml" } - freehuawei { + amazonFree { java.srcDirs = ["src-nogms", "src-google"] - manifest.srcFile "AndroidManifest-freehuawei.xml" + } + amazonFull { + java.srcDirs = ["src-nogms", "src-google"] + } + huawei { + java.srcDirs = ["src-nogms", "src-google"] + manifest.srcFile "AndroidManifest-huawei.xml" } legacy { @@ -137,75 +101,43 @@ android { flavorDimensions "version", "coreversion", "abi" productFlavors { - // ABI - armv7 { - dimension "abi" - ndk { - abiFilter 'armeabi-v7a' - } - } - arm64 { - dimension "abi" - ndk { - abiFilter 'arm64-v8a' - } - } - x86 { - dimension "abi" - ndk { - abiFilters 'x86', 'x86_64' - } - } - armonly { - dimension "abi" - ndk { - abiFilters 'arm64-v8a', 'armeabi-v7a' - } - } - fat { - dimension "abi" - ndk { - abiFilters 'arm64-v8a', 'x86', 'x86_64', 'armeabi-v7a' - } - } - // Version - freedev { + nightlyFree { dimension "version" applicationId "net.osmand.dev" // resConfig "en" } - free { - dimension "version" - applicationId "net.osmand" - } - freeGms { - dimension "version" - applicationId "net.osmand" - } - full { + androidFull { dimension "version" applicationId "net.osmand.plus" } - fullGms { + gplayFree { + dimension "version" + applicationId "net.osmand" + } + gplayFull { dimension "version" applicationId "net.osmand.plus" } - freehuawei { + amazonFree { + dimension "version" + applicationId "net.osmand" + } + amazonFull { + dimension "version" + applicationId "net.osmand.plus" + } + huawei { dimension "version" applicationId "net.osmand.huawei" } - // CoreVersion - // Build that doesn't include 3D OpenGL - legacy { - dimension "coreversion" - } + // Build that includes 3D OpenGL release - qtcore { + opengl { dimension "coreversion" } // Build that includes 3D OpenGL debug - qtcoredebug { + opengldebug { dimension "coreversion" } } @@ -234,226 +166,9 @@ def replaceNoTranslate(line) { if (line.contains("\"app_edition\"") && System.getenv("APP_EDITION")) { return line.replaceAll(">[^<]*<", ">" + System.getenv("APP_EDITION") + "<") } - if (line.contains("\"versionFeatures\"") && System.getenv("APP_FEATURES")) { - return line.replaceAll(">[^<]*<", ">" + System.getenv("APP_FEATURES") + "<") - } return line; } -task updateNoTranslate(type: Copy) { - from('.') { - include 'no_translate.xml' - filter { - line -> replaceNoTranslate(line); - } - } - into 'res/values/' -} - -task validateTranslate { - println "Validating translations" - - file("res").eachFileRecurse groovy.io.FileType.FILES, { - if (it.name == "strings.xml" || it.name == "phrases.xml") { - it.eachLine { line -> - if (line.contains("\$ s") || line.contains("\$ d") || line.contains("\$ f") || - line.contains(" \$s") || line.contains(" \$d") || line.contains(" \$f") || - line.contains("1\$ ") || line.contains("2\$ ") || line.contains("3\$ ") || - line.contains("%1s") || line.contains(" 1\$s") || - (line.contains("% \$") || line.contains("% 1") || line.contains("% 2") || - line.contains("% 3") || line.contains("% s"))) { - throw new GradleException("Incorrect translation " + it.getAbsolutePath() + " " + line); - } - } - } - } -} - -task downloadWorldMiniBasemap { - doLast { - ant.get(src: 'http://builder.osmand.net/basemap/World_basemap_mini_2.obf', dest: 'assets/World_basemap_mini.obf', skipexisting: 'true') - } -} - -task collectVoiceAssets(type: Sync) { - from "../../resources/voice" - into "assets/voice" - include "**/*.js" -} - -task cleanNoTranslate(type: Delete) { - delete('res/values/no_translate.xml') -} - -task collectFonts(type: Copy) { - from "../../resources/fonts" - from "../../resources/rendering_styles/fonts" -// from "../../resources/rendering_styles/fonts/OpenSans" - into "assets/fonts" - include "*.ttf" -} - -task collectHelpContentsStyle(type: Copy) { - from("../../help/website/help/") { - include "style.css" - } - into "assets" -} - -task collectHelpContentsAssets(type: Copy) { - from("../../help/website/help") { - include "about.html" - include "changes.html" - include "faq.html" - include "map-legend.html" - } - from("../../help/website/feature_articles") { - include "*.html" - } - from("../../help/website/blog_articles") { - include "osmand-3-9-released.html" - } - into "assets/feature_articles" -} - -task copyPoiCategories(type: Copy) { - from("../../resources/poi") { - include "poi_categories.json" - } - into "assets" -} - -task copyMapShaderIcons(type: Sync) { - // from "../../resources/rendering_styles/style-icons/map-shaders-png" - // into "res/" - from "../../resources/rendering_styles/style-icons/map-shaders-vector" - into "res/drawable" - include "**/*.png", "**/*.xml" - preserve { - include '**/*' - exclude "**/h_*" - } -} - -task copyMapPOIIcons(type: Sync) { - from "../../resources/rendering_styles/style-icons/map-icons-vector" - into "res/drawable/" - // from "../../resources/rendering_styles/style-icons/map-icons-png" - // into "res/" - - include "**/*.png", "**/*.xml" - preserve { - include '**/*' - exclude "**/mm_*" - } -} - -task copyLargePOIIcons(type: Sync) { - from "../../resources/rendering_styles/style-icons/poi-icons-vector" - into "res/drawable/" - include "**/*.png", "**/*.xml" - preserve { - include '**/*' - exclude "**/mx_*" - } -} - -task copyWidgetIconsXhdpi(type: Sync) { - from "res/drawable-xxhdpi/" - into "res/drawable-large-xhdpi/" - include "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png" - preserve { - include '*' - exclude "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png" - } -} - -task copyWidgetIconsHdpi(type: Sync) { - from "res/drawable-xhdpi/" - into "res/drawable-large-hdpi/" - include "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png" - preserve { - include '*' - exclude "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png" - } -} - -task copyWidgetIcons(type: Sync) { - from "res/drawable-hdpi/" - into "res/drawable-large/" - include "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png" - preserve { - include '*' - exclude "**/widget_*.png", "**/widget_*.xml", "**/map_*.xml", "**/map_*.png" - } -} - -task collectExternalResources { - dependsOn collectVoiceAssets, - collectFonts, - collectHelpContentsAssets, - collectHelpContentsStyle, - copyMapShaderIcons, - copyMapPOIIcons, - copyLargePOIIcons, - updateNoTranslate, - validateTranslate, - copyWidgetIcons, - copyWidgetIconsHdpi, - copyWidgetIconsXhdpi, - copyPoiCategories, - downloadWorldMiniBasemap -} - -// Legacy core build -import org.apache.tools.ant.taskdefs.condition.Os - -task buildOsmAndCore(type: Exec) { - Gradle gradle = getGradle() - String tskReqStr = gradle.getStartParameter().getTaskRequests().toString().toLowerCase() - String flavour = ""; - if(!tskReqStr.contains("fat")) { - if(tskReqStr.contains("arm64")) { - flavour = flavour.length() == 0 ? "ARM64_ONLY" : "" - } - if(tskReqStr.contains("armv7")) { - flavour = flavour.length() == 0 ? "ARMV7_ONLY" : "" - } - if(tskReqStr.contains("armonly")) { - flavour = flavour.length() == 0 ? "ARM_ONLY" : "" - } - if(tskReqStr.contains("x86")) { - flavour = flavour.length() == 0 ? "X86_ONLY" : "" - } - } - - description "Build Legacy OsmAndCore" - - if (!Os.isFamily(Os.FAMILY_WINDOWS)) { - if(flavour.length() > 0) { - environment "$flavour", "1" - } - commandLine "bash", file("./old-ndk-build.sh").getAbsolutePath() - } else { - commandLine "cmd", "/c", "echo", "Not supported" - } -} - -task cleanupDuplicatesInCore() { - dependsOn buildOsmAndCore - // doesn't work for legacy debug builds - doLast { - file("libc++/armeabi-v7a").mkdirs() - file("libs/armeabi-v7a/libc++_shared.so").renameTo(file("libc++/armeabi-v7a/libc++_shared.so")) - file("libc++/arm64-v8a").mkdirs() - file("libs/arm64-v8a/libc++_shared.so").renameTo(file("libc++/arm64-v8a/libc++_shared.so")) - file("libc++/x86").mkdirs() - file("libs/x86/libc++_shared.so").renameTo(file("libc++/x86/libc++_shared.so")) - file("libc++/x86_64").mkdirs() - file("libs/x86_64/libc++_shared.so").renameTo(file("libc++/x86_64/libc++_shared.so")) - } -} - afterEvaluate { android.applicationVariants.all { variant -> variant.javaCompiler.dependsOn(collectExternalResources, buildOsmAndCore, cleanupDuplicatesInCore) @@ -465,52 +180,14 @@ afterEvaluate { } } -task appStart(type: Exec) { - // linux - commandLine 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' - // windows - // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'net.osmand.plus/net.osmand.plus.activities.MapActivity' -} - dependencies { - implementation project(path: ':OsmAnd-java', configuration: 'android') - implementation project(':OsmAnd-api') - implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.gridlayout:gridlayout:1.0.0' - implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.2.1' - implementation 'androidx.browser:browser:1.0.0' - implementation 'androidx.preference:preference:1.1.0' - implementation fileTree(include: ['gnu-trove-osmand.jar', 'icu4j-49_1_patched.jar'], dir: 'libs') + openglImplementation fileTree(include: ['QtAndroid.jar', 'QtAndroidBearer.jar'], dir: 'libs') + opengldebugImplementation fileTree(include: ['QtAndroid.jar', 'QtAndroidBearer.jar'], dir: 'libs') - implementation group: 'commons-logging', name: 'commons-logging', version: '1.2' - implementation 'commons-codec:commons-codec:1.11' - implementation 'it.unibo.alice.tuprolog:tuprolog:3.2.1' - implementation 'org.apache.commons:commons-compress:1.17' - implementation 'com.moparisthebest:junidecode:0.1.1' - implementation 'org.immutables:gson:2.5.0' - implementation 'com.vividsolutions:jts-core:1.14.0' - implementation 'com.google.openlocationcode:openlocationcode:1.0.4' - implementation 'com.android.billingclient:billing:2.0.3' - // turn off for now - //implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0' - implementation 'com.squareup.picasso:picasso:2.71828' - implementation 'me.zhanghai.android.materialprogressbar:library:1.4.2' - // JS core - implementation group: 'org.mozilla', name: 'rhino', version: '1.7.9' -// size restrictions -// implementation 'com.ibm.icu:icu4j:50.1' -// implementation 'net.sf.trove4j:trove4j:3.0.3' - - qtcoreImplementation fileTree(include: ['QtAndroid.jar', 'QtAndroidBearer.jar'], dir: 'libs') - qtcoredebugImplementation fileTree(include: ['QtAndroid.jar', 'QtAndroidBearer.jar'], dir: 'libs') - - legacyImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@jar" - qtcoredebugImplementation "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" - qtcoredebugImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" - qtcoreImplementation "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" - qtcoreImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" + opengldebugImplementation "net.osmand:OsmAndCore_androidNativeDebug:0.1-SNAPSHOT@aar" + opengldebugImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" + openglImplementation "net.osmand:OsmAndCore_androidNativeRelease:0.1-SNAPSHOT@aar" + openglImplementation "net.osmand:OsmAndCore_android:0.1-SNAPSHOT@aar" implementation ("com.getkeepsafe.taptargetview:taptargetview:1.12.0"){ exclude group: 'com.android.support' } @@ -524,8 +201,8 @@ dependencies { implementation 'com.jaredrummler:colorpicker:1.1.0' implementation "org.bouncycastle:bcpkix-jdk15on:1.56" - freehuaweiImplementation 'com.huawei.hms:iap:5.0.2.300' + huaweiImplementation 'com.huawei.hms:iap:5.0.2.300' - freeGmsImplementation 'com.google.android.gms:play-services-location:17.1.0' - fullGmsImplementation 'com.google.android.gms:play-services-location:17.1.0' + gplayFreeImplementation 'com.google.android.gms:play-services-location:17.1.0' + gplayFullImplementation 'com.google.android.gms:play-services-location:17.1.0' } diff --git a/OsmAnd/no_translate.xml b/OsmAnd/no_translate.xml index 20d7a424ca..d8e4108d4a 100644 --- a/OsmAnd/no_translate.xml +++ b/OsmAnd/no_translate.xml @@ -12,7 +12,6 @@ UA-28342846-2 10 true - +play_market -amazon -blackberry © OpenStreetMap support@osmand.net diff --git a/OsmAnd/res/drawable/ic_action_arrow_down_16.xml b/OsmAnd/res/drawable/ic_action_arrow_down_16.xml new file mode 100644 index 0000000000..ce235325ff --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_arrow_down_16.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/drawable/ic_action_arrow_up_16.xml b/OsmAnd/res/drawable/ic_action_arrow_up_16.xml new file mode 100644 index 0000000000..b0e16b0095 --- /dev/null +++ b/OsmAnd/res/drawable/ic_action_arrow_up_16.xml @@ -0,0 +1,9 @@ + + + diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 4a9fde833f..9bd65acc41 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -4030,4 +4030,9 @@ تحديد مجلد تحديد مجلد أو إضافة واحد جديد فارغ + التحليل حسب الفواصل الزمنية (الفاصل الزمني) + رفع إلى خريطة الشارع المفتوح + تحرير المسار + تسمية المسار + تغيير المجلد \ No newline at end of file diff --git a/OsmAnd/res/values-cs/strings.xml b/OsmAnd/res/values-cs/strings.xml index 6d6b906b06..6f001d5965 100644 --- a/OsmAnd/res/values-cs/strings.xml +++ b/OsmAnd/res/values-cs/strings.xml @@ -3967,4 +3967,9 @@ Zvolte složku Zvolte složku nebo vytvořte novou Prázdné + Analyzovat podle intervalů (rozdělit interval) + Nahrát do OpenStreetMap + Editovat stopu + Přejmenovat stopu + Změnit složku \ No newline at end of file diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index b216a47c7c..494ad991ff 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3972,4 +3972,9 @@ Ordner auswählen Ordner auswählen oder neuen hinzufügen Leer + Nach Intervallen auswerten (geteiltes Intervall) + Hochladen zu OpenStreetMap + Track editieren + Track umbenennen + Ordner ändern \ No newline at end of file diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 9671d14e5f..db0a01c2ab 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -233,7 +233,7 @@ Registrado de kurso Navigi Labori fone - Vek-intervalo de GPS + Vek-ofteco de GPS Informoj pri ŝatataj Ĉesigi simuladon de pozicio. Simuli vian pozicion uzante komputitan kurson aŭ registritan GPX-spuron. @@ -587,17 +587,17 @@ Ĉu ĉesigi GPS-an fonan reĝimon? Ĉesigi Demandi ĉiam - Ĝenerala registrada intervalo - GPS-a vekintervalo + Ĝenerala intertempo de registrado + Vek-ofteco de GPS Aktivigi GPS-an fonan reĝimon Registri spuron laŭpete Ĝeneralan registradon de pozicio al GPX‑dosiero oni povas (mal)aktivigi per la GPX‑registrada fenestraĵo sur la map‑ekrano. Konservi aktualan spuron kiel GPX-dosieron. Konservi aktualan spuron GPX-spuro estas aŭtomate konservata al dosierujo de spuroj dum navigado. - Registrada intervalo - Registrada intervalo dum navigado - Elekti intervalon por registri spurojn dum navigado + Intertempo de registrado + Registrada intertempo dum navigado + Elekti oftecon de registri spuron dum navigado Elekti gvidadan voĉon por navigado. Gvidada voĉo Aktivigi HTTP-retperanton @@ -654,7 +654,7 @@ Trovis nenion. Se vi ne povas trovi vian regionon, vi povas fari ĝin mem (rigardu https://osmand.net). Unue elektu GPX‑dosieron per frapetadi. Elektu kurson - Divid-intervalo + Intertempo de divido Ordigi laŭ distanco Ordigi laŭ nomo Turisma map-vido @@ -728,8 +728,8 @@ Mezuma rapido: %1$s Maksimuma rapido: %1$s Mezuma altitudo: %1$s - Altituda intervalo: %1$s - Tempa intervalo: %1$s + Variejo de altitudo: %1$s + Variejo de tempo: %1$s Desupro/alsupro: %1$s Tempo movante: %1$s Segmento @@ -1121,7 +1121,7 @@ Ekrano ŝlosita Kurs-mapeto Rapid-kontroliloj - Agordi vekintervalon: + Agordi vek‑oftecon: Trafikaj avertoj Sen pagendaj vojoj Ĉu pluigi sekvi la antaŭan nefinitan kurson? (%1$s sekundoj) @@ -1291,8 +1291,8 @@ Neunutempa (nesinkrona) redakto de OSM: OSM-interesejoj/rimarkoj konservitaj en aparato Vidi kaj administri loke konservitajn OSM‑interesejojn/rimarkojn. - Intervalo de enreta kurs-registrado - Difini intervalon de enreta kurs-registrado. + Ofteco de enreta kursregistrado + Difini oftecon de enreta registrado de kurso. Adreso de enreta kurs-registrado Difini la retadreson uzante la jenajn argumentojn: \n lat={0} (latitudo), @@ -2172,7 +2172,7 @@ Kursa altitudo Malsupreniro Supreniro - Altituda intervalo + Variejo de altitudo Mezuma altitudo Tempo Tuta distanco @@ -3810,7 +3810,7 @@ \n \n Registri - Elektu la intervalon de registrado por la ĝenerala registrado de spuro (aktivigebla per la fenestraĵo “registri spuron” sur la mapo). + Elektu la intertempon de registrado por la ĝenerala registrado de spuro (aktivigebla per la fenestraĵo “registri spuron” sur la mapo). Simpligita spuro Nur la linio de kurso estos konservita, la navigadpunktoj estos forigitaj. Dosiernomo @@ -3967,4 +3967,9 @@ Elekti dosierujon Elekti dosierujon aŭ krei novan Malplena + Analizi laŭ intertempoj (dividoj) + Alŝuti al OpenStreetMap + Redakti spuron + Renomi spuron + Ŝanĝi dosierujon \ No newline at end of file diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index 83700ce7cd..799a1f7e8a 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -3966,4 +3966,13 @@ Copiar dirección Motor de navegación en línea Motores de navegación en línea + Carpetas + Elegir carpeta + Elegir carpeta o añadir una nueva + Vacío + Analizar por intervalos (intervalo de división) + Subir a OpenStreetMap + Editar traza + Renombrar traza + Cambiar carpeta \ No newline at end of file diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index 94587e80c3..5271c21759 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -3948,4 +3948,31 @@ Perfil de OsmAnd Elige el perfil que será usado al iniciar la aplicación. Tiempo de indicaciones por voz + Elegir carpeta + Carpetas + Cambiar carpeta + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values-it/strings.xml b/OsmAnd/res/values-it/strings.xml index 0d158455e5..337d1ac338 100644 --- a/OsmAnd/res/values-it/strings.xml +++ b/OsmAnd/res/values-it/strings.xml @@ -1097,7 +1097,7 @@ Indonesiano Italiano Giapponese - Koreano + Coreano Lettone Lituano Marathi diff --git a/OsmAnd/res/values-ka/strings.xml b/OsmAnd/res/values-ka/strings.xml index 330d43d2c4..9db9407028 100644 --- a/OsmAnd/res/values-ka/strings.xml +++ b/OsmAnd/res/values-ka/strings.xml @@ -2757,4 +2757,14 @@ ქვიშა ხრეში ბალახიანი + დამატებულია + მორგებული პროფილი + ჩანაწერის გაყოფა + უჯრედული ქსელები + OSM ჩასწორებები + OsmAnd-ის გამოყენება + ღრეჩოების შეერთება + შექმნა + მორგებული ძებნა + ცარიელი \ No newline at end of file diff --git a/OsmAnd/res/values-nb/strings.xml b/OsmAnd/res/values-nb/strings.xml index b2a3fc41cb..97e76db9b5 100644 --- a/OsmAnd/res/values-nb/strings.xml +++ b/OsmAnd/res/values-nb/strings.xml @@ -3864,4 +3864,21 @@ Tillat bekker og avløp Tillat periodiske vannveier Tillat periodiske vannveier + Kjøretøy + API-nøkkel + Tjenernettadresse + Test rutekalkulering + Kjøring + Til fots + Sykkel + Bil + Kopier adresse + Mapper + Velg mappe + Velg mappe eller legg til en ny + Tom + Rediger spor + Last opp til OpenStreetMap + Gi spor nytt navn + Endre mappe \ No newline at end of file diff --git a/OsmAnd/res/values-pt-rBR/strings.xml b/OsmAnd/res/values-pt-rBR/strings.xml index 52d578c035..0b5a8b33f2 100644 --- a/OsmAnd/res/values-pt-rBR/strings.xml +++ b/OsmAnd/res/values-pt-rBR/strings.xml @@ -3962,4 +3962,9 @@ Selecione a pasta Selecione a pasta ou adicione uma nova Vazio + Analisar por intervalos (intervalo de divisão) + Carregar para OpenStreetMap + Editar trilha + Renomear trilha + Mudar pasta \ No newline at end of file diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index fdb5eb12ec..b360bcaad9 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -3934,4 +3934,30 @@ \n• Cores personalizadas para favoritos e pontos de rotas de trilhos \n \n + Editar o mecanismo de roteamento online + Subtipo + Veículo + Chave de API + URL do servidor + Digite o param + Mantenha-o vazio se não + O URL com todos os parâmetros parecerá-se assim: + Cálculo da rota de teste + Condução + + Bicicleta + Carro + Erro, verifique novamente os parâmetros + Copiar endereço + Mecanismo de roteamento online + Mecanismos de roteamento online + Pastas + Selecionar pasta + Selecione a pasta ou adicione uma + Vazio + Analisar por intervalos (intervalo dividido) + Enviar ao OpenStreetMap + Editar trilho + Renomear trilho + Mudar pasta \ No newline at end of file diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index f34e42cce4..40d524cfb3 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -1200,7 +1200,7 @@ Сделать фото Синхронизация треков и медиазаметок с вашим аккаунтом Dropbox. Плагин Dropbox - Плагин обеспечивает наложение контурных линии и затемняющего слоя (рельефа), которые будут отображаться поверх стандартных карт OsmAnd. Эту функцию оценят спортсмены, туристы, путешественники и все, для кого рельеф местности имеет значение. + Плагин обеспечивает наложение контурных линий и затемняющего слоя (рельефа), которые будут отображаться поверх стандартных карт OsmAnd. Эту функцию оценят спортсмены, туристы, путешественники и все, для кого рельеф местности имеет значение. \n \nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), инструментом визуализации Terra, флагманского спутника Земли системы наблюдения NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), космических систем Японии (J-spacesystems). Фото %1$s %2$s @@ -2547,12 +2547,12 @@ \n OsmAnd + — платная версия программы. Приобретая её, вы поддержите проект, финансируете разработку новых возможностей и получите последние обновления. \n \n Некоторые из главных возможностей: - Навигация -\n• Работает через интернет (быстрее) или автономно (без платы за роуминг за границей) -\n• Пошаговые голосовые подсказки (записанные или синтезированные голоса) -\n• Полосы движения, отображение названия улицы и приблизительное время прибытия -\n• Поддержка промежуточных точек на вашем маршруте -\n• Автоматическое перестройка маршрута при отклонении от существующего + Навигация +\n• Работает через интернет (быстрее) или автономно (без платы за роуминг за границей) +\n• Пошаговые голосовые подсказки (записанные или синтезированные голоса) +\n• Полосы движения, отображение названия улицы и приблизительное время прибытия +\n• Поддержка промежуточных точек на вашем маршруте +\n• Автоматическая перестройка маршрута при отклонении от существующего \n• Поиск мест по адресу, типу (например, ресторан, гостиница, заправка, музей) или географическим координатам \n Просмотр карты @@ -2593,12 +2593,12 @@ \n• Возможность изменения масштаба в зависимости от скорости \n• Возможность делиться своим местоположением, чтобы друзья смогли найти вас \n - Возможности для пешеходов и велосипедистов -\n• Просмотр пешеходных, туристических и велосипедных дорожек, прекрасно подходит для активного отдыха -\n• Специальный режимы маршрутизации и отображения для велосипедистов и пешеходов -\n• Возможность отображения остановок общественного транспорта (автобус, трамвай, поезд), включая названия маршрутов -\n• Возможность записи путешествие в локальный файл GPX или интернет-сервис -\n• Возможность отображения скорости и высоты + Возможности для пешеходов и велосипедистов +\n• Просмотр пешеходных, туристических и велосипедных дорожек, прекрасно подходит для активного отдыха +\n• Специальные режимы маршрутизации и отображения для велосипедистов и пешеходов +\n• Возможность отображения остановок общественного транспорта (автобус, трамвай, поезд), включая названия маршрутов +\n• Возможность записи путешествие в локальный файл GPX или интернет-сервис +\n• Возможность отображения скорости и высоты \n• Отображение контурных линий и затенения высот (через дополнительный плагин) Непосредственный вклад в OSM \n • Сообщения об ошибках в данных diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml index 81a9d73353..6d3fbf6d12 100644 --- a/OsmAnd/res/values-sk/strings.xml +++ b/OsmAnd/res/values-sk/strings.xml @@ -3962,4 +3962,9 @@ Zvoľte priečinok Zvoľte priečinok alebo pridajte nový Prázdne + Analyzovať podľa intervalov (rozdeliť interval) + Nahrať do OpenStreetMap + Upraviť stopu + Premenovať stopu + Zmeniť priečinok \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index 0f19668c01..dbb7f64fa0 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3960,4 +3960,9 @@ 選取資料夾 選取資料夾或新增 + 按時間間隔分析(分割時間間隔) + 上傳到 OpenStreetMap + 編輯軌跡 + 重新命名軌跡 + 變更資料夾 \ No newline at end of file diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index 5945485c19..a7cbb98fda 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -54,7 +54,7 @@ @drawable/first_splash_screen_free - diff --git a/OsmAnd/src-gms/net/osmand/plus/LocationServiceHelperImpl.java b/OsmAnd/src-gms/net/osmand/plus/LocationServiceHelperImpl.java index e8182955ec..41c74012a3 100644 --- a/OsmAnd/src-gms/net/osmand/plus/LocationServiceHelperImpl.java +++ b/OsmAnd/src-gms/net/osmand/plus/LocationServiceHelperImpl.java @@ -131,15 +131,17 @@ public class LocationServiceHelperImpl extends LocationServiceHelper { } @Nullable - public net.osmand.Location getFirstTimeRunDefaultLocation() { - final net.osmand.Location[] location = {null}; - /* + public net.osmand.Location getFirstTimeRunDefaultLocation(@Nullable final LocationCallback locationCallback) { + if (locationCallback == null) { + return null; + } try { Task lastLocation = fusedLocationProviderClient.getLastLocation(); lastLocation.addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Location loc) { - location[0] = convertLocation(loc); + locationCallback.onLocationResult(loc != null + ? Collections.singletonList(convertLocation(loc)) : Collections.emptyList() ); } }); } catch (SecurityException e) { @@ -147,8 +149,7 @@ public class LocationServiceHelperImpl extends LocationServiceHelper { } catch (IllegalArgumentException e) { LOG.debug("GPS location provider not available"); } - */ - return location[0]; + return null; } @Nullable diff --git a/OsmAnd/src-nogms/net/osmand/plus/LocationServiceHelperImpl.java b/OsmAnd/src-nogms/net/osmand/plus/LocationServiceHelperImpl.java index 5f49607954..9a2caa6a5f 100644 --- a/OsmAnd/src-nogms/net/osmand/plus/LocationServiceHelperImpl.java +++ b/OsmAnd/src-nogms/net/osmand/plus/LocationServiceHelperImpl.java @@ -125,7 +125,7 @@ public class LocationServiceHelperImpl extends LocationServiceHelper implements } @Nullable - public net.osmand.Location getFirstTimeRunDefaultLocation() { + public net.osmand.Location getFirstTimeRunDefaultLocation(@Nullable LocationCallback locationCallback) { LocationManager locationManager = (LocationManager) app.getSystemService(Context.LOCATION_SERVICE); List providers = new ArrayList<>(locationManager.getProviders(true)); // note, passive provider is from API_LEVEL 8 but it is a constant, we can check for it. diff --git a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java index ee875fbb17..15936ded34 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java @@ -389,8 +389,14 @@ public class OsmAndLocationProvider implements SensorEventListener { } @Nullable - public net.osmand.Location getFirstTimeRunDefaultLocation() { - return isLocationPermissionAvailable(app) ? locationServiceHelper.getFirstTimeRunDefaultLocation() : null; + public net.osmand.Location getFirstTimeRunDefaultLocation(@Nullable final OsmAndLocationListener locationListener) { + return isLocationPermissionAvailable(app) + ? locationServiceHelper.getFirstTimeRunDefaultLocation(locationListener != null ? new LocationServiceHelper.LocationCallback() { + @Override + public void onLocationResult(@NonNull List locations) { + locationListener.updateLocation(locations.isEmpty() ? null : locations.get(0)); + } + } : null) : null; } public synchronized void registerOrUnregisterCompassListener(boolean register) { diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index af1570ecaa..e04f055b35 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -388,7 +388,7 @@ public abstract class OsmandPlugin { } private static boolean updateMarketPlugin(@NonNull OsmandApplication app, @NonNull Set enabledPlugins, @NonNull OsmandPlugin plugin) { - boolean marketEnabled = Version.isMarketEnabled(app); + boolean marketEnabled = Version.isMarketEnabled(); boolean pckg = plugin.pluginAvailable(app); boolean paid = plugin.isPaid(); if ((Version.isDeveloperVersion(app) || !Version.isProductionVersion(app)) && !paid) { diff --git a/OsmAnd/src/net/osmand/plus/Version.java b/OsmAnd/src/net/osmand/plus/Version.java index 48dd9b1feb..b1962564e3 100644 --- a/OsmAnd/src/net/osmand/plus/Version.java +++ b/OsmAnd/src/net/osmand/plus/Version.java @@ -1,9 +1,10 @@ package net.osmand.plus; - import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import androidx.annotation.NonNull; + import net.osmand.plus.inapp.InAppPurchaseHelper; import java.io.File; @@ -16,26 +17,29 @@ public class Version { private final String appName; private final static String FREE_VERSION_NAME = "net.osmand"; private final static String FREE_DEV_VERSION_NAME = "net.osmand.dev"; - private final static String FREE_CUSTOM_VERSION_NAME = "net.osmand.freecustom"; private final static String UTM_REF = "&referrer=utm_source%3Dosmand"; - - public static boolean isGpsStatusEnabled(OsmandApplication ctx) { - return isGooglePlayEnabled(ctx) && !isBlackberry(ctx); - } - - public static boolean isBlackberry(OsmandApplication ctx) { - return ctx.getString(R.string.versionFeatures).contains("+blackberry"); - } - - public static boolean isHuawei(OsmandApplication ctx) { - return ctx.getPackageName().endsWith(".huawei"); - } - - public static boolean isMarketEnabled(OsmandApplication ctx) { - return isGooglePlayEnabled(ctx) || isAmazonEnabled(ctx); + + public static boolean isHuawei() { + return "huawei".contains(getBuildFlavor()); } - public static boolean isGooglePlayInstalled(OsmandApplication ctx) { + private static boolean isAmazon() { + return "amazon".contains(getBuildFlavor()); + } + + private static String getBuildFlavor() { + return net.osmand.plus.BuildConfig.FLAVOR; + } + + public static boolean isGooglePlayEnabled() { + return !isHuawei() && !isAmazon(); + } + + public static boolean isMarketEnabled() { + return isGooglePlayEnabled() || isAmazon(); + } + + public static boolean isGooglePlayInstalled(@NonNull OsmandApplication ctx) { try { ctx.getPackageManager().getPackageInfo("com.android.vending", 0); } catch (PackageManager.NameNotFoundException e) { @@ -44,10 +48,10 @@ public class Version { return true; } - public static String marketPrefix(OsmandApplication ctx) { - if (isAmazonEnabled(ctx)) { + public static String marketPrefix(@NonNull OsmandApplication ctx) { + if (isAmazon()) { return "amzn://apps/android?p="; - } else if (isGooglePlayEnabled(ctx) && isGooglePlayInstalled(ctx)) { + } else if (isGooglePlayEnabled() && isGooglePlayInstalled(ctx)) { return "market://details?id="; } return "https://osmand.net/apps?id="; @@ -57,22 +61,11 @@ public class Version { return marketPrefix(ctx) + appName + UTM_REF; } - private static boolean isAmazonEnabled(OsmandApplication ctx) { - return ctx.getString(R.string.versionFeatures).contains("+amazon"); - } - - public static boolean isGooglePlayEnabled(OsmandApplication ctx) { - return ctx.getString(R.string.versionFeatures).contains("+play_market"); - } - - private Version(OsmandApplication ctx) { String appVersion = ""; - int versionCode = -1; try { PackageInfo packageInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), 0); appVersion = packageInfo.versionName; //Version suffix ctx.getString(R.string.app_version_suffix) already appended in build.gradle - versionCode = packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } @@ -123,8 +116,7 @@ public class Version { public static boolean isFreeVersion(OsmandApplication ctx){ return ctx.getPackageName().equals(FREE_VERSION_NAME) || ctx.getPackageName().equals(FREE_DEV_VERSION_NAME) || - ctx.getPackageName().equals(FREE_CUSTOM_VERSION_NAME) || - isHuawei(ctx); + isHuawei(); } public static boolean isPaidVersion(OsmandApplication ctx) { diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 007280144e..a94997caaa 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -70,6 +70,8 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OnDismissDialogFragmentListener; import net.osmand.plus.OsmAndConstants; +import net.osmand.plus.OsmAndLocationProvider; +import net.osmand.plus.OsmAndLocationProvider.OsmAndLocationListener; import net.osmand.plus.OsmAndLocationSimulation; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; @@ -347,11 +349,17 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven if (!settings.isLastKnownMapLocation()) { // show first time when application ran - net.osmand.Location location = app.getLocationProvider().getFirstTimeRunDefaultLocation(); + net.osmand.Location location = app.getLocationProvider().getFirstTimeRunDefaultLocation(new OsmAndLocationListener() { + @Override + public void updateLocation(Location location) { + if (app.getLocationProvider().getLastKnownLocation() == null) { + setMapInitialLatLon(location); + } + } + }); mapViewTrackingUtilities.setMapLinkedToLocation(true); if (location != null) { - mapView.setLatLon(location.getLatitude(), location.getLongitude()); - mapView.setIntZoom(14); + setMapInitialLatLon(location); } } addDialogProvider(mapActions); @@ -376,6 +384,13 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven mIsDestroyed = false; } + private void setMapInitialLatLon(@Nullable Location location) { + if (location != null) { + mapView.setLatLon(location.getLatitude(), location.getLongitude()); + mapView.setIntZoom(14); + } + } + public void exitFromFullScreen(View view) { AndroidUtils.exitFromFullScreen(this, view); } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index c526ddec2a..b5dd0dc3ea 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -903,7 +903,7 @@ public class MapActivityActions implements DialogProvider { } }).createItem()); - if (Version.isGooglePlayEnabled(app) || Version.isHuawei(app) || Version.isDeveloperVersion(app)) { + if (Version.isGooglePlayEnabled() || Version.isHuawei() || Version.isDeveloperVersion(app)) { optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.osm_live, mapActivity) .setId(DRAWER_OSMAND_LIVE_ID) .setIcon(R.drawable.ic_action_osm_live) diff --git a/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java b/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java index 47f7a17444..6cc1b222bb 100644 --- a/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/OsmandInAppPurchaseActivity.java @@ -5,7 +5,6 @@ import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.net.Uri; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -16,16 +15,12 @@ import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.R; import net.osmand.plus.Version; -import net.osmand.plus.download.DownloadActivity; import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseInitCallback; import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseListener; import net.osmand.plus.inapp.InAppPurchaseHelper.InAppPurchaseTaskType; import net.osmand.plus.liveupdates.OsmLiveRestartBottomSheetDialogFragment; -import net.osmand.plus.srtmplugin.SRTMPlugin; import org.apache.commons.logging.Log; @@ -59,7 +54,7 @@ public class OsmandInAppPurchaseActivity extends AppCompatActivity implements In InAppPurchaseHelper purchaseHelper = app.getInAppPurchaseHelper(); if (app.getSettings().isInternetConnectionAvailable() && isInAppPurchaseAllowed() - && isInAppPurchaseSupported(purchaseHelper)) { + && isInAppPurchaseSupported()) { this.purchaseHelper = purchaseHelper; } } @@ -160,9 +155,8 @@ public class OsmandInAppPurchaseActivity extends AppCompatActivity implements In return false; } - public boolean isInAppPurchaseSupported(InAppPurchaseHelper purchaseHelper) { - OsmandApplication app = getMyApplication(); - return Version.isGooglePlayEnabled(app) || Version.isHuawei(app); + public boolean isInAppPurchaseSupported() { + return Version.isGooglePlayEnabled() || Version.isHuawei(); } @Override diff --git a/OsmAnd/src/net/osmand/plus/activities/actions/ShareDialog.java b/OsmAnd/src/net/osmand/plus/activities/actions/ShareDialog.java index 4858e3ccfe..f033e59bef 100644 --- a/OsmAnd/src/net/osmand/plus/activities/actions/ShareDialog.java +++ b/OsmAnd/src/net/osmand/plus/activities/actions/ShareDialog.java @@ -193,7 +193,7 @@ public class ShareDialog { intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); activity.startActivity(intent); } else { - if (Version.isMarketEnabled((OsmandApplication) activity.getApplication())) { + if (Version.isMarketEnabled()) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(activity.getString(R.string.zxing_barcode_scanner_not_found)); builder.setPositiveButton(activity.getString(R.string.shared_string_yes), new DialogInterface.OnClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java b/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java index 79abd4190a..c8c9a70785 100644 --- a/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java +++ b/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java @@ -180,7 +180,7 @@ public class StartGPSStatus extends OsmAndAction { intent.addCategory(Intent.CATEGORY_LAUNCHER); mapActivity.startActivity(intent); } else { - if (Version.isMarketEnabled(getMyApplication())) { + if (Version.isMarketEnabled()) { AlertDialog.Builder builder = new AlertDialog.Builder(mapActivity); builder.setMessage(mapActivity. getString(R.string.gps_status_app_not_found)); builder.setPositiveButton(mapActivity.getString(R.string.shared_string_yes), new DialogInterface.OnClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java index 9a7215867f..6547ae01db 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java @@ -5,8 +5,6 @@ import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -216,7 +214,7 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment infoDescription.setText(getInfoDescription()); } TextViewEx planInfoDescription = (TextViewEx) view.findViewById(R.id.plan_info_description); - planInfoDescription.setText(Version.isHuawei(app) + planInfoDescription.setText(Version.isHuawei() ? R.string.osm_live_payment_subscription_management_hw : R.string.osm_live_payment_subscription_management); ViewGroup osmLiveCard = buildOsmLiveCard(ctx, cardsContainer); if (osmLiveCard != null) { diff --git a/OsmAnd/src/net/osmand/plus/development/DevelopmentSettingsFragment.java b/OsmAnd/src/net/osmand/plus/development/DevelopmentSettingsFragment.java index 8cee128154..d34a306b79 100644 --- a/OsmAnd/src/net/osmand/plus/development/DevelopmentSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/development/DevelopmentSettingsFragment.java @@ -71,16 +71,12 @@ public class DevelopmentSettingsFragment extends BaseSettingsFragment { private void setupSafeModePref() { SwitchPreferenceEx safeMode = findPreference(settings.SAFE_MODE.getId()); - if (!Version.isBlackberry(app)) { - safeMode.setDescription(getString(R.string.safe_mode_description)); - safeMode.setIconSpaceReserved(false); - // disable the switch if the library cannot be used - if ((NativeOsmandLibrary.isLoaded() && !NativeOsmandLibrary.isSupported()) || settings.NATIVE_RENDERING_FAILED.get()) { - safeMode.setEnabled(false); - safeMode.setChecked(true); - } - } else { - safeMode.setVisible(false); + safeMode.setDescription(getString(R.string.safe_mode_description)); + safeMode.setIconSpaceReserved(false); + // disable the switch if the library cannot be used + if ((NativeOsmandLibrary.isLoaded() && !NativeOsmandLibrary.isSupported()) || settings.NATIVE_RENDERING_FAILED.get()) { + safeMode.setEnabled(false); + safeMode.setChecked(true); } } diff --git a/OsmAnd/src/net/osmand/plus/dialogs/RateUsBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/dialogs/RateUsBottomSheetDialogFragment.java index 2dcd62c6bd..188031ea1d 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/RateUsBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/RateUsBottomSheetDialogFragment.java @@ -108,7 +108,7 @@ public class RateUsBottomSheetDialogFragment extends MenuBottomSheetDialogFragme public static boolean shouldShow(OsmandApplication app) { long firstInstalledDays = app.getAppInitializer().getFirstInstalledDays(); //Do not show dialog if not google play version or more than 350 days left from the first start - if (!Version.isGooglePlayEnabled(app) || firstInstalledDays > 350) { + if (!Version.isGooglePlayEnabled() || firstInstalledDays > 350) { return false; } OsmandSettings settings = app.getSettings(); diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java b/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java index 92fa82079f..8e03b2c1e5 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadValidationManager.java @@ -217,7 +217,7 @@ public class DownloadValidationManager { AlertDialog.Builder msg = new AlertDialog.Builder(getActivity()); msg.setTitle(R.string.free_version_title); msg.setMessage(msgTx); - if (Version.isMarketEnabled(getMyApplication())) { + if (Version.isMarketEnabled()) { msg.setPositiveButton(R.string.install_paid, new DialogInterface.OnClickListener() { @Override diff --git a/OsmAnd/src/net/osmand/plus/helpers/DayNightHelper.java b/OsmAnd/src/net/osmand/plus/helpers/DayNightHelper.java index 20820d379e..0721350197 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/DayNightHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/DayNightHelper.java @@ -110,7 +110,7 @@ public class DayNightHelper implements SensorEventListener { public SunriseSunset getSunriseSunset() { Location lastKnownLocation = app.getLocationProvider().getLastKnownLocation(); if (lastKnownLocation == null) { - lastKnownLocation = app.getLocationProvider().getFirstTimeRunDefaultLocation(); + lastKnownLocation = app.getLocationProvider().getFirstTimeRunDefaultLocation(null); } if (lastKnownLocation == null) { return null; diff --git a/OsmAnd/src/net/osmand/plus/helpers/LocationServiceHelper.java b/OsmAnd/src/net/osmand/plus/helpers/LocationServiceHelper.java index 94602e98fc..472dcf3b7f 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/LocationServiceHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/LocationServiceHelper.java @@ -1,6 +1,7 @@ package net.osmand.plus.helpers; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import net.osmand.Location; @@ -25,5 +26,5 @@ public abstract class LocationServiceHelper { public abstract void removeLocationUpdates(); - public abstract Location getFirstTimeRunDefaultLocation(); + public abstract Location getFirstTimeRunDefaultLocation(@Nullable LocationCallback locationCallback); } diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java index c7464c6b1f..ec13eba2bd 100644 --- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java +++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java @@ -212,7 +212,7 @@ public abstract class InAppPurchaseHelper { } protected void exec(final @NonNull InAppPurchaseTaskType taskType, final @NonNull InAppCommand command) { - if (isDeveloperVersion || (!Version.isGooglePlayEnabled(ctx) && !Version.isHuawei(ctx))) { + if (isDeveloperVersion || (!Version.isGooglePlayEnabled() && !Version.isHuawei())) { notifyDismissProgress(taskType); stop(true); return; diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/GeneralProfileSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/GeneralProfileSettingsFragment.java index 430432981e..8bb3cfb333 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/GeneralProfileSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/GeneralProfileSettingsFragment.java @@ -298,12 +298,9 @@ public class GeneralProfileSettingsFragment extends BaseSettingsFragment impleme mapEmptyStateAllowedPref.setTitle(getString(R.string.use_trackball)); mapEmptyStateAllowedPref.setDescription(getString(R.string.use_trackball_descr)); - boolean visible = false; - if (!Version.isBlackberry(app)) { - int nav = getResources().getConfiguration().navigation; - visible = nav == Configuration.NAVIGATION_DPAD || nav == Configuration.NAVIGATION_TRACKBALL || - nav == Configuration.NAVIGATION_WHEEL || nav == Configuration.NAVIGATION_UNDEFINED; - } + int nav = getResources().getConfiguration().navigation; + boolean visible = nav == Configuration.NAVIGATION_DPAD || nav == Configuration.NAVIGATION_TRACKBALL || + nav == Configuration.NAVIGATION_WHEEL || nav == Configuration.NAVIGATION_UNDEFINED; mapEmptyStateAllowedPref.setVisible(visible); } diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java index d3d9ef2d93..123c49b316 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/RouteParametersFragment.java @@ -171,15 +171,13 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP } private void setupNativePublicTransport() { - if (!Version.isBlackberry(app)) { - SwitchPreferenceEx setupNativePublicTransport = createSwitchPreferenceEx(settings.PT_SAFE_MODE.getId(), - R.string.use_native_pt, R.layout.preference_with_descr_dialog_and_switch); - setupNativePublicTransport.setDescription(getString(R.string.use_native_pt_desc)); - setupNativePublicTransport.setSummaryOn(R.string.shared_string_enabled); - setupNativePublicTransport.setSummaryOff(R.string.shared_string_disabled); - setupNativePublicTransport.setIconSpaceReserved(true); - getPreferenceScreen().addPreference(setupNativePublicTransport); - } + SwitchPreferenceEx setupNativePublicTransport = createSwitchPreferenceEx(settings.PT_SAFE_MODE.getId(), + R.string.use_native_pt, R.layout.preference_with_descr_dialog_and_switch); + setupNativePublicTransport.setDescription(getString(R.string.use_native_pt_desc)); + setupNativePublicTransport.setSummaryOn(R.string.shared_string_enabled); + setupNativePublicTransport.setSummaryOff(R.string.shared_string_disabled); + setupNativePublicTransport.setIconSpaceReserved(true); + getPreferenceScreen().addPreference(setupNativePublicTransport); } private void setupOsmLiveForRoutingPref() { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java index 9697acd599..fb617ab01f 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java @@ -97,10 +97,9 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr setupArrivalAnnouncementPref(); setupVoiceProviderPref(); - if (!Version.isBlackberry(app)) { - setupAudioStreamGuidancePref(); - setupInterruptMusicPref(); - } + setupAudioStreamGuidancePref(); + setupInterruptMusicPref(); + enableDisablePreferences(!settings.VOICE_MUTE.getModeValue(getSelectedAppMode())); setupSpeakCamerasPref(); setupSpeedCamerasAlert();