From a52a50a46bcf1ab805968bcb6a3dabdb4cc787a3 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:36:28 +0100 Subject: [PATCH 01/14] updated gradle wrapper to 6.1.1 --- gradle.properties | 43 ++++++++++++------- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 51 ++++++++++++++--------- gradlew.bat | 18 +++++++- 5 files changed, 78 insertions(+), 37 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar diff --git a/gradle.properties b/gradle.properties index aac7c9b..d1c4eb2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,32 @@ -# Project-wide Gradle settings. +# gralde config +org.gradle.jvmargs=-Xms8g +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.workers.max=32 +org.gradle.caching=true -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. +# kotlin config +#android.enableAapt2=false +kotlinOptions.allWarningsAsErrors=false +android.enableR8=true +android.enableR8.fullMode=true +android.enableD8=true +android.enableD8.desugaring=true +# https://developer.android.com/topic/libraries/support-library/androidx-overview +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html +#robolectric +android.enableUnitTestBinaryResources=true +# https://speakerdeck.com/snehpandya18/mastering-gradle-3 +# gradle=build -x lint -x lintVitalRelease +# https://developer.android.com/studio/preview/features/?utm_source=android-studio#lazy_task_config +android.debug.obsoleteApi=false +#android.proguard.enableRulesExtraction=false -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +kapt.incremental.apt=true +android.enableSeparateAnnotationProcessing=true +javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 073a26b..1b16c34 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri May 10 13:59:12 IST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/gradlew b/gradlew index cccdd3d..2fe81a7 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -109,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` @@ -138,19 +154,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +175,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d..24467a1 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome From 4cbc7fdd63e27af2ffd1a7976d0d32d9191fa946 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:36:53 +0100 Subject: [PATCH 02/14] added ignore rule for GoogleAppIndexingWarning --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6912c1d..9bee3a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" - tools:ignore="AllowBackup"> + tools:ignore="AllowBackup,GoogleAppIndexingWarning"> From 6211f0483db467169a5a1118079c24cf701419e7 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:37:02 +0100 Subject: [PATCH 03/14] cleaned up library manifest --- trail/src/main/AndroidManifest.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/trail/src/main/AndroidManifest.xml b/trail/src/main/AndroidManifest.xml index 50c167c..feaa329 100644 --- a/trail/src/main/AndroidManifest.xml +++ b/trail/src/main/AndroidManifest.xml @@ -1,8 +1,2 @@ - - - - - - \ No newline at end of file + \ No newline at end of file From 3b4195809b58c7c5758187299f1f5bb60192bf98 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:37:56 +0100 Subject: [PATCH 04/14] removed unnecessary library app-name string --- trail/src/main/res/values/strings.xml | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 trail/src/main/res/values/strings.xml diff --git a/trail/src/main/res/values/strings.xml b/trail/src/main/res/values/strings.xml deleted file mode 100644 index 39e42aa..0000000 --- a/trail/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Trail - From 5db90c7a1fb439d173bc77d80280f55e4c4c7ba1 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:45:57 +0100 Subject: [PATCH 05/14] added proguard rule --- trail/proguard-rules.pro | 2 ++ 1 file changed, 2 insertions(+) diff --git a/trail/proguard-rules.pro b/trail/proguard-rules.pro index f1b4245..caf87ec 100644 --- a/trail/proguard-rules.pro +++ b/trail/proguard-rules.pro @@ -19,3 +19,5 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile + +-keep class com.amalbit.trail.** { *; } \ No newline at end of file From f9ba04c617de8339f58a0f4457ff26441cad6bab Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:46:27 +0100 Subject: [PATCH 06/14] added .gitignore --- .gitignore | 239 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..126f1dd --- /dev/null +++ b/.gitignore @@ -0,0 +1,239 @@ +.idea/ + +# Created by https://www.gitignore.io/api/macos,android,windows,jetbrains +# Edit at https://www.gitignore.io/?templates=macos,android,windows,jetbrains + +### Android ### +# Built application files +*.apk +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +### Android Patch ### +gen-external-apklibs +output.json + +# Replacement of .externalNativeBuild directories introduced +# with Android Studio 3.5. +.cxx/ + +### JetBrains ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### JetBrains Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/**/sonarlint/ + +# SonarQube Plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator/ + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/macos,android,windows,jetbrains \ No newline at end of file From 38eaeaf3a0d374e44d2550a4a5cd2249b97bbc82 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:46:54 +0100 Subject: [PATCH 07/14] migrated to androidx and updated dependencies --- app/build.gradle | 25 +++++++++++-------- .../ExampleInstrumentedTest.java | 5 ++-- .../animationongooglemap/HomeActivity.java | 4 ++- .../com/amalbit/animationongooglemap/U.kt | 2 +- .../polylineBased/MapsActivity.java | 4 ++- .../projectionBased/BaseActivity.java | 7 ++++-- app/src/main/res/layout/activity_from_to.xml | 6 ++--- app/src/main/res/layout/activity_home.xml | 12 ++++----- .../main/res/layout/activity_view_overlay.xml | 4 +-- app/src/main/res/layout/layout_one.xml | 4 +-- build.gradle | 6 ++--- trail/build.gradle | 18 ++++++------- .../trail/ExampleInstrumentedTest.java | 5 ++-- .../com/amalbit/trail/AnimationArcHelper.java | 4 ++- .../java/com/amalbit/trail/OverlayLayout.java | 6 +++-- .../com/amalbit/trail/RouteOverlayView.java | 4 ++- .../trail/marker/MarkerOverlayView.java | 4 ++- .../amalbit/trail/marker/ViewOverlayView.java | 4 ++- 18 files changed, 74 insertions(+), 50 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fc29ce9..771a912 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,12 +3,12 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android' android { - compileSdkVersion 26 - buildToolsVersion '28.0.3' + compileSdkVersion 29 + buildToolsVersion '29.0.3' defaultConfig { applicationId "com.amalbit.animationongooglemap" minSdkVersion 16 - targetSdkVersion 26 + targetSdkVersion 29 versionCode 5 versionName "1.40" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -24,6 +24,7 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + } dependencies { @@ -31,19 +32,23 @@ dependencies { androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - api 'com.android.support:appcompat-v7:26.1.0' - api 'com.android.support:design:26.1.0' - api 'com.google.android.gms:play-services-base:10.0.1' - api 'com.android.support.constraint:constraint-layout:1.0.2' + + implementation "androidx.appcompat:appcompat:1.1.0" + implementation "androidx.appcompat:appcompat-resources:1.1.0" + + implementation 'com.google.android.gms:play-services-base:17.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' implementation project(':trail') + implementation 'com.google.android.gms:play-services-maps:17.0.0' // RxJava2 Dependencies - implementation 'io.reactivex.rxjava2:rxjava:2.2.2' - implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' + implementation 'io.reactivex.rxjava2:rxjava:2.2.7' + implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.google.maps:google-maps-services:0.1.20' - implementation 'com.google.maps.android:android-maps-utils:0.5' + implementation 'com.google.maps.android:android-maps-utils:0.6.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } repositories { diff --git a/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java index c0b3e89..166b094 100644 --- a/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java @@ -1,8 +1,9 @@ package com.amalbit.animationongooglemap; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java index d0e37c6..11dbbc6 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java @@ -2,8 +2,10 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; + +import androidx.appcompat.app.AppCompatActivity; + import com.amalbit.animationongooglemap.polylineBased.MapsActivity; import com.amalbit.animationongooglemap.projectionBased.FromToActivity; import com.amalbit.animationongooglemap.projectionBased.OverlayRouteActivity; diff --git a/app/src/main/java/com/amalbit/animationongooglemap/U.kt b/app/src/main/java/com/amalbit/animationongooglemap/U.kt index ce1b22f..bcd1cf0 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/U.kt +++ b/app/src/main/java/com/amalbit/animationongooglemap/U.kt @@ -5,7 +5,7 @@ import android.util.Log class U { companion object { @JvmStatic fun log(tag: String, msg: String) { - Log.d(tag, msg); + Log.d(tag, msg) } } } \ No newline at end of file diff --git a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java index d34988f..d635677 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java @@ -1,9 +1,11 @@ package com.amalbit.animationongooglemap.polylineBased; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + import com.amalbit.animationongooglemap.R; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; diff --git a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java index ef23af0..d5898e3 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java @@ -2,14 +2,17 @@ import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.view.Window; import android.view.WindowManager; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; + import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/res/layout/activity_from_to.xml b/app/src/main/res/layout/activity_from_to.xml index 812e827..5a669a4 100644 --- a/app/src/main/res/layout/activity_from_to.xml +++ b/app/src/main/res/layout/activity_from_to.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index ca9327c..8c9869f 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -1,5 +1,5 @@ - - - - - - + diff --git a/app/src/main/res/layout/activity_view_overlay.xml b/app/src/main/res/layout/activity_view_overlay.xml index e0bdd77..3dd8332 100644 --- a/app/src/main/res/layout/activity_view_overlay.xml +++ b/app/src/main/res/layout/activity_view_overlay.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_one.xml b/app/src/main/res/layout/layout_one.xml index d420ec4..d286f4c 100644 --- a/app/src/main/res/layout/layout_one.xml +++ b/app/src/main/res/layout/layout_one.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/build.gradle b/build.gradle index cf9dbdc..0b0eefc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.31' + ext.kotlin_version = '1.3.61' repositories { google() jcenter() @@ -11,8 +11,8 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' - classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3" + classpath 'com.android.tools.build:gradle:3.5.3' + classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4" classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } diff --git a/trail/build.gradle b/trail/build.gradle index d2cc6ff..f5d544b 100644 --- a/trail/build.gradle +++ b/trail/build.gradle @@ -32,11 +32,12 @@ ext { } android { - compileSdkVersion 26 + compileSdkVersion 29 + buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 16 - targetSdkVersion 26 + targetSdkVersion 29 versionCode 4 versionName "1.53" @@ -50,22 +51,21 @@ android { } } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } -def playServicesVersion = '16.1.0' - dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - api "com.google.android.gms:play-services-maps:$playServicesVersion" + implementation "com.google.android.gms:play-services-maps:17.0.0" testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.annotation:annotation:1.1.0' } bintray { diff --git a/trail/src/androidTest/java/com/amalbit/trail/ExampleInstrumentedTest.java b/trail/src/androidTest/java/com/amalbit/trail/ExampleInstrumentedTest.java index 258a2a5..1736d15 100644 --- a/trail/src/androidTest/java/com/amalbit/trail/ExampleInstrumentedTest.java +++ b/trail/src/androidTest/java/com/amalbit/trail/ExampleInstrumentedTest.java @@ -1,8 +1,9 @@ package com.amalbit.trail; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/trail/src/main/java/com/amalbit/trail/AnimationArcHelper.java b/trail/src/main/java/com/amalbit/trail/AnimationArcHelper.java index bcb38ed..4bd4428 100644 --- a/trail/src/main/java/com/amalbit/trail/AnimationArcHelper.java +++ b/trail/src/main/java/com/amalbit/trail/AnimationArcHelper.java @@ -9,8 +9,10 @@ import android.graphics.DashPathEffect; import android.graphics.PathEffect; import android.graphics.PathMeasure; -import android.support.annotation.NonNull; import android.view.animation.DecelerateInterpolator; + +import androidx.annotation.NonNull; + import com.amalbit.trail.contract.AnimationCallback; import com.amalbit.trail.util.AnimatorListener; diff --git a/trail/src/main/java/com/amalbit/trail/OverlayLayout.java b/trail/src/main/java/com/amalbit/trail/OverlayLayout.java index 8cf42d8..53d79f2 100644 --- a/trail/src/main/java/com/amalbit/trail/OverlayLayout.java +++ b/trail/src/main/java/com/amalbit/trail/OverlayLayout.java @@ -1,10 +1,12 @@ package com.amalbit.trail; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.util.AttributeSet; import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.amalbit.trail.contract.GooglemapProvider; import com.amalbit.trail.marker.ViewOverlayView; import com.google.android.gms.maps.GoogleMap; diff --git a/trail/src/main/java/com/amalbit/trail/RouteOverlayView.java b/trail/src/main/java/com/amalbit/trail/RouteOverlayView.java index b503166..9af654a 100644 --- a/trail/src/main/java/com/amalbit/trail/RouteOverlayView.java +++ b/trail/src/main/java/com/amalbit/trail/RouteOverlayView.java @@ -5,9 +5,11 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; -import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; + +import androidx.annotation.Nullable; + import com.amalbit.trail.contract.GooglemapProvider; import com.amalbit.trail.contract.OverlayView; import java.util.ArrayList; diff --git a/trail/src/main/java/com/amalbit/trail/marker/MarkerOverlayView.java b/trail/src/main/java/com/amalbit/trail/marker/MarkerOverlayView.java index dfa999b..03e3b19 100644 --- a/trail/src/main/java/com/amalbit/trail/marker/MarkerOverlayView.java +++ b/trail/src/main/java/com/amalbit/trail/marker/MarkerOverlayView.java @@ -4,9 +4,11 @@ import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Point; -import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; + +import androidx.annotation.Nullable; + import com.amalbit.trail.marker.OverlayMarker.MarkerRemoveListner; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.Projection; diff --git a/trail/src/main/java/com/amalbit/trail/marker/ViewOverlayView.java b/trail/src/main/java/com/amalbit/trail/marker/ViewOverlayView.java index 4b53db8..50e1725 100644 --- a/trail/src/main/java/com/amalbit/trail/marker/ViewOverlayView.java +++ b/trail/src/main/java/com/amalbit/trail/marker/ViewOverlayView.java @@ -4,9 +4,11 @@ import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Point; -import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; + +import androidx.annotation.Nullable; + import com.amalbit.trail.contract.GooglemapProvider; import com.amalbit.trail.contract.OverlayView; import com.amalbit.trail.marker.OverlayMarkerOptim.MarkerRemoveListner; From 435b918639584b708f31c73fa94a302d48648cec Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:49:22 +0100 Subject: [PATCH 08/14] untracking local.properties --- local.properties | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 local.properties diff --git a/local.properties b/local.properties deleted file mode 100644 index 8877746..0000000 --- a/local.properties +++ /dev/null @@ -1,8 +0,0 @@ -## This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# Location of the SDK. This is only used by Gradle. -# For customization when using a Version Control System, please read the -# header note. -#Fri Jul 13 15:00:57 IST 2018 -sdk.dir=/Users/amal.chandran/Documents/Tools/adt-bundle-mac-x86_64-20140702/sdk From 0ad0c397adba6a3767c9f4d08117c7a191df2950 Mon Sep 17 00:00:00 2001 From: Jan Rabe Date: Mon, 3 Feb 2020 15:53:02 +0100 Subject: [PATCH 09/14] formatted code --- app/build.gradle | 4 +- .../ExampleInstrumentedTest.java | 2 +- app/src/main/AndroidManifest.xml | 66 +- .../animationongooglemap/HomeActivity.java | 54 +- .../com/amalbit/animationongooglemap/U.kt | 3 +- .../animationongooglemap/data/CarData.java | 83 +- .../animationongooglemap/data/LatlngData.java | 2208 +++++++++-------- .../marker/LatLngInterpolator.java | 16 +- .../animationongooglemap/marker/Repeat.java | 94 +- .../polylineBased/MapAnimator.java | 338 +-- .../polylineBased/MapsActivity.java | 151 +- .../polylineBased/RouteEvaluator.java | 13 +- .../projectionBased/BaseActivity.java | 92 +- .../projectionBased/FromToActivity.java | 288 +-- .../projectionBased/OverlayRouteActivity.java | 216 +- .../projectionBased/ViewOverlayActivity.java | 704 +++--- app/src/main/res/drawable/bg_rect.xml | 18 +- app/src/main/res/layout/activity_from_to.xml | 49 +- app/src/main/res/layout/activity_home.xml | 120 +- app/src/main/res/layout/activity_maps.xml | 43 +- .../res/layout/activity_projection_route.xml | 33 +- .../main/res/layout/activity_view_overlay.xml | 97 +- .../main/res/layout/layout_bottom_sheet.xml | 54 +- app/src/main/res/layout/layout_one.xml | 44 +- app/src/main/res/raw/map_style.json | 281 ++- app/src/main/res/values/colors.xml | 6 +- app/src/main/res/values/strings.xml | 28 +- .../animationongooglemap/ExampleUnitTest.java | 2 +- build.gradle | 26 +- trail/build.gradle | 84 +- .../trail/ExampleInstrumentedTest.java | 16 +- .../com/amalbit/trail/AnimationArcHelper.java | 312 +-- .../amalbit/trail/AnimationRouteHelper.java | 329 +-- .../java/com/amalbit/trail/OverlayLayout.java | 95 +- .../com/amalbit/trail/OverlayPolyline.java | 843 +++---- .../com/amalbit/trail/ProjectionHelper.java | 91 +- .../com/amalbit/trail/RouteOverlayView.java | 383 +-- .../trail/contract/AnimationCallback.java | 2 +- .../com/amalbit/trail/contract/Animator.java | 6 +- .../trail/contract/GooglemapProvider.java | 3 +- .../amalbit/trail/contract/OverlayView.java | 8 +- .../trail/marker/MarkerOverlayView.java | 213 +- .../amalbit/trail/marker/OverlayMarker.java | 175 +- .../trail/marker/OverlayMarkerOptim.java | 197 +- .../amalbit/trail/marker/ViewOverlayView.java | 413 +-- .../amalbit/trail/util/AnimationListener.java | 18 +- .../amalbit/trail/util/AnimatorListener.java | 36 +- .../main/java/com/amalbit/trail/util/U.java | 12 +- .../java/com/amalbit/trail/util/Util.java | 146 +- trail/src/main/res/values/attrs.xml | 10 +- trail/src/main/res/values/colors.xml | 6 +- .../com/amalbit/trail/ExampleUnitTest.java | 9 +- 52 files changed, 4448 insertions(+), 4092 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 771a912..2ea34de 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,8 +33,8 @@ dependencies { exclude group: 'com.android.support', module: 'support-annotations' }) - implementation "androidx.appcompat:appcompat:1.1.0" - implementation "androidx.appcompat:appcompat-resources:1.1.0" + implementation "androidx.appcompat:appcompat:1.1.0" + implementation "androidx.appcompat:appcompat-resources:1.1.0" implementation 'com.google.android.gms:play-services-base:17.1.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' diff --git a/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java index 166b094..ece4ee2 100644 --- a/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/amalbit/animationongooglemap/ExampleInstrumentedTest.java @@ -8,7 +8,7 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; /** * Instrumentation test, which will execute on an Android device. diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9bee3a7..25d5e5e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,42 +1,40 @@ - + - - + + - - - + + - + - - - - - - + + + + + - - - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java index 11dbbc6..ba7a314 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/HomeActivity.java @@ -13,36 +13,36 @@ public class HomeActivity extends AppCompatActivity implements View.OnClickListener { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_home); - findViewById(R.id.btn_polyline).setOnClickListener(this); - findViewById(R.id.btn_projection).setOnClickListener(this); - findViewById(R.id.btn_fromto).setOnClickListener(this); - findViewById(R.id.btnViewOverly).setOnClickListener(this); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_home); + findViewById(R.id.btn_polyline).setOnClickListener(this); + findViewById(R.id.btn_projection).setOnClickListener(this); + findViewById(R.id.btn_fromto).setOnClickListener(this); + findViewById(R.id.btnViewOverly).setOnClickListener(this); - //Debugging + //Debugging // findViewById(R.id.btn_fromto).performClick(); // findViewById(R.id.btn_projection).performClick(); - findViewById(R.id.btnViewOverly).performClick(); - } + findViewById(R.id.btnViewOverly).performClick(); + } - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.btn_polyline: - startActivity(new Intent(HomeActivity.this, MapsActivity.class)); - break; - case R.id.btn_projection: - startActivity(new Intent(HomeActivity.this, OverlayRouteActivity.class)); - break; - case R.id.btn_fromto: - startActivity(new Intent(HomeActivity.this, FromToActivity.class)); - break; - case R.id.btnViewOverly: - startActivity(new Intent(HomeActivity.this, ViewOverlayActivity.class)); - break; + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_polyline: + startActivity(new Intent(HomeActivity.this, MapsActivity.class)); + break; + case R.id.btn_projection: + startActivity(new Intent(HomeActivity.this, OverlayRouteActivity.class)); + break; + case R.id.btn_fromto: + startActivity(new Intent(HomeActivity.this, FromToActivity.class)); + break; + case R.id.btnViewOverly: + startActivity(new Intent(HomeActivity.this, ViewOverlayActivity.class)); + break; + } } - } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/U.kt b/app/src/main/java/com/amalbit/animationongooglemap/U.kt index bcd1cf0..31405fd 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/U.kt +++ b/app/src/main/java/com/amalbit/animationongooglemap/U.kt @@ -4,7 +4,8 @@ import android.util.Log class U { companion object { - @JvmStatic fun log(tag: String, msg: String) { + @JvmStatic + fun log(tag: String, msg: String) { Log.d(tag, msg) } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/data/CarData.java b/app/src/main/java/com/amalbit/animationongooglemap/data/CarData.java index f1ec531..c3fe4b2 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/data/CarData.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/data/CarData.java @@ -1,63 +1,64 @@ package com.amalbit.animationongooglemap.data; import com.google.android.gms.maps.model.LatLng; + import java.util.ArrayList; import java.util.List; public class CarData { - public static List getIndiranagarBounds(ArrayList arrayListOfLists) { - List cars = new ArrayList<>(); + public static List getIndiranagarBounds(ArrayList arrayListOfLists) { + List cars = new ArrayList<>(); // List currentPointers = new ArrayList<>(arrayListOfLists.size()); - int currentPointer = 0; - for (int i = 0; i < arrayListOfLists.size(); i++) { - Car carRoute = arrayListOfLists.get(0); + int currentPointer = 0; + for (int i = 0; i < arrayListOfLists.size(); i++) { + Car carRoute = arrayListOfLists.get(0); - } + } - return cars; - } + return cars; + } - public static class Car { - private int carId = -1; - private int currentPointer; - private boolean isBackwardCounting; - private List route; + public static class Car { + private int carId = -1; + private int currentPointer; + private boolean isBackwardCounting; + private List route; - public int getCarId() { - return carId; - } + public int getCarId() { + return carId; + } - public void setCarId(int carId) { - this.carId = carId; - } + public void setCarId(int carId) { + this.carId = carId; + } - public LatLng getLatLng() { - LatLng latLng = route.get(currentPointer); - next(); - return latLng; - } + public LatLng getLatLng() { + LatLng latLng = route.get(currentPointer); + next(); + return latLng; + } - public void setRoute(List route) { - this.route = route; - } + public void setRoute(List route) { + this.route = route; + } - private void next() { - if (!isBackwardCounting && currentPointer < route.size()-1 ) { - currentPointer++; - } else if (currentPointer > 0) { - isBackwardCounting = true; - currentPointer--; - } else { - currentPointer++; - isBackwardCounting = false; - } - } + private void next() { + if (!isBackwardCounting && currentPointer < route.size() - 1) { + currentPointer++; + } else if (currentPointer > 0) { + isBackwardCounting = true; + currentPointer--; + } else { + currentPointer++; + isBackwardCounting = false; + } + } - public void setCurrentPointer(int currentPointer) { - this.currentPointer = currentPointer; + public void setCurrentPointer(int currentPointer) { + this.currentPointer = currentPointer; + } } - } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/data/LatlngData.java b/app/src/main/java/com/amalbit/animationongooglemap/data/LatlngData.java index 89150bc..b99ffe2 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/data/LatlngData.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/data/LatlngData.java @@ -2,6 +2,7 @@ import com.amalbit.animationongooglemap.data.CarData.Car; import com.google.android.gms.maps.model.LatLng; + import java.util.ArrayList; import java.util.List; @@ -11,1106 +12,1133 @@ public class LatlngData { - public static LatLng LATLNG_MUMBAI = new LatLng(19.0821978, 72.7410994); - public static LatLng LATLNG_CHENNAI = new LatLng(13.0474878, 80.0689246); - public static LatLng LATLNG_BENGALURU = new LatLng(12.95396, 77.4908523); - public static LatLng LATLNG_KOLKATA = new LatLng(22.6757521, 88.0495361); + public static LatLng LATLNG_MUMBAI = new LatLng(19.0821978, 72.7410994); + public static LatLng LATLNG_CHENNAI = new LatLng(13.0474878, 80.0689246); + public static LatLng LATLNG_BENGALURU = new LatLng(12.95396, 77.4908523); + public static LatLng LATLNG_KOLKATA = new LatLng(22.6757521, 88.0495361); + + public static List getRoute() { + List mFinalRoute = new ArrayList<>(); + mFinalRoute.add(new LatLng(12.94695, 77.64058)); + mFinalRoute.add(new LatLng(12.94735, 77.64076)); + mFinalRoute.add(new LatLng(12.9476, 77.64081)); + mFinalRoute.add(new LatLng(12.94786, 77.64078)); + mFinalRoute.add(new LatLng(12.94809, 77.6407)); + mFinalRoute.add(new LatLng(12.9483, 77.64058)); + mFinalRoute.add(new LatLng(12.9486, 77.64029)); + mFinalRoute.add(new LatLng(12.94928, 77.63952)); + mFinalRoute.add(new LatLng(12.94946, 77.63936)); + mFinalRoute.add(new LatLng(12.94967, 77.63923)); + mFinalRoute.add(new LatLng(12.94984, 77.63917)); + mFinalRoute.add(new LatLng(12.95006, 77.63912)); + mFinalRoute.add(new LatLng(12.95036, 77.63913)); + mFinalRoute.add(new LatLng(12.95062, 77.63922)); + mFinalRoute.add(new LatLng(12.9517, 77.63978)); + mFinalRoute.add(new LatLng(12.95267, 77.64038)); + mFinalRoute.add(new LatLng(12.95418, 77.64121)); + mFinalRoute.add(new LatLng(12.95443, 77.64125)); + mFinalRoute.add(new LatLng(12.9556, 77.64133)); + mFinalRoute.add(new LatLng(12.95609, 77.64135)); + mFinalRoute.add(new LatLng(12.95698, 77.64136)); + mFinalRoute.add(new LatLng(12.95782, 77.64131)); + mFinalRoute.add(new LatLng(12.95797, 77.64132)); + mFinalRoute.add(new LatLng(12.95818, 77.64135)); + + return mFinalRoute; + } + + public static List getRouteB() { + List mFinalRoute = new ArrayList<>(); + mFinalRoute.add(new LatLng(12.95848, 77.64139)); + mFinalRoute.add(new LatLng(12.95937, 77.64146)); + mFinalRoute.add(new LatLng(12.95968, 77.6415)); + mFinalRoute.add(new LatLng(12.95999, 77.64156)); + mFinalRoute.add(new LatLng(12.96031, 77.64164)); + mFinalRoute.add(new LatLng(12.96054, 77.64169)); + mFinalRoute.add(new LatLng(12.96079, 77.64171)); + mFinalRoute.add(new LatLng(12.96087, 77.64171)); + mFinalRoute.add(new LatLng(12.96099, 77.6417)); + mFinalRoute.add(new LatLng(12.96108, 77.64166)); + mFinalRoute.add(new LatLng(12.96117, 77.64162)); + mFinalRoute.add(new LatLng(12.96122, 77.64158)); + mFinalRoute.add(new LatLng(12.96127, 77.64154)); + mFinalRoute.add(new LatLng(12.96132, 77.64146)); + mFinalRoute.add(new LatLng(12.96136, 77.64131)); + mFinalRoute.add(new LatLng(12.96135, 77.64108)); + mFinalRoute.add(new LatLng(12.9613, 77.64099)); + mFinalRoute.add(new LatLng(12.9612, 77.6409)); + mFinalRoute.add(new LatLng(12.96107, 77.64086)); + mFinalRoute.add(new LatLng(12.96099, 77.64086)); + mFinalRoute.add(new LatLng(12.96091, 77.64089)); + mFinalRoute.add(new LatLng(12.96082, 77.64096)); + mFinalRoute.add(new LatLng(12.96073, 77.64132)); + mFinalRoute.add(new LatLng(12.96066, 77.64208)); + mFinalRoute.add(new LatLng(12.96049, 77.64337)); + mFinalRoute.add(new LatLng(12.96031, 77.6451)); + mFinalRoute.add(new LatLng(12.96023, 77.64577)); + mFinalRoute.add(new LatLng(12.96014, 77.64651)); + mFinalRoute.add(new LatLng(12.96001, 77.64775)); + mFinalRoute.add(new LatLng(12.95981, 77.64909)); + + return mFinalRoute; + } + + public static List getTokyoRoute() { + List mFinalRoute = new ArrayList<>(); + mFinalRoute.add(new LatLng(35.64719, 139.79163)); + mFinalRoute.add(new LatLng(35.64733, 139.7918)); + mFinalRoute.add(new LatLng(35.64752, 139.7919)); + mFinalRoute.add(new LatLng(35.64765, 139.79196)); + mFinalRoute.add(new LatLng(35.6478, 139.79198)); + mFinalRoute.add(new LatLng(35.64806, 139.79196)); + mFinalRoute.add(new LatLng(35.64818, 139.79193)); + mFinalRoute.add(new LatLng(35.6483, 139.79185)); + mFinalRoute.add(new LatLng(35.64847, 139.79172)); + mFinalRoute.add(new LatLng(35.6486, 139.79156)); + mFinalRoute.add(new LatLng(35.64917, 139.79091)); + mFinalRoute.add(new LatLng(35.64914, 139.79088)); + mFinalRoute.add(new LatLng(35.64846, 139.78989)); + mFinalRoute.add(new LatLng(35.64807, 139.78926)); + mFinalRoute.add(new LatLng(35.64769, 139.78963)); + mFinalRoute.add(new LatLng(35.64748, 139.78976)); + mFinalRoute.add(new LatLng(35.64702, 139.79014)); + mFinalRoute.add(new LatLng(35.64635, 139.79064)); + mFinalRoute.add(new LatLng(35.64596, 139.79095)); + mFinalRoute.add(new LatLng(35.64371, 139.79272)); + mFinalRoute.add(new LatLng(35.64293, 139.79335)); + mFinalRoute.add(new LatLng(35.64274, 139.79346)); + mFinalRoute.add(new LatLng(35.6418, 139.79429)); + mFinalRoute.add(new LatLng(35.64019, 139.79558)); + mFinalRoute.add(new LatLng(35.63922, 139.79637)); + mFinalRoute.add(new LatLng(35.63884, 139.79663)); + mFinalRoute.add(new LatLng(35.63851, 139.79674)); + mFinalRoute.add(new LatLng(35.63836, 139.79675)); + mFinalRoute.add(new LatLng(35.63825, 139.79673)); + mFinalRoute.add(new LatLng(35.63809, 139.7967)); + mFinalRoute.add(new LatLng(35.63784, 139.79657)); + mFinalRoute.add(new LatLng(35.63765, 139.79641)); + mFinalRoute.add(new LatLng(35.63747, 139.7962)); + mFinalRoute.add(new LatLng(35.63704, 139.7954)); + mFinalRoute.add(new LatLng(35.63652, 139.79446)); + mFinalRoute.add(new LatLng(35.63583, 139.79319)); + mFinalRoute.add(new LatLng(35.63523, 139.79204)); + mFinalRoute.add(new LatLng(35.63488, 139.79132)); + mFinalRoute.add(new LatLng(35.63469, 139.79085)); + mFinalRoute.add(new LatLng(35.63411, 139.78981)); + mFinalRoute.add(new LatLng(35.63359, 139.78882)); + mFinalRoute.add(new LatLng(35.63337, 139.78853)); + mFinalRoute.add(new LatLng(35.6331, 139.78814)); + mFinalRoute.add(new LatLng(35.63268, 139.7874)); + mFinalRoute.add(new LatLng(35.63173, 139.78565)); + mFinalRoute.add(new LatLng(35.6315, 139.78513)); + mFinalRoute.add(new LatLng(35.63141, 139.78472)); + mFinalRoute.add(new LatLng(35.6314, 139.78439)); + mFinalRoute.add(new LatLng(35.63145, 139.78403)); + mFinalRoute.add(new LatLng(35.63154, 139.78373)); + mFinalRoute.add(new LatLng(35.63171, 139.78343)); + mFinalRoute.add(new LatLng(35.63199, 139.78305)); + mFinalRoute.add(new LatLng(35.63355, 139.7814)); + mFinalRoute.add(new LatLng(35.63478, 139.78039)); + mFinalRoute.add(new LatLng(35.63519, 139.77999)); + mFinalRoute.add(new LatLng(35.63546, 139.77968)); + mFinalRoute.add(new LatLng(35.63561, 139.77943)); + mFinalRoute.add(new LatLng(35.63578, 139.77918)); + mFinalRoute.add(new LatLng(35.6359, 139.77893)); + mFinalRoute.add(new LatLng(35.63617, 139.77829)); + mFinalRoute.add(new LatLng(35.63628, 139.77793)); + mFinalRoute.add(new LatLng(35.63635, 139.77757)); + mFinalRoute.add(new LatLng(35.63645, 139.77696)); + mFinalRoute.add(new LatLng(35.63646, 139.77623)); + mFinalRoute.add(new LatLng(35.6364, 139.77555)); + mFinalRoute.add(new LatLng(35.63626, 139.77471)); + mFinalRoute.add(new LatLng(35.63609, 139.77403)); + mFinalRoute.add(new LatLng(35.63582, 139.77314)); + mFinalRoute.add(new LatLng(35.63549, 139.77222)); + mFinalRoute.add(new LatLng(35.63497, 139.77072)); + mFinalRoute.add(new LatLng(35.63484, 139.77019)); + mFinalRoute.add(new LatLng(35.63479, 139.76986)); + mFinalRoute.add(new LatLng(35.63478, 139.76956)); + mFinalRoute.add(new LatLng(35.6348, 139.7691)); + mFinalRoute.add(new LatLng(35.63487, 139.76851)); + mFinalRoute.add(new LatLng(35.635, 139.76795)); + mFinalRoute.add(new LatLng(35.6354, 139.7667)); + mFinalRoute.add(new LatLng(35.63652, 139.76318)); + mFinalRoute.add(new LatLng(35.63752, 139.76002)); + mFinalRoute.add(new LatLng(35.63781, 139.75913)); + mFinalRoute.add(new LatLng(35.63793, 139.75885)); + mFinalRoute.add(new LatLng(35.6381, 139.75853)); + mFinalRoute.add(new LatLng(35.63834, 139.75823)); + mFinalRoute.add(new LatLng(35.63861, 139.75801)); + mFinalRoute.add(new LatLng(35.63884, 139.75788)); + return mFinalRoute; + } + + public static List getNewYorkRoute() { + List mFinalRoute = new ArrayList<>(); + mFinalRoute.add(new LatLng(40.69293, -73.90815)); + mFinalRoute.add(new LatLng(40.69455, -73.90654)); + mFinalRoute.add(new LatLng(40.69375, -73.90513)); + mFinalRoute.add(new LatLng(40.69304, -73.90387)); + mFinalRoute.add(new LatLng(40.69242, -73.90278)); + mFinalRoute.add(new LatLng(40.69267, -73.90255)); + mFinalRoute.add(new LatLng(40.69283, -73.90238)); + mFinalRoute.add(new LatLng(40.69289, -73.90224)); + mFinalRoute.add(new LatLng(40.69343, -73.90005)); + mFinalRoute.add(new LatLng(40.69347, -73.8999)); + mFinalRoute.add(new LatLng(40.69386, -73.89871)); + mFinalRoute.add(new LatLng(40.69394, -73.89831)); + mFinalRoute.add(new LatLng(40.69411, -73.89733)); + mFinalRoute.add(new LatLng(40.69384, -73.89691)); + mFinalRoute.add(new LatLng(40.69319, -73.89574)); + mFinalRoute.add(new LatLng(40.69266, -73.89479)); + mFinalRoute.add(new LatLng(40.69185, -73.89204)); + mFinalRoute.add(new LatLng(40.69141, -73.89059)); + mFinalRoute.add(new LatLng(40.69107, -73.89054)); + mFinalRoute.add(new LatLng(40.69089, -73.89052)); + mFinalRoute.add(new LatLng(40.69088, -73.89026)); + mFinalRoute.add(new LatLng(40.69084, -73.89006)); + mFinalRoute.add(new LatLng(40.69079, -73.88998)); + mFinalRoute.add(new LatLng(40.69073, -73.88992)); + mFinalRoute.add(new LatLng(40.69059, -73.88986)); + mFinalRoute.add(new LatLng(40.69051, -73.88986)); + mFinalRoute.add(new LatLng(40.69043, -73.88989)); + mFinalRoute.add(new LatLng(40.69026, -73.89001)); + mFinalRoute.add(new LatLng(40.69009, -73.89015)); + mFinalRoute.add(new LatLng(40.68997, -73.89019)); + mFinalRoute.add(new LatLng(40.68974, -73.89038)); + mFinalRoute.add(new LatLng(40.68849, -73.89139)); + mFinalRoute.add(new LatLng(40.68787, -73.89188)); + mFinalRoute.add(new LatLng(40.68692, -73.89266)); + mFinalRoute.add(new LatLng(40.68638, -73.89312)); + mFinalRoute.add(new LatLng(40.68557, -73.89393)); + mFinalRoute.add(new LatLng(40.68497, -73.89454)); + mFinalRoute.add(new LatLng(40.68441, -73.89507)); + mFinalRoute.add(new LatLng(40.68385, -73.89554)); + mFinalRoute.add(new LatLng(40.68335, -73.89594)); + mFinalRoute.add(new LatLng(40.68282, -73.8963)); + mFinalRoute.add(new LatLng(40.68239, -73.89651)); + mFinalRoute.add(new LatLng(40.6821, -73.89659)); + mFinalRoute.add(new LatLng(40.68177, -73.89661)); + mFinalRoute.add(new LatLng(40.68085, -73.89668)); + mFinalRoute.add(new LatLng(40.68062, -73.89672)); + mFinalRoute.add(new LatLng(40.68021, -73.89682)); + mFinalRoute.add(new LatLng(40.67958, -73.89707)); + mFinalRoute.add(new LatLng(40.67893, -73.89741)); + mFinalRoute.add(new LatLng(40.6786, -73.89747)); + mFinalRoute.add(new LatLng(40.67835, -73.89752)); + mFinalRoute.add(new LatLng(40.67821, -73.89753)); + mFinalRoute.add(new LatLng(40.67806, -73.89759)); + mFinalRoute.add(new LatLng(40.67795, -73.89742)); + mFinalRoute.add(new LatLng(40.67721, -73.89722)); + mFinalRoute.add(new LatLng(40.67597, -73.89691)); + mFinalRoute.add(new LatLng(40.6756, -73.89683)); + mFinalRoute.add(new LatLng(40.67294, -73.89614)); + mFinalRoute.add(new LatLng(40.66937, -73.89522)); + mFinalRoute.add(new LatLng(40.6663, -73.89444)); + mFinalRoute.add(new LatLng(40.66476, -73.89406)); + mFinalRoute.add(new LatLng(40.66322, -73.89364)); + mFinalRoute.add(new LatLng(40.66256, -73.89348)); + mFinalRoute.add(new LatLng(40.66234, -73.89341)); + mFinalRoute.add(new LatLng(40.66205, -73.89326)); + mFinalRoute.add(new LatLng(40.66167, -73.89298)); + mFinalRoute.add(new LatLng(40.66145, -73.89278)); + mFinalRoute.add(new LatLng(40.66088, -73.89235)); + mFinalRoute.add(new LatLng(40.65993, -73.89164)); + mFinalRoute.add(new LatLng(40.65909, -73.89104)); + mFinalRoute.add(new LatLng(40.65884, -73.89085)); + mFinalRoute.add(new LatLng(40.65869, -73.89081)); + mFinalRoute.add(new LatLng(40.65859, -73.89075)); + mFinalRoute.add(new LatLng(40.65839, -73.89059)); + mFinalRoute.add(new LatLng(40.65694, -73.88948)); + mFinalRoute.add(new LatLng(40.65546, -73.88839)); + mFinalRoute.add(new LatLng(40.65365, -73.88703)); + mFinalRoute.add(new LatLng(40.65279, -73.8864)); + mFinalRoute.add(new LatLng(40.65267, -73.88636)); + mFinalRoute.add(new LatLng(40.65232, -73.88609)); + mFinalRoute.add(new LatLng(40.65119, -73.88522)); + mFinalRoute.add(new LatLng(40.65073, -73.88489)); + mFinalRoute.add(new LatLng(40.65023, -73.88451)); + mFinalRoute.add(new LatLng(40.65007, -73.88435)); + return mFinalRoute; + } + + public static List getIndiranagarBounds() { + List latLngs = new ArrayList<>(); + latLngs.add(new LatLng(12.9715002, 77.6374856));//NW + latLngs.add(new LatLng(12.9703733, 77.6372037));//NE + latLngs.add(new LatLng(12.9595674, 77.6366595));//SE + latLngs.add(new LatLng(12.9595672, 77.6519803));//SW + return latLngs; + } + + //Indiranagar routes + public static ArrayList getIndiranagarRoutes() { + ArrayList carRoute = new ArrayList<>(); + carRoute.add(getCarForRoute(getRoute1(), 1)); + carRoute.add(getCarForRoute(getRoute2(), 2)); + carRoute.add(getCarForRoute(getRoute3(), 3)); + carRoute.add(getCarForRoute(getRoute4(), 4)); + carRoute.add(getCarForRoute(getRoute5(), 5)); + carRoute.add(getCarForRoute(getRoute6(), 6)); + carRoute.add(getCarForRoute(getRoute7(), 7)); + carRoute.add(getCarForRoute(getRoute8(), 8)); + carRoute.add(getCarForRoute(getRoute9(), 9)); + carRoute.add(getCarForRoute(getRoute10(), 10)); + carRoute.add(getCarForRoute(getRoute11(), 11)); + carRoute.add(getCarForRoute(getRoute12(), 12)); + carRoute.add(getCarForRoute(getRoute13(), 13)); + carRoute.add(getCarForRoute(getRoute14(), 14)); + carRoute.add(getCarForRoute(getRoute15(), 15)); + carRoute.add(getCarForRoute(getRoute16(), 16)); + carRoute.add(getCarForRoute(getRoute17(), 17)); + carRoute.add(getCarForRoute(getRoute18(), 18)); + carRoute.add(getCarForRoute(getRoute19(), 19)); + carRoute.add(getCarForRoute(getRoute20(), 20)); + carRoute.add(getCarForRoute(getRoute21(), 21)); + carRoute.add(getCarForRoute(getRoute22(), 22)); + carRoute.add(getCarForRoute(getRoute23(), 23)); + carRoute.add(getCarForRoute(getRoute24(), 24)); + carRoute.add(getCarForRoute(getRoute25(), 25)); + carRoute.add(getCarForRoute(getRoute26(), 26)); + carRoute.add(getCarForRoute(getRoute27(), 27)); + carRoute.add(getCarForRoute(getRoute28(), 28)); + return carRoute; + } + + private static Car getCarForRoute(List latLngs, int count) { + Car car = new Car(); + car.setCarId(count); + car.setCurrentPointer(0); + car.setRoute(latLngs); + return car; + } + + private static ArrayList getRoute1() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9710101, 77.638021)); + route.add(new LatLng(12.97104, 77.638741)); + route.add(new LatLng(12.97057, 77.638771)); + route.add(new LatLng(12.9695002, 77.6388)); + route.add(new LatLng(12.96837, 77.63888)); + route.add(new LatLng(12.9684202, 77.639321)); + route.add(new LatLng(12.9685, 77.640121)); + route.add(new LatLng(12.9685301, 77.64069)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9686, 77.6414)); + route.add(new LatLng(12.96784, 77.64144)); + route.add(new LatLng(12.96696, 77.64148)); + route.add(new LatLng(12.9668401, 77.641501)); + route.add(new LatLng(12.9665902, 77.64234)); + route.add(new LatLng(12.9664502, 77.642671)); + route.add(new LatLng(12.96639, 77.642901)); + route.add(new LatLng(12.9662, 77.644061)); + route.add(new LatLng(12.96616, 77.64457)); + route.add(new LatLng(12.9661301, 77.64476)); + route.add(new LatLng(12.9659901, 77.64515)); + route.add(new LatLng(12.9657902, 77.64546)); + route.add(new LatLng(12.96569, 77.6456)); + route.add(new LatLng(12.9655201, 77.64579)); + route.add(new LatLng(12.96531, 77.64592)); + route.add(new LatLng(12.96513, 77.646031)); + return route; + } + + private static ArrayList getRoute2() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9694602, 77.63812)); + route.add(new LatLng(12.9695002, 77.6388)); + route.add(new LatLng(12.96959, 77.6397)); + route.add(new LatLng(12.9696101, 77.640161)); + route.add(new LatLng(12.96958, 77.640161)); + route.add(new LatLng(12.96851, 77.64024)); + route.add(new LatLng(12.9685301, 77.64073)); + route.add(new LatLng(12.9686, 77.6414)); + route.add(new LatLng(12.9686102, 77.64203)); + route.add(new LatLng(12.9686, 77.6427)); + route.add(new LatLng(12.96865, 77.644141)); + route.add(new LatLng(12.9687002, 77.64561)); + route.add(new LatLng(12.96874, 77.64632)); + return route; + } + + private static ArrayList getRoute3() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.97633, 77.6379)); + route.add(new LatLng(12.97601, 77.637921)); + route.add(new LatLng(12.97601, 77.63826)); + route.add(new LatLng(12.9760302, 77.638951)); + route.add(new LatLng(12.9760702, 77.63988)); + route.add(new LatLng(12.9760801, 77.64019)); + route.add(new LatLng(12.97572, 77.64022)); + route.add(new LatLng(12.9741902, 77.64028)); + route.add(new LatLng(12.9734101, 77.64031)); + route.add(new LatLng(12.97343, 77.641071)); + route.add(new LatLng(12.9738401, 77.64105)); + route.add(new LatLng(12.97385, 77.641141)); + route.add(new LatLng(12.97389, 77.642681)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.97399, 77.64537)); + route.add(new LatLng(12.9740701, 77.64685)); + route.add(new LatLng(12.9740701, 77.64691)); + route.add(new LatLng(12.9736802, 77.646931)); + route.add(new LatLng(12.97352, 77.646921)); + route.add(new LatLng(12.9731102, 77.64691)); + route.add(new LatLng(12.9724201, 77.647021)); + route.add(new LatLng(12.9719601, 77.64712)); + route.add(new LatLng(12.9704601, 77.647411)); + route.add(new LatLng(12.9694, 77.64763)); + route.add(new LatLng(12.9690001, 77.647731)); + route.add(new LatLng(12.9689001, 77.64779)); + route.add(new LatLng(12.96887, 77.64802)); + route.add(new LatLng(12.9687002, 77.6491)); + route.add(new LatLng(12.96846, 77.65012)); + route.add(new LatLng(12.9684, 77.65058)); + route.add(new LatLng(12.96826, 77.6511)); + route.add(new LatLng(12.9681501, 77.65156)); + route.add(new LatLng(12.9680201, 77.652251)); + route.add(new LatLng(12.96587, 77.65139)); + route.add(new LatLng(12.96385, 77.65054)); + route.add(new LatLng(12.9632801, 77.650331)); + return route; + } + + private static ArrayList getRoute4() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9627201, 77.64564)); + route.add(new LatLng(12.96264, 77.646021)); + route.add(new LatLng(12.9621101, 77.64591)); + route.add(new LatLng(12.96197, 77.64588)); + route.add(new LatLng(12.9619902, 77.64542)); + route.add(new LatLng(12.9621302, 77.645441)); + route.add(new LatLng(12.9621402, 77.64543)); + route.add(new LatLng(12.9622901, 77.644411)); + route.add(new LatLng(12.9623702, 77.643751)); + route.add(new LatLng(12.96241, 77.64346)); + route.add(new LatLng(12.9626701, 77.6435)); + route.add(new LatLng(12.9632102, 77.64363)); + route.add(new LatLng(12.9633701, 77.642261)); + route.add(new LatLng(12.9633502, 77.64176)); + route.add(new LatLng(12.9633201, 77.641561)); + route.add(new LatLng(12.9635902, 77.64091)); + route.add(new LatLng(12.964, 77.640131)); + route.add(new LatLng(12.9642502, 77.639671)); + route.add(new LatLng(12.96447, 77.63929)); + route.add(new LatLng(12.96475, 77.63888)); + route.add(new LatLng(12.96362, 77.63839)); + route.add(new LatLng(12.9633502, 77.638241)); + return route; + } + + private static ArrayList getRoute5() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9712402, 77.643651)); + route.add(new LatLng(12.97085, 77.643661)); + route.add(new LatLng(12.9708801, 77.644511)); + route.add(new LatLng(12.97089, 77.64494)); + route.add(new LatLng(12.9703601, 77.64494)); + route.add(new LatLng(12.9703902, 77.64574)); + route.add(new LatLng(12.9704402, 77.64721)); + route.add(new LatLng(12.9704601, 77.647411)); + route.add(new LatLng(12.9701102, 77.64748)); + route.add(new LatLng(12.96958, 77.647591)); + route.add(new LatLng(12.9690802, 77.64771)); + route.add(new LatLng(12.96892, 77.647771)); + route.add(new LatLng(12.9687701, 77.647771)); + route.add(new LatLng(12.96841, 77.647831)); + route.add(new LatLng(12.96836, 77.64788)); + route.add(new LatLng(12.9680201, 77.647951)); + route.add(new LatLng(12.9675901, 77.6481)); + route.add(new LatLng(12.9671301, 77.64829)); + route.add(new LatLng(12.9670602, 77.648221)); + route.add(new LatLng(12.9653001, 77.64734)); + route.add(new LatLng(12.96494, 77.64717)); + route.add(new LatLng(12.9649101, 77.64718)); + route.add(new LatLng(12.96479, 77.64744)); + route.add(new LatLng(12.96475, 77.647551)); + route.add(new LatLng(12.9647202, 77.64752)); + route.add(new LatLng(12.9647, 77.647501)); + route.add(new LatLng(12.9640301, 77.64727)); + route.add(new LatLng(12.964, 77.64726)); + route.add(new LatLng(12.9639602, 77.64745)); + route.add(new LatLng(12.9635902, 77.647321)); + route.add(new LatLng(12.9636001, 77.64725)); + route.add(new LatLng(12.9636802, 77.64669)); + route.add(new LatLng(12.9638901, 77.645811)); + return route; + } + + private static ArrayList getRoute6() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.97347, 77.64583)); + route.add(new LatLng(12.9734501, 77.645441)); + route.add(new LatLng(12.97339, 77.64485)); + route.add(new LatLng(12.97339, 77.644831)); + route.add(new LatLng(12.9739602, 77.64481)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.97389, 77.642681)); + route.add(new LatLng(12.9738801, 77.642351)); + return route; + } + + private static ArrayList getRoute7() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9617602, 77.646531)); + route.add(new LatLng(12.96193, 77.64664)); + route.add(new LatLng(12.9620402, 77.646751)); + route.add(new LatLng(12.9624202, 77.64691)); + route.add(new LatLng(12.9627502, 77.64703)); + route.add(new LatLng(12.9631301, 77.64713)); + route.add(new LatLng(12.9632701, 77.647201)); + route.add(new LatLng(12.9634002, 77.647281)); + route.add(new LatLng(12.9635902, 77.647321)); + route.add(new LatLng(12.9636802, 77.64669)); + route.add(new LatLng(12.96395, 77.645581)); + route.add(new LatLng(12.9639801, 77.64552)); + route.add(new LatLng(12.96414, 77.64484)); + route.add(new LatLng(12.9643601, 77.643921)); + route.add(new LatLng(12.9646801, 77.643981)); + return route; + } + + private static ArrayList getRoute8() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.96527, 77.64)); + route.add(new LatLng(12.9656701, 77.64011)); + route.add(new LatLng(12.9657701, 77.64015)); + route.add(new LatLng(12.96578, 77.64018)); + route.add(new LatLng(12.9658402, 77.640201)); + route.add(new LatLng(12.9660401, 77.640261)); + route.add(new LatLng(12.9659501, 77.64054)); + route.add(new LatLng(12.9658402, 77.640931)); + route.add(new LatLng(12.9658101, 77.64113)); + route.add(new LatLng(12.96582, 77.641461)); + route.add(new LatLng(12.96644, 77.64143)); + route.add(new LatLng(12.9671, 77.6414)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9686, 77.6414)); + route.add(new LatLng(12.9686102, 77.64203)); + route.add(new LatLng(12.9686, 77.6427)); + route.add(new LatLng(12.96864, 77.6435)); + route.add(new LatLng(12.96907, 77.6435)); + route.add(new LatLng(12.96972, 77.64346)); + route.add(new LatLng(12.9703201, 77.643431)); + route.add(new LatLng(12.9703201, 77.643291)); + route.add(new LatLng(12.97047, 77.64328)); + route.add(new LatLng(12.9708202, 77.643251)); + route.add(new LatLng(12.9714302, 77.64322)); + return route; + } + + private static ArrayList getRoute9() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.97118, 77.639171)); + route.add(new LatLng(12.97258, 77.63911)); + route.add(new LatLng(12.9726002, 77.63991)); + route.add(new LatLng(12.9726402, 77.641111)); + route.add(new LatLng(12.9738401, 77.64105)); + route.add(new LatLng(12.9738602, 77.641771)); + route.add(new LatLng(12.97389, 77.643081)); + route.add(new LatLng(12.97394, 77.644231)); + route.add(new LatLng(12.97399, 77.64528)); + route.add(new LatLng(12.9744302, 77.645141)); + route.add(new LatLng(12.97446, 77.64519)); + route.add(new LatLng(12.9744802, 77.645271)); + route.add(new LatLng(12.9745, 77.645491)); + return route; + } + + private static ArrayList getRoute10() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9765402, 77.65004)); + route.add(new LatLng(12.97428, 77.649431)); + route.add(new LatLng(12.9743001, 77.649381)); + route.add(new LatLng(12.9745, 77.648851)); + route.add(new LatLng(12.97455, 77.648721)); + route.add(new LatLng(12.9745401, 77.648671)); + route.add(new LatLng(12.97441, 77.64857)); + route.add(new LatLng(12.97437, 77.6483)); + route.add(new LatLng(12.9743501, 77.64766)); + route.add(new LatLng(12.9743501, 77.64761)); + route.add(new LatLng(12.97503, 77.647561)); + route.add(new LatLng(12.9749902, 77.64686)); + route.add(new LatLng(12.9740701, 77.64691)); + route.add(new LatLng(12.97403, 77.645941)); + route.add(new LatLng(12.97399, 77.64528)); + route.add(new LatLng(12.97394, 77.644231)); + route.add(new LatLng(12.97389, 77.643081)); + route.add(new LatLng(12.9738602, 77.641771)); + route.add(new LatLng(12.97385, 77.641141)); + route.add(new LatLng(12.9734501, 77.64116)); + route.add(new LatLng(12.9720001, 77.641241)); + route.add(new LatLng(12.9701801, 77.6413)); + route.add(new LatLng(12.9688502, 77.6414)); + route.add(new LatLng(12.9686, 77.6414)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9685301, 77.64069)); + route.add(new LatLng(12.9685, 77.640121)); + route.add(new LatLng(12.9684202, 77.639321)); + route.add(new LatLng(12.96836, 77.63848)); + route.add(new LatLng(12.9679701, 77.63852)); + route.add(new LatLng(12.96765, 77.638591)); + route.add(new LatLng(12.96752, 77.638591)); + route.add(new LatLng(12.9674001, 77.638561)); + route.add(new LatLng(12.9671301, 77.638461)); + route.add(new LatLng(12.9667501, 77.638381)); + route.add(new LatLng(12.9665902, 77.63835)); + return route; + } + + private static ArrayList getRoute11() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9726502, 77.65013)); + route.add(new LatLng(12.9727101, 77.649831)); + route.add(new LatLng(12.97278, 77.649441)); + route.add(new LatLng(12.97315, 77.6495)); + route.add(new LatLng(12.9736901, 77.649561)); + route.add(new LatLng(12.97376, 77.649571)); + route.add(new LatLng(12.97418, 77.64969)); + route.add(new LatLng(12.97428, 77.649431)); + route.add(new LatLng(12.9745401, 77.648761)); + route.add(new LatLng(12.97455, 77.64869)); + route.add(new LatLng(12.9745202, 77.64864)); + route.add(new LatLng(12.97442, 77.648591)); + route.add(new LatLng(12.9744001, 77.648541)); + route.add(new LatLng(12.9743802, 77.648451)); + route.add(new LatLng(12.9743501, 77.647991)); + route.add(new LatLng(12.9743501, 77.64761)); + route.add(new LatLng(12.97503, 77.647561)); + route.add(new LatLng(12.9749902, 77.64686)); + route.add(new LatLng(12.9740701, 77.64691)); + route.add(new LatLng(12.9740701, 77.64685)); + route.add(new LatLng(12.97399, 77.64537)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.97389, 77.643081)); + route.add(new LatLng(12.97334, 77.643121)); + route.add(new LatLng(12.9733201, 77.64265)); + route.add(new LatLng(12.9731102, 77.64266)); + return route; + } + + private static ArrayList getRoute12() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9750501, 77.644641)); + route.add(new LatLng(12.9750501, 77.6435)); + route.add(new LatLng(12.9744501, 77.64351)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.97389, 77.643081)); + route.add(new LatLng(12.9738602, 77.641771)); + route.add(new LatLng(12.97385, 77.641141)); + route.add(new LatLng(12.9734501, 77.64116)); + route.add(new LatLng(12.9720001, 77.641241)); + route.add(new LatLng(12.9701801, 77.6413)); + route.add(new LatLng(12.9688502, 77.6414)); + route.add(new LatLng(12.96784, 77.64144)); + route.add(new LatLng(12.96696, 77.64148)); + route.add(new LatLng(12.9668401, 77.641501)); + route.add(new LatLng(12.9665902, 77.64234)); + route.add(new LatLng(12.9664502, 77.642671)); + route.add(new LatLng(12.96639, 77.642901)); + route.add(new LatLng(12.9662, 77.644061)); + route.add(new LatLng(12.9661901, 77.644191)); + route.add(new LatLng(12.9659501, 77.64413)); + route.add(new LatLng(12.96569, 77.644111)); + route.add(new LatLng(12.9654702, 77.644101)); + route.add(new LatLng(12.96513, 77.644061)); + route.add(new LatLng(12.9643601, 77.643921)); + route.add(new LatLng(12.96413, 77.64489)); + return route; + } + + private static ArrayList getRoute13() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9658501, 77.636621)); + route.add(new LatLng(12.9658902, 77.636581)); + route.add(new LatLng(12.96615, 77.63691)); + route.add(new LatLng(12.9665201, 77.63664)); + route.add(new LatLng(12.96686, 77.63706)); + route.add(new LatLng(12.9669702, 77.637121)); + route.add(new LatLng(12.96808, 77.63724)); + route.add(new LatLng(12.9682501, 77.637291)); + route.add(new LatLng(12.9683001, 77.637351)); + route.add(new LatLng(12.96836, 77.63848)); + route.add(new LatLng(12.9684202, 77.639321)); + route.add(new LatLng(12.9685, 77.640121)); + route.add(new LatLng(12.9685301, 77.64069)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9686102, 77.64203)); + route.add(new LatLng(12.9686, 77.6427)); + route.add(new LatLng(12.96864, 77.6435)); + route.add(new LatLng(12.9686701, 77.64484)); + route.add(new LatLng(12.9687002, 77.64561)); + route.add(new LatLng(12.9688402, 77.6477)); + route.add(new LatLng(12.9688402, 77.647771)); + route.add(new LatLng(12.96892, 77.647771)); + route.add(new LatLng(12.9688902, 77.647821)); + route.add(new LatLng(12.96887, 77.647991)); + route.add(new LatLng(12.9687502, 77.64875)); + route.add(new LatLng(12.9692301, 77.648811)); + route.add(new LatLng(12.9699401, 77.64891)); + route.add(new LatLng(12.9699702, 77.64972)); + return route; + } + + private static ArrayList getRoute14() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9742101, 77.63459)); + route.add(new LatLng(12.9739301, 77.63459)); + route.add(new LatLng(12.97371, 77.6346)); + route.add(new LatLng(12.9733601, 77.634651)); + route.add(new LatLng(12.97328, 77.634701)); + route.add(new LatLng(12.97324, 77.634801)); + route.add(new LatLng(12.9729702, 77.63473)); + route.add(new LatLng(12.973, 77.634891)); + route.add(new LatLng(12.9730301, 77.635191)); + route.add(new LatLng(12.9731202, 77.6359)); + route.add(new LatLng(12.9727101, 77.63594)); + route.add(new LatLng(12.9720001, 77.63599)); + route.add(new LatLng(12.9716701, 77.63597)); + route.add(new LatLng(12.9715, 77.63598)); + route.add(new LatLng(12.9704402, 77.63597)); + route.add(new LatLng(12.9698501, 77.635951)); + route.add(new LatLng(12.96934, 77.63598)); + route.add(new LatLng(12.9694301, 77.637621)); + route.add(new LatLng(12.9694701, 77.63843)); + route.add(new LatLng(12.9695502, 77.639271)); + route.add(new LatLng(12.9696101, 77.640161)); + route.add(new LatLng(12.96855, 77.64024)); + route.add(new LatLng(12.96851, 77.64024)); + route.add(new LatLng(12.96851, 77.64028)); + route.add(new LatLng(12.9685301, 77.64069)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9686, 77.6414)); + route.add(new LatLng(12.96784, 77.64144)); + route.add(new LatLng(12.96696, 77.64148)); + route.add(new LatLng(12.9637802, 77.641641)); + route.add(new LatLng(12.9633201, 77.64166)); + route.add(new LatLng(12.96264, 77.641691)); + route.add(new LatLng(12.96254, 77.64243)); + route.add(new LatLng(12.9623702, 77.643751)); + route.add(new LatLng(12.96231, 77.64408)); + route.add(new LatLng(12.9631801, 77.644291)); + + return route; + } + + private static ArrayList getRoute15() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9728802, 77.64905)); + route.add(new LatLng(12.97278, 77.649441)); + route.add(new LatLng(12.9727101, 77.649831)); + route.add(new LatLng(12.9726502, 77.65013)); + route.add(new LatLng(12.9726002, 77.65016)); + route.add(new LatLng(12.97239, 77.650141)); + route.add(new LatLng(12.9724102, 77.650331)); + route.add(new LatLng(12.9724602, 77.65061)); + route.add(new LatLng(12.9721401, 77.65067)); + route.add(new LatLng(12.9715401, 77.650771)); + route.add(new LatLng(12.9714401, 77.650781)); + route.add(new LatLng(12.9714202, 77.650561)); + route.add(new LatLng(12.97127, 77.649621)); + route.add(new LatLng(12.97123, 77.649391)); + route.add(new LatLng(12.97112, 77.648681)); + route.add(new LatLng(12.97103, 77.64838)); + route.add(new LatLng(12.97098, 77.647911)); + route.add(new LatLng(12.97095, 77.64731)); + route.add(new LatLng(12.9704601, 77.647411)); + route.add(new LatLng(12.97042, 77.64685)); + route.add(new LatLng(12.97038, 77.64551)); + route.add(new LatLng(12.9691302, 77.645581)); + route.add(new LatLng(12.9687002, 77.64561)); + route.add(new LatLng(12.96794, 77.64564)); + route.add(new LatLng(12.9677202, 77.64564)); + route.add(new LatLng(12.9676302, 77.64557)); + route.add(new LatLng(12.9676001, 77.645441)); + route.add(new LatLng(12.9675802, 77.64448)); + route.add(new LatLng(12.9674902, 77.64275)); + route.add(new LatLng(12.9675001, 77.64206)); + route.add(new LatLng(12.9674902, 77.64144)); + route.add(new LatLng(12.96696, 77.64148)); + route.add(new LatLng(12.9668401, 77.641501)); + route.add(new LatLng(12.96685, 77.641421)); + route.add(new LatLng(12.9670801, 77.64059)); + route.add(new LatLng(12.96723, 77.640131)); + route.add(new LatLng(12.9671201, 77.639851)); + route.add(new LatLng(12.9670701, 77.639591)); + return route; + } + + private static ArrayList getRoute16() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9631301, 77.63907)); + route.add(new LatLng(12.9633102, 77.638771)); + route.add(new LatLng(12.96362, 77.63839)); + route.add(new LatLng(12.9631702, 77.63814)); + route.add(new LatLng(12.9626502, 77.63782)); + route.add(new LatLng(12.96236, 77.637611)); + route.add(new LatLng(12.9616702, 77.638191)); + route.add(new LatLng(12.96119, 77.638641)); + route.add(new LatLng(12.96109, 77.638691)); + route.add(new LatLng(12.96105, 77.6387)); + route.add(new LatLng(12.9610301, 77.63898)); + route.add(new LatLng(12.9608901, 77.63956)); + route.add(new LatLng(12.9608301, 77.64009)); + route.add(new LatLng(12.96076, 77.64073)); + route.add(new LatLng(12.9606901, 77.641831)); + route.add(new LatLng(12.9605501, 77.642941)); + route.add(new LatLng(12.96047, 77.64337)); + route.add(new LatLng(12.96062, 77.643381)); + route.add(new LatLng(12.96127, 77.64341)); + route.add(new LatLng(12.96146, 77.643441)); + route.add(new LatLng(12.96241, 77.64346)); + route.add(new LatLng(12.96291, 77.64355)); + route.add(new LatLng(12.96352, 77.643711)); + route.add(new LatLng(12.9639301, 77.64381)); + route.add(new LatLng(12.9643601, 77.643921)); + route.add(new LatLng(12.96414, 77.64484)); + route.add(new LatLng(12.96465, 77.64498)); + route.add(new LatLng(12.9649502, 77.64502)); + route.add(new LatLng(12.9647701, 77.6456)); + return route; + } + + private static ArrayList getRoute17() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.97577, 77.63826)); + route.add(new LatLng(12.97601, 77.63826)); + route.add(new LatLng(12.9760302, 77.638951)); + route.add(new LatLng(12.9760702, 77.63988)); + route.add(new LatLng(12.9760801, 77.64019)); + route.add(new LatLng(12.97572, 77.64022)); + route.add(new LatLng(12.9741902, 77.64028)); + route.add(new LatLng(12.9734101, 77.64031)); + route.add(new LatLng(12.97343, 77.641071)); + route.add(new LatLng(12.9738401, 77.64105)); + route.add(new LatLng(12.97385, 77.641141)); + route.add(new LatLng(12.97389, 77.642681)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.9739602, 77.64481)); + route.add(new LatLng(12.9726902, 77.644861)); + route.add(new LatLng(12.9716301, 77.64494)); + route.add(new LatLng(12.9716201, 77.644591)); + return route; + } - public static List getRoute() { - List mFinalRoute = new ArrayList<>(); - mFinalRoute.add(new LatLng(12.94695, 77.64058)); - mFinalRoute.add(new LatLng(12.94735, 77.64076)); - mFinalRoute.add(new LatLng(12.9476, 77.64081)); - mFinalRoute.add(new LatLng(12.94786, 77.64078)); - mFinalRoute.add(new LatLng(12.94809, 77.6407)); - mFinalRoute.add(new LatLng(12.9483, 77.64058)); - mFinalRoute.add(new LatLng(12.9486, 77.64029)); - mFinalRoute.add(new LatLng(12.94928, 77.63952)); - mFinalRoute.add(new LatLng(12.94946, 77.63936)); - mFinalRoute.add(new LatLng(12.94967, 77.63923)); - mFinalRoute.add(new LatLng(12.94984, 77.63917)); - mFinalRoute.add(new LatLng(12.95006, 77.63912)); - mFinalRoute.add(new LatLng(12.95036, 77.63913)); - mFinalRoute.add(new LatLng(12.95062, 77.63922)); - mFinalRoute.add(new LatLng(12.9517, 77.63978)); - mFinalRoute.add(new LatLng(12.95267, 77.64038)); - mFinalRoute.add(new LatLng(12.95418, 77.64121)); - mFinalRoute.add(new LatLng(12.95443, 77.64125)); - mFinalRoute.add(new LatLng(12.9556, 77.64133)); - mFinalRoute.add(new LatLng(12.95609, 77.64135)); - mFinalRoute.add(new LatLng(12.95698, 77.64136)); - mFinalRoute.add(new LatLng(12.95782, 77.64131)); - mFinalRoute.add(new LatLng(12.95797, 77.64132)); - mFinalRoute.add(new LatLng(12.95818, 77.64135)); + private static ArrayList getRoute18() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9587301, 77.639411)); + route.add(new LatLng(12.9588601, 77.63845)); + route.add(new LatLng(12.9588601, 77.63836)); + route.add(new LatLng(12.9602301, 77.63854)); + route.add(new LatLng(12.96076, 77.638601)); + route.add(new LatLng(12.96095, 77.638691)); + route.add(new LatLng(12.96105, 77.6387)); + route.add(new LatLng(12.9610301, 77.63898)); + route.add(new LatLng(12.9608901, 77.63956)); + route.add(new LatLng(12.9608301, 77.64009)); + route.add(new LatLng(12.96076, 77.64073)); + route.add(new LatLng(12.9606901, 77.641831)); + route.add(new LatLng(12.9605501, 77.642941)); + route.add(new LatLng(12.96047, 77.64337)); + route.add(new LatLng(12.96034, 77.644551)); + route.add(new LatLng(12.9602, 77.645591)); + route.add(new LatLng(12.96133, 77.645801)); + route.add(new LatLng(12.9621101, 77.64591)); + route.add(new LatLng(12.96264, 77.646021)); + route.add(new LatLng(12.9627101, 77.645711)); - return mFinalRoute; - } + return route; + } - public static List getRouteB() { - List mFinalRoute = new ArrayList<>(); - mFinalRoute.add(new LatLng(12.95848, 77.64139)); - mFinalRoute.add(new LatLng(12.95937, 77.64146)); - mFinalRoute.add(new LatLng(12.95968, 77.6415)); - mFinalRoute.add(new LatLng(12.95999, 77.64156)); - mFinalRoute.add(new LatLng(12.96031, 77.64164)); - mFinalRoute.add(new LatLng(12.96054, 77.64169)); - mFinalRoute.add(new LatLng(12.96079, 77.64171)); - mFinalRoute.add(new LatLng(12.96087, 77.64171)); - mFinalRoute.add(new LatLng(12.96099, 77.6417)); - mFinalRoute.add(new LatLng(12.96108, 77.64166)); - mFinalRoute.add(new LatLng(12.96117, 77.64162)); - mFinalRoute.add(new LatLng(12.96122, 77.64158)); - mFinalRoute.add(new LatLng(12.96127, 77.64154)); - mFinalRoute.add(new LatLng(12.96132, 77.64146)); - mFinalRoute.add(new LatLng(12.96136, 77.64131)); - mFinalRoute.add(new LatLng(12.96135, 77.64108)); - mFinalRoute.add(new LatLng(12.9613, 77.64099)); - mFinalRoute.add(new LatLng(12.9612, 77.6409)); - mFinalRoute.add(new LatLng(12.96107, 77.64086)); - mFinalRoute.add(new LatLng(12.96099, 77.64086)); - mFinalRoute.add(new LatLng(12.96091, 77.64089)); - mFinalRoute.add(new LatLng(12.96082, 77.64096)); - mFinalRoute.add(new LatLng(12.96073, 77.64132)); - mFinalRoute.add(new LatLng(12.96066, 77.64208)); - mFinalRoute.add(new LatLng(12.96049, 77.64337)); - mFinalRoute.add(new LatLng(12.96031, 77.6451)); - mFinalRoute.add(new LatLng(12.96023, 77.64577)); - mFinalRoute.add(new LatLng(12.96014, 77.64651)); - mFinalRoute.add(new LatLng(12.96001, 77.64775)); - mFinalRoute.add(new LatLng(12.95981, 77.64909)); + private static ArrayList getRoute19() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9674501, 77.6393)); + route.add(new LatLng(12.96775, 77.63942)); + route.add(new LatLng(12.96766, 77.63961)); + route.add(new LatLng(12.9675302, 77.63987)); + route.add(new LatLng(12.9674802, 77.640071)); + route.add(new LatLng(12.96746, 77.64019)); + route.add(new LatLng(12.96738, 77.640161)); + route.add(new LatLng(12.96723, 77.640131)); + route.add(new LatLng(12.9672002, 77.64018)); + route.add(new LatLng(12.9669702, 77.64099)); + route.add(new LatLng(12.9668401, 77.641501)); + route.add(new LatLng(12.96606, 77.64152)); + route.add(new LatLng(12.9634002, 77.64166)); + route.add(new LatLng(12.9625, 77.6417)); + route.add(new LatLng(12.96245, 77.64175)); + route.add(new LatLng(12.96194, 77.64179)); + route.add(new LatLng(12.9617801, 77.641821)); + route.add(new LatLng(12.9616, 77.64193)); + route.add(new LatLng(12.9615202, 77.642011)); + route.add(new LatLng(12.9614401, 77.64215)); + route.add(new LatLng(12.96118, 77.64309)); + route.add(new LatLng(12.96113, 77.64318)); + route.add(new LatLng(12.96104, 77.643291)); + route.add(new LatLng(12.9608801, 77.6434)); + route.add(new LatLng(12.96047, 77.64337)); + route.add(new LatLng(12.9602701, 77.645041)); + route.add(new LatLng(12.96011, 77.646351)); + route.add(new LatLng(12.9599901, 77.64743)); + route.add(new LatLng(12.9599302, 77.64802)); + route.add(new LatLng(12.95982, 77.649071)); + route.add(new LatLng(12.95973, 77.64906)); + route.add(new LatLng(12.95982, 77.64837)); + route.add(new LatLng(12.9599302, 77.647381)); + route.add(new LatLng(12.9600702, 77.645991)); + route.add(new LatLng(12.9598001, 77.645901)); + route.add(new LatLng(12.95959, 77.64579)); + route.add(new LatLng(12.95889, 77.645501)); + route.add(new LatLng(12.9583802, 77.64524)); + route.add(new LatLng(12.9580502, 77.6451)); + route.add(new LatLng(12.9577202, 77.64493)); + route.add(new LatLng(12.9576901, 77.644911)); + route.add(new LatLng(12.9577901, 77.64472)); + route.add(new LatLng(12.9578602, 77.644561)); + route.add(new LatLng(12.95809, 77.64386)); + return route; + } - return mFinalRoute; - } + private static ArrayList getRoute20() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.96982, 77.64345)); + route.add(new LatLng(12.9703201, 77.643431)); + route.add(new LatLng(12.9703101, 77.64306)); + route.add(new LatLng(12.97029, 77.642401)); + route.add(new LatLng(12.9702601, 77.6422)); + route.add(new LatLng(12.9702201, 77.64198)); + route.add(new LatLng(12.9701801, 77.6413)); + route.add(new LatLng(12.9688502, 77.6414)); + route.add(new LatLng(12.96784, 77.64144)); + route.add(new LatLng(12.96696, 77.64148)); + route.add(new LatLng(12.9668401, 77.641501)); + route.add(new LatLng(12.9665902, 77.64234)); + route.add(new LatLng(12.9664502, 77.642671)); + route.add(new LatLng(12.96639, 77.642901)); + route.add(new LatLng(12.9662, 77.644061)); + route.add(new LatLng(12.96616, 77.64457)); + route.add(new LatLng(12.9661301, 77.64476)); + route.add(new LatLng(12.9660901, 77.64488)); + route.add(new LatLng(12.9659901, 77.64515)); + route.add(new LatLng(12.9657902, 77.64546)); + route.add(new LatLng(12.9655201, 77.64579)); + route.add(new LatLng(12.9651402, 77.646021)); + return route; + } - public static List getTokyoRoute() { - List mFinalRoute = new ArrayList<>(); - mFinalRoute.add(new LatLng(35.64719, 139.79163)); - mFinalRoute.add(new LatLng(35.64733, 139.7918)); - mFinalRoute.add(new LatLng(35.64752, 139.7919)); - mFinalRoute.add(new LatLng(35.64765, 139.79196)); - mFinalRoute.add(new LatLng(35.6478, 139.79198)); - mFinalRoute.add(new LatLng(35.64806, 139.79196)); - mFinalRoute.add(new LatLng(35.64818, 139.79193)); - mFinalRoute.add(new LatLng(35.6483, 139.79185)); - mFinalRoute.add(new LatLng(35.64847, 139.79172)); - mFinalRoute.add(new LatLng(35.6486, 139.79156)); - mFinalRoute.add(new LatLng(35.64917, 139.79091)); - mFinalRoute.add(new LatLng(35.64914, 139.79088)); - mFinalRoute.add(new LatLng(35.64846, 139.78989)); - mFinalRoute.add(new LatLng(35.64807, 139.78926)); - mFinalRoute.add(new LatLng(35.64769, 139.78963)); - mFinalRoute.add(new LatLng(35.64748, 139.78976)); - mFinalRoute.add(new LatLng(35.64702, 139.79014)); - mFinalRoute.add(new LatLng(35.64635, 139.79064)); - mFinalRoute.add(new LatLng(35.64596, 139.79095)); - mFinalRoute.add(new LatLng(35.64371, 139.79272)); - mFinalRoute.add(new LatLng(35.64293, 139.79335)); - mFinalRoute.add(new LatLng(35.64274, 139.79346)); - mFinalRoute.add(new LatLng(35.6418, 139.79429)); - mFinalRoute.add(new LatLng(35.64019, 139.79558)); - mFinalRoute.add(new LatLng(35.63922, 139.79637)); - mFinalRoute.add(new LatLng(35.63884, 139.79663)); - mFinalRoute.add(new LatLng(35.63851, 139.79674)); - mFinalRoute.add(new LatLng(35.63836, 139.79675)); - mFinalRoute.add(new LatLng(35.63825, 139.79673)); - mFinalRoute.add(new LatLng(35.63809, 139.7967)); - mFinalRoute.add(new LatLng(35.63784, 139.79657)); - mFinalRoute.add(new LatLng(35.63765, 139.79641)); - mFinalRoute.add(new LatLng(35.63747, 139.7962)); - mFinalRoute.add(new LatLng(35.63704, 139.7954)); - mFinalRoute.add(new LatLng(35.63652, 139.79446)); - mFinalRoute.add(new LatLng(35.63583, 139.79319)); - mFinalRoute.add(new LatLng(35.63523, 139.79204)); - mFinalRoute.add(new LatLng(35.63488, 139.79132)); - mFinalRoute.add(new LatLng(35.63469, 139.79085)); - mFinalRoute.add(new LatLng(35.63411, 139.78981)); - mFinalRoute.add(new LatLng(35.63359, 139.78882)); - mFinalRoute.add(new LatLng(35.63337, 139.78853)); - mFinalRoute.add(new LatLng(35.6331, 139.78814)); - mFinalRoute.add(new LatLng(35.63268, 139.7874)); - mFinalRoute.add(new LatLng(35.63173, 139.78565)); - mFinalRoute.add(new LatLng(35.6315, 139.78513)); - mFinalRoute.add(new LatLng(35.63141, 139.78472)); - mFinalRoute.add(new LatLng(35.6314, 139.78439)); - mFinalRoute.add(new LatLng(35.63145, 139.78403)); - mFinalRoute.add(new LatLng(35.63154, 139.78373)); - mFinalRoute.add(new LatLng(35.63171, 139.78343)); - mFinalRoute.add(new LatLng(35.63199, 139.78305)); - mFinalRoute.add(new LatLng(35.63355, 139.7814)); - mFinalRoute.add(new LatLng(35.63478, 139.78039)); - mFinalRoute.add(new LatLng(35.63519, 139.77999)); - mFinalRoute.add(new LatLng(35.63546, 139.77968)); - mFinalRoute.add(new LatLng(35.63561, 139.77943)); - mFinalRoute.add(new LatLng(35.63578, 139.77918)); - mFinalRoute.add(new LatLng(35.6359, 139.77893)); - mFinalRoute.add(new LatLng(35.63617, 139.77829)); - mFinalRoute.add(new LatLng(35.63628, 139.77793)); - mFinalRoute.add(new LatLng(35.63635, 139.77757)); - mFinalRoute.add(new LatLng(35.63645, 139.77696)); - mFinalRoute.add(new LatLng(35.63646, 139.77623)); - mFinalRoute.add(new LatLng(35.6364, 139.77555)); - mFinalRoute.add(new LatLng(35.63626, 139.77471)); - mFinalRoute.add(new LatLng(35.63609, 139.77403)); - mFinalRoute.add(new LatLng(35.63582, 139.77314)); - mFinalRoute.add(new LatLng(35.63549, 139.77222)); - mFinalRoute.add(new LatLng(35.63497, 139.77072)); - mFinalRoute.add(new LatLng(35.63484, 139.77019)); - mFinalRoute.add(new LatLng(35.63479, 139.76986)); - mFinalRoute.add(new LatLng(35.63478, 139.76956)); - mFinalRoute.add(new LatLng(35.6348, 139.7691)); - mFinalRoute.add(new LatLng(35.63487, 139.76851)); - mFinalRoute.add(new LatLng(35.635, 139.76795)); - mFinalRoute.add(new LatLng(35.6354, 139.7667)); - mFinalRoute.add(new LatLng(35.63652, 139.76318)); - mFinalRoute.add(new LatLng(35.63752, 139.76002)); - mFinalRoute.add(new LatLng(35.63781, 139.75913)); - mFinalRoute.add(new LatLng(35.63793, 139.75885)); - mFinalRoute.add(new LatLng(35.6381, 139.75853)); - mFinalRoute.add(new LatLng(35.63834, 139.75823)); - mFinalRoute.add(new LatLng(35.63861, 139.75801)); - mFinalRoute.add(new LatLng(35.63884, 139.75788)); - return mFinalRoute; - } + private static ArrayList getRoute21() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.96714, 77.63919)); + route.add(new LatLng(12.9670701, 77.63956)); + route.add(new LatLng(12.9670801, 77.639721)); + route.add(new LatLng(12.96723, 77.640131)); + route.add(new LatLng(12.9670801, 77.64059)); + route.add(new LatLng(12.96685, 77.641421)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9694301, 77.641241)); + route.add(new LatLng(12.9702701, 77.641191)); + route.add(new LatLng(12.97343, 77.641071)); + route.add(new LatLng(12.9761, 77.64094)); + route.add(new LatLng(12.9760901, 77.640341)); + route.add(new LatLng(12.97605, 77.63946)); + route.add(new LatLng(12.9760302, 77.638951)); + route.add(new LatLng(12.9760302, 77.63858)); + route.add(new LatLng(12.9750402, 77.638641)); + return route; + } - public static List getNewYorkRoute() { - List mFinalRoute = new ArrayList<>(); - mFinalRoute.add(new LatLng(40.69293, -73.90815)); - mFinalRoute.add(new LatLng(40.69455, -73.90654)); - mFinalRoute.add(new LatLng(40.69375, -73.90513)); - mFinalRoute.add(new LatLng(40.69304, -73.90387)); - mFinalRoute.add(new LatLng(40.69242, -73.90278)); - mFinalRoute.add(new LatLng(40.69267, -73.90255)); - mFinalRoute.add(new LatLng(40.69283, -73.90238)); - mFinalRoute.add(new LatLng(40.69289, -73.90224)); - mFinalRoute.add(new LatLng(40.69343, -73.90005)); - mFinalRoute.add(new LatLng(40.69347, -73.8999)); - mFinalRoute.add(new LatLng(40.69386, -73.89871)); - mFinalRoute.add(new LatLng(40.69394, -73.89831)); - mFinalRoute.add(new LatLng(40.69411, -73.89733)); - mFinalRoute.add(new LatLng(40.69384, -73.89691)); - mFinalRoute.add(new LatLng(40.69319, -73.89574)); - mFinalRoute.add(new LatLng(40.69266, -73.89479)); - mFinalRoute.add(new LatLng(40.69185, -73.89204)); - mFinalRoute.add(new LatLng(40.69141, -73.89059)); - mFinalRoute.add(new LatLng(40.69107, -73.89054)); - mFinalRoute.add(new LatLng(40.69089, -73.89052)); - mFinalRoute.add(new LatLng(40.69088, -73.89026)); - mFinalRoute.add(new LatLng(40.69084, -73.89006)); - mFinalRoute.add(new LatLng(40.69079, -73.88998)); - mFinalRoute.add(new LatLng(40.69073, -73.88992)); - mFinalRoute.add(new LatLng(40.69059, -73.88986)); - mFinalRoute.add(new LatLng(40.69051, -73.88986)); - mFinalRoute.add(new LatLng(40.69043, -73.88989)); - mFinalRoute.add(new LatLng(40.69026, -73.89001)); - mFinalRoute.add(new LatLng(40.69009, -73.89015)); - mFinalRoute.add(new LatLng(40.68997, -73.89019)); - mFinalRoute.add(new LatLng(40.68974, -73.89038)); - mFinalRoute.add(new LatLng(40.68849, -73.89139)); - mFinalRoute.add(new LatLng(40.68787, -73.89188)); - mFinalRoute.add(new LatLng(40.68692, -73.89266)); - mFinalRoute.add(new LatLng(40.68638, -73.89312)); - mFinalRoute.add(new LatLng(40.68557, -73.89393)); - mFinalRoute.add(new LatLng(40.68497, -73.89454)); - mFinalRoute.add(new LatLng(40.68441, -73.89507)); - mFinalRoute.add(new LatLng(40.68385, -73.89554)); - mFinalRoute.add(new LatLng(40.68335, -73.89594)); - mFinalRoute.add(new LatLng(40.68282, -73.8963)); - mFinalRoute.add(new LatLng(40.68239, -73.89651)); - mFinalRoute.add(new LatLng(40.6821, -73.89659)); - mFinalRoute.add(new LatLng(40.68177, -73.89661)); - mFinalRoute.add(new LatLng(40.68085, -73.89668)); - mFinalRoute.add(new LatLng(40.68062, -73.89672)); - mFinalRoute.add(new LatLng(40.68021, -73.89682)); - mFinalRoute.add(new LatLng(40.67958, -73.89707)); - mFinalRoute.add(new LatLng(40.67893, -73.89741)); - mFinalRoute.add(new LatLng(40.6786, -73.89747)); - mFinalRoute.add(new LatLng(40.67835, -73.89752)); - mFinalRoute.add(new LatLng(40.67821, -73.89753)); - mFinalRoute.add(new LatLng(40.67806, -73.89759)); - mFinalRoute.add(new LatLng(40.67795, -73.89742)); - mFinalRoute.add(new LatLng(40.67721, -73.89722)); - mFinalRoute.add(new LatLng(40.67597, -73.89691)); - mFinalRoute.add(new LatLng(40.6756, -73.89683)); - mFinalRoute.add(new LatLng(40.67294, -73.89614)); - mFinalRoute.add(new LatLng(40.66937, -73.89522)); - mFinalRoute.add(new LatLng(40.6663, -73.89444)); - mFinalRoute.add(new LatLng(40.66476, -73.89406)); - mFinalRoute.add(new LatLng(40.66322, -73.89364)); - mFinalRoute.add(new LatLng(40.66256, -73.89348)); - mFinalRoute.add(new LatLng(40.66234, -73.89341)); - mFinalRoute.add(new LatLng(40.66205, -73.89326)); - mFinalRoute.add(new LatLng(40.66167, -73.89298)); - mFinalRoute.add(new LatLng(40.66145, -73.89278)); - mFinalRoute.add(new LatLng(40.66088, -73.89235)); - mFinalRoute.add(new LatLng(40.65993, -73.89164)); - mFinalRoute.add(new LatLng(40.65909, -73.89104)); - mFinalRoute.add(new LatLng(40.65884, -73.89085)); - mFinalRoute.add(new LatLng(40.65869, -73.89081)); - mFinalRoute.add(new LatLng(40.65859, -73.89075)); - mFinalRoute.add(new LatLng(40.65839, -73.89059)); - mFinalRoute.add(new LatLng(40.65694, -73.88948)); - mFinalRoute.add(new LatLng(40.65546, -73.88839)); - mFinalRoute.add(new LatLng(40.65365, -73.88703)); - mFinalRoute.add(new LatLng(40.65279, -73.8864)); - mFinalRoute.add(new LatLng(40.65267, -73.88636)); - mFinalRoute.add(new LatLng(40.65232, -73.88609)); - mFinalRoute.add(new LatLng(40.65119, -73.88522)); - mFinalRoute.add(new LatLng(40.65073, -73.88489)); - mFinalRoute.add(new LatLng(40.65023, -73.88451)); - mFinalRoute.add(new LatLng(40.65007, -73.88435)); - return mFinalRoute; - } + private static ArrayList getRoute22() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9750501, 77.644011)); + route.add(new LatLng(12.9750501, 77.6435)); + route.add(new LatLng(12.9744501, 77.64351)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.97389, 77.643081)); + route.add(new LatLng(12.9726101, 77.64319)); + route.add(new LatLng(12.9716, 77.643211)); + route.add(new LatLng(12.97047, 77.64328)); + route.add(new LatLng(12.9703201, 77.643291)); + route.add(new LatLng(12.9703201, 77.643431)); + route.add(new LatLng(12.97034, 77.64407)); + route.add(new LatLng(12.97014, 77.64408)); + return route; + } - public static List getIndiranagarBounds() { - List latLngs = new ArrayList<>(); - latLngs.add(new LatLng(12.9715002,77.6374856));//NW - latLngs.add(new LatLng(12.9703733,77.6372037));//NE - latLngs.add(new LatLng(12.9595674,77.6366595));//SE - latLngs.add(new LatLng(12.9595672,77.6519803));//SW - return latLngs; - } + private static ArrayList getRoute23() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.97577, 77.64529)); + route.add(new LatLng(12.9757601, 77.644861)); + route.add(new LatLng(12.9757101, 77.64346)); + route.add(new LatLng(12.9750501, 77.6435)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.97389, 77.642681)); + route.add(new LatLng(12.97385, 77.641141)); + route.add(new LatLng(12.9738401, 77.64105)); + route.add(new LatLng(12.9761, 77.64094)); + route.add(new LatLng(12.9760901, 77.640341)); + route.add(new LatLng(12.9760702, 77.63988)); + route.add(new LatLng(12.97605, 77.63946)); + route.add(new LatLng(12.9760302, 77.63898)); + route.add(new LatLng(12.9751401, 77.639011)); + route.add(new LatLng(12.9745202, 77.639041)); + route.add(new LatLng(12.9745, 77.6389)); + route.add(new LatLng(12.9744802, 77.638591)); + route.add(new LatLng(12.97446, 77.63826)); + route.add(new LatLng(12.9744001, 77.63799)); + route.add(new LatLng(12.9743501, 77.637891)); + route.add(new LatLng(12.9744501, 77.637841)); + route.add(new LatLng(12.97456, 77.63778)); + route.add(new LatLng(12.9745702, 77.63778)); + return route; + } - //Indiranagar routes - public static ArrayList getIndiranagarRoutes() { - ArrayList carRoute = new ArrayList<>(); - carRoute.add(getCarForRoute(getRoute1(), 1)); - carRoute.add(getCarForRoute(getRoute2(), 2)); - carRoute.add(getCarForRoute(getRoute3(), 3)); - carRoute.add(getCarForRoute(getRoute4(), 4)); - carRoute.add(getCarForRoute(getRoute5(), 5)); - carRoute.add(getCarForRoute(getRoute6(), 6)); - carRoute.add(getCarForRoute(getRoute7(), 7)); - carRoute.add(getCarForRoute(getRoute8(), 8)); - carRoute.add(getCarForRoute(getRoute9(), 9)); - carRoute.add(getCarForRoute(getRoute10(), 10)); - carRoute.add(getCarForRoute(getRoute11(), 11)); - carRoute.add(getCarForRoute(getRoute12(), 12)); - carRoute.add(getCarForRoute(getRoute13(), 13)); - carRoute.add(getCarForRoute(getRoute14(), 14)); - carRoute.add(getCarForRoute(getRoute15(), 15)); - carRoute.add(getCarForRoute(getRoute16(), 16)); - carRoute.add(getCarForRoute(getRoute17(), 17)); - carRoute.add(getCarForRoute(getRoute18(), 18)); - carRoute.add(getCarForRoute(getRoute19(), 19)); - carRoute.add(getCarForRoute(getRoute20(), 20)); - carRoute.add(getCarForRoute(getRoute21(), 21)); - carRoute.add(getCarForRoute(getRoute22(), 22)); - carRoute.add(getCarForRoute(getRoute23(), 23)); - carRoute.add(getCarForRoute(getRoute24(), 24)); - carRoute.add(getCarForRoute(getRoute25(), 25)); - carRoute.add(getCarForRoute(getRoute26(), 26)); - carRoute.add(getCarForRoute(getRoute27(), 27)); - carRoute.add(getCarForRoute(getRoute28(), 28)); - return carRoute; - } + private static ArrayList getRoute24() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9738, 77.637831)); + route.add(new LatLng(12.9736802, 77.63787)); + route.add(new LatLng(12.9737202, 77.63812)); + route.add(new LatLng(12.97375, 77.638461)); + route.add(new LatLng(12.97375, 77.638471)); + route.add(new LatLng(12.97334, 77.638501)); + route.add(new LatLng(12.97338, 77.639411)); + route.add(new LatLng(12.97343, 77.641071)); + route.add(new LatLng(12.9738401, 77.64105)); + route.add(new LatLng(12.97385, 77.641141)); + route.add(new LatLng(12.97389, 77.642681)); + route.add(new LatLng(12.9739102, 77.643531)); + route.add(new LatLng(12.9739602, 77.64481)); + route.add(new LatLng(12.9726902, 77.644861)); + route.add(new LatLng(12.9716301, 77.64494)); + route.add(new LatLng(12.97089, 77.64494)); + route.add(new LatLng(12.9709102, 77.64561)); + route.add(new LatLng(12.9709102, 77.64636)); + route.add(new LatLng(12.97141, 77.646351)); + return route; + } - private static Car getCarForRoute(List latLngs, int count) { - Car car = new Car(); - car.setCarId(count); - car.setCurrentPointer(0); - car.setRoute(latLngs); - return car; - } + private static ArrayList getRoute25() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9783702, 77.64228)); + route.add(new LatLng(12.9783, 77.640261)); + route.add(new LatLng(12.9782501, 77.63934)); + route.add(new LatLng(12.9782401, 77.63888)); + route.add(new LatLng(12.97807, 77.63888)); + route.add(new LatLng(12.9775901, 77.63885)); + route.add(new LatLng(12.97723, 77.638921)); + route.add(new LatLng(12.9766901, 77.638951)); + route.add(new LatLng(12.9760302, 77.63898)); + route.add(new LatLng(12.9760302, 77.638951)); + route.add(new LatLng(12.9760302, 77.63858)); + route.add(new LatLng(12.9756502, 77.63861)); + return route; + } - private static ArrayList getRoute1() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9710101, 77.638021)); - route.add(new LatLng(12.97104, 77.638741)); - route.add(new LatLng(12.97057, 77.638771)); - route.add(new LatLng(12.9695002, 77.6388)); - route.add(new LatLng(12.96837, 77.63888)); - route.add(new LatLng(12.9684202, 77.639321)); - route.add(new LatLng(12.9685, 77.640121)); - route.add(new LatLng(12.9685301, 77.64069)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9686, 77.6414)); - route.add(new LatLng(12.96784, 77.64144)); - route.add(new LatLng(12.96696, 77.64148)); - route.add(new LatLng(12.9668401, 77.641501)); - route.add(new LatLng(12.9665902, 77.64234)); - route.add(new LatLng(12.9664502, 77.642671)); - route.add(new LatLng(12.96639, 77.642901)); - route.add(new LatLng(12.9662, 77.644061)); - route.add(new LatLng(12.96616, 77.64457)); - route.add(new LatLng(12.9661301, 77.64476)); - route.add(new LatLng(12.9659901, 77.64515)); - route.add(new LatLng(12.9657902, 77.64546)); - route.add(new LatLng(12.96569, 77.6456)); - route.add(new LatLng(12.9655201, 77.64579)); - route.add(new LatLng(12.96531, 77.64592)); - route.add(new LatLng(12.96513, 77.646031)); - return route; - } - private static ArrayList getRoute2() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9694602, 77.63812)); - route.add(new LatLng(12.9695002, 77.6388)); - route.add(new LatLng(12.96959, 77.6397)); - route.add(new LatLng(12.9696101, 77.640161)); - route.add(new LatLng(12.96958, 77.640161)); - route.add(new LatLng(12.96851, 77.64024)); - route.add(new LatLng(12.9685301, 77.64073)); - route.add(new LatLng(12.9686, 77.6414)); - route.add(new LatLng(12.9686102, 77.64203)); - route.add(new LatLng(12.9686, 77.6427)); - route.add(new LatLng(12.96865, 77.644141)); - route.add(new LatLng(12.9687002, 77.64561)); - route.add(new LatLng(12.96874, 77.64632)); - return route; - } - private static ArrayList getRoute3() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.97633, 77.6379)); - route.add(new LatLng(12.97601, 77.637921)); - route.add(new LatLng(12.97601, 77.63826)); - route.add(new LatLng(12.9760302, 77.638951)); - route.add(new LatLng(12.9760702, 77.63988)); - route.add(new LatLng(12.9760801, 77.64019)); - route.add(new LatLng(12.97572, 77.64022)); - route.add(new LatLng(12.9741902, 77.64028)); - route.add(new LatLng(12.9734101, 77.64031)); - route.add(new LatLng(12.97343, 77.641071)); - route.add(new LatLng(12.9738401, 77.64105)); - route.add(new LatLng(12.97385, 77.641141)); - route.add(new LatLng(12.97389, 77.642681)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.97399, 77.64537)); - route.add(new LatLng(12.9740701, 77.64685)); - route.add(new LatLng(12.9740701, 77.64691)); - route.add(new LatLng(12.9736802, 77.646931)); - route.add(new LatLng(12.97352, 77.646921)); - route.add(new LatLng(12.9731102, 77.64691)); - route.add(new LatLng(12.9724201, 77.647021)); - route.add(new LatLng(12.9719601, 77.64712)); - route.add(new LatLng(12.9704601, 77.647411)); - route.add(new LatLng(12.9694, 77.64763)); - route.add(new LatLng(12.9690001, 77.647731)); - route.add(new LatLng(12.9689001, 77.64779)); - route.add(new LatLng(12.96887, 77.64802)); - route.add(new LatLng(12.9687002, 77.6491)); - route.add(new LatLng(12.96846, 77.65012)); - route.add(new LatLng(12.9684, 77.65058)); - route.add(new LatLng(12.96826, 77.6511)); - route.add(new LatLng(12.9681501, 77.65156)); - route.add(new LatLng(12.9680201, 77.652251)); - route.add(new LatLng(12.96587, 77.65139)); - route.add(new LatLng(12.96385, 77.65054)); - route.add(new LatLng(12.9632801, 77.650331)); - return route; - } - private static ArrayList getRoute4() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9627201, 77.64564)); - route.add(new LatLng(12.96264, 77.646021)); - route.add(new LatLng(12.9621101, 77.64591)); - route.add(new LatLng(12.96197, 77.64588)); - route.add(new LatLng(12.9619902, 77.64542)); - route.add(new LatLng(12.9621302, 77.645441)); - route.add(new LatLng(12.9621402, 77.64543)); - route.add(new LatLng(12.9622901, 77.644411)); - route.add(new LatLng(12.9623702, 77.643751)); - route.add(new LatLng(12.96241, 77.64346)); - route.add(new LatLng(12.9626701, 77.6435)); - route.add(new LatLng(12.9632102, 77.64363)); - route.add(new LatLng(12.9633701, 77.642261)); - route.add(new LatLng(12.9633502, 77.64176)); - route.add(new LatLng(12.9633201, 77.641561)); - route.add(new LatLng(12.9635902, 77.64091)); - route.add(new LatLng(12.964, 77.640131)); - route.add(new LatLng(12.9642502, 77.639671)); - route.add(new LatLng(12.96447, 77.63929)); - route.add(new LatLng(12.96475, 77.63888)); - route.add(new LatLng(12.96362, 77.63839)); - route.add(new LatLng(12.9633502, 77.638241)); - return route; - } - private static ArrayList getRoute5() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9712402, 77.643651)); - route.add(new LatLng(12.97085, 77.643661)); - route.add(new LatLng(12.9708801, 77.644511)); - route.add(new LatLng(12.97089, 77.64494)); - route.add(new LatLng(12.9703601, 77.64494)); - route.add(new LatLng(12.9703902, 77.64574)); - route.add(new LatLng(12.9704402, 77.64721)); - route.add(new LatLng(12.9704601, 77.647411)); - route.add(new LatLng(12.9701102, 77.64748)); - route.add(new LatLng(12.96958, 77.647591)); - route.add(new LatLng(12.9690802, 77.64771)); - route.add(new LatLng(12.96892, 77.647771)); - route.add(new LatLng(12.9687701, 77.647771)); - route.add(new LatLng(12.96841, 77.647831)); - route.add(new LatLng(12.96836, 77.64788)); - route.add(new LatLng(12.9680201, 77.647951)); - route.add(new LatLng(12.9675901, 77.6481)); - route.add(new LatLng(12.9671301, 77.64829)); - route.add(new LatLng(12.9670602, 77.648221)); - route.add(new LatLng(12.9653001, 77.64734)); - route.add(new LatLng(12.96494, 77.64717)); - route.add(new LatLng(12.9649101, 77.64718)); - route.add(new LatLng(12.96479, 77.64744)); - route.add(new LatLng(12.96475, 77.647551)); - route.add(new LatLng(12.9647202, 77.64752)); - route.add(new LatLng(12.9647, 77.647501)); - route.add(new LatLng(12.9640301, 77.64727)); - route.add(new LatLng(12.964, 77.64726)); - route.add(new LatLng(12.9639602, 77.64745)); - route.add(new LatLng(12.9635902, 77.647321)); - route.add(new LatLng(12.9636001, 77.64725)); - route.add(new LatLng(12.9636802, 77.64669)); - route.add(new LatLng(12.9638901, 77.645811)); - return route; - } - private static ArrayList getRoute6() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.97347, 77.64583)); - route.add(new LatLng(12.9734501, 77.645441)); - route.add(new LatLng(12.97339, 77.64485)); - route.add(new LatLng(12.97339, 77.644831)); - route.add(new LatLng(12.9739602, 77.64481)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.97389, 77.642681)); - route.add(new LatLng(12.9738801, 77.642351)); - return route; - } - private static ArrayList getRoute7() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9617602, 77.646531)); - route.add(new LatLng(12.96193, 77.64664)); - route.add(new LatLng(12.9620402, 77.646751)); - route.add(new LatLng(12.9624202, 77.64691)); - route.add(new LatLng(12.9627502, 77.64703)); - route.add(new LatLng(12.9631301, 77.64713)); - route.add(new LatLng(12.9632701, 77.647201)); - route.add(new LatLng(12.9634002, 77.647281)); - route.add(new LatLng(12.9635902, 77.647321)); - route.add(new LatLng(12.9636802, 77.64669)); - route.add(new LatLng(12.96395, 77.645581)); - route.add(new LatLng(12.9639801, 77.64552)); - route.add(new LatLng(12.96414, 77.64484)); - route.add(new LatLng(12.9643601, 77.643921)); - route.add(new LatLng(12.9646801, 77.643981)); - return route; - } - private static ArrayList getRoute8() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.96527, 77.64)); - route.add(new LatLng(12.9656701, 77.64011)); - route.add(new LatLng(12.9657701, 77.64015)); - route.add(new LatLng(12.96578, 77.64018)); - route.add(new LatLng(12.9658402, 77.640201)); - route.add(new LatLng(12.9660401, 77.640261)); - route.add(new LatLng(12.9659501, 77.64054)); - route.add(new LatLng(12.9658402, 77.640931)); - route.add(new LatLng(12.9658101, 77.64113)); - route.add(new LatLng(12.96582, 77.641461)); - route.add(new LatLng(12.96644, 77.64143)); - route.add(new LatLng(12.9671, 77.6414)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9686, 77.6414)); - route.add(new LatLng(12.9686102, 77.64203)); - route.add(new LatLng(12.9686, 77.6427)); - route.add(new LatLng(12.96864, 77.6435)); - route.add(new LatLng(12.96907, 77.6435)); - route.add(new LatLng(12.96972, 77.64346)); - route.add(new LatLng(12.9703201, 77.643431)); - route.add(new LatLng(12.9703201, 77.643291)); - route.add(new LatLng(12.97047, 77.64328)); - route.add(new LatLng(12.9708202, 77.643251)); - route.add(new LatLng(12.9714302, 77.64322)); - return route; - } - private static ArrayList getRoute9() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.97118, 77.639171)); - route.add(new LatLng(12.97258, 77.63911)); - route.add(new LatLng(12.9726002, 77.63991)); - route.add(new LatLng(12.9726402, 77.641111)); - route.add(new LatLng(12.9738401, 77.64105)); - route.add(new LatLng(12.9738602, 77.641771)); - route.add(new LatLng(12.97389, 77.643081)); - route.add(new LatLng(12.97394, 77.644231)); - route.add(new LatLng(12.97399, 77.64528)); - route.add(new LatLng(12.9744302, 77.645141)); - route.add(new LatLng(12.97446, 77.64519)); - route.add(new LatLng(12.9744802, 77.645271)); - route.add(new LatLng(12.9745, 77.645491)); - return route; - } - private static ArrayList getRoute10() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9765402, 77.65004)); - route.add(new LatLng(12.97428, 77.649431)); - route.add(new LatLng(12.9743001, 77.649381)); - route.add(new LatLng(12.9745, 77.648851)); - route.add(new LatLng(12.97455, 77.648721)); - route.add(new LatLng(12.9745401, 77.648671)); - route.add(new LatLng(12.97441, 77.64857)); - route.add(new LatLng(12.97437, 77.6483)); - route.add(new LatLng(12.9743501, 77.64766)); - route.add(new LatLng(12.9743501, 77.64761)); - route.add(new LatLng(12.97503, 77.647561)); - route.add(new LatLng(12.9749902, 77.64686)); - route.add(new LatLng(12.9740701, 77.64691)); - route.add(new LatLng(12.97403, 77.645941)); - route.add(new LatLng(12.97399, 77.64528)); - route.add(new LatLng(12.97394, 77.644231)); - route.add(new LatLng(12.97389, 77.643081)); - route.add(new LatLng(12.9738602, 77.641771)); - route.add(new LatLng(12.97385, 77.641141)); - route.add(new LatLng(12.9734501, 77.64116)); - route.add(new LatLng(12.9720001, 77.641241)); - route.add(new LatLng(12.9701801, 77.6413)); - route.add(new LatLng(12.9688502, 77.6414)); - route.add(new LatLng(12.9686, 77.6414)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9685301, 77.64069)); - route.add(new LatLng(12.9685, 77.640121)); - route.add(new LatLng(12.9684202, 77.639321)); - route.add(new LatLng(12.96836, 77.63848)); - route.add(new LatLng(12.9679701, 77.63852)); - route.add(new LatLng(12.96765, 77.638591)); - route.add(new LatLng(12.96752, 77.638591)); - route.add(new LatLng(12.9674001, 77.638561)); - route.add(new LatLng(12.9671301, 77.638461)); - route.add(new LatLng(12.9667501, 77.638381)); - route.add(new LatLng(12.9665902, 77.63835)); - return route; - } - private static ArrayList getRoute11() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9726502, 77.65013)); - route.add(new LatLng(12.9727101, 77.649831)); - route.add(new LatLng(12.97278, 77.649441)); - route.add(new LatLng(12.97315, 77.6495)); - route.add(new LatLng(12.9736901, 77.649561)); - route.add(new LatLng(12.97376, 77.649571)); - route.add(new LatLng(12.97418, 77.64969)); - route.add(new LatLng(12.97428, 77.649431)); - route.add(new LatLng(12.9745401, 77.648761)); - route.add(new LatLng(12.97455, 77.64869)); - route.add(new LatLng(12.9745202, 77.64864)); - route.add(new LatLng(12.97442, 77.648591)); - route.add(new LatLng(12.9744001, 77.648541)); - route.add(new LatLng(12.9743802, 77.648451)); - route.add(new LatLng(12.9743501, 77.647991)); - route.add(new LatLng(12.9743501, 77.64761)); - route.add(new LatLng(12.97503, 77.647561)); - route.add(new LatLng(12.9749902, 77.64686)); - route.add(new LatLng(12.9740701, 77.64691)); - route.add(new LatLng(12.9740701, 77.64685)); - route.add(new LatLng(12.97399, 77.64537)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.97389, 77.643081)); - route.add(new LatLng(12.97334, 77.643121)); - route.add(new LatLng(12.9733201, 77.64265)); - route.add(new LatLng(12.9731102, 77.64266)); - return route; - } - private static ArrayList getRoute12() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9750501, 77.644641)); - route.add(new LatLng(12.9750501, 77.6435)); - route.add(new LatLng(12.9744501, 77.64351)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.97389, 77.643081)); - route.add(new LatLng(12.9738602, 77.641771)); - route.add(new LatLng(12.97385, 77.641141)); - route.add(new LatLng(12.9734501, 77.64116)); - route.add(new LatLng(12.9720001, 77.641241)); - route.add(new LatLng(12.9701801, 77.6413)); - route.add(new LatLng(12.9688502, 77.6414)); - route.add(new LatLng(12.96784, 77.64144)); - route.add(new LatLng(12.96696, 77.64148)); - route.add(new LatLng(12.9668401, 77.641501)); - route.add(new LatLng(12.9665902, 77.64234)); - route.add(new LatLng(12.9664502, 77.642671)); - route.add(new LatLng(12.96639, 77.642901)); - route.add(new LatLng(12.9662, 77.644061)); - route.add(new LatLng(12.9661901, 77.644191)); - route.add(new LatLng(12.9659501, 77.64413)); - route.add(new LatLng(12.96569, 77.644111)); - route.add(new LatLng(12.9654702, 77.644101)); - route.add(new LatLng(12.96513, 77.644061)); - route.add(new LatLng(12.9643601, 77.643921)); - route.add(new LatLng(12.96413, 77.64489)); - return route; - } - private static ArrayList getRoute13() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9658501, 77.636621)); - route.add(new LatLng(12.9658902, 77.636581)); - route.add(new LatLng(12.96615, 77.63691)); - route.add(new LatLng(12.9665201, 77.63664)); - route.add(new LatLng(12.96686, 77.63706)); - route.add(new LatLng(12.9669702, 77.637121)); - route.add(new LatLng(12.96808, 77.63724)); - route.add(new LatLng(12.9682501, 77.637291)); - route.add(new LatLng(12.9683001, 77.637351)); - route.add(new LatLng(12.96836, 77.63848)); - route.add(new LatLng(12.9684202, 77.639321)); - route.add(new LatLng(12.9685, 77.640121)); - route.add(new LatLng(12.9685301, 77.64069)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9686102, 77.64203)); - route.add(new LatLng(12.9686, 77.6427)); - route.add(new LatLng(12.96864, 77.6435)); - route.add(new LatLng(12.9686701, 77.64484)); - route.add(new LatLng(12.9687002, 77.64561)); - route.add(new LatLng(12.9688402, 77.6477)); - route.add(new LatLng(12.9688402, 77.647771)); - route.add(new LatLng(12.96892, 77.647771)); - route.add(new LatLng(12.9688902, 77.647821)); - route.add(new LatLng(12.96887, 77.647991)); - route.add(new LatLng(12.9687502, 77.64875)); - route.add(new LatLng(12.9692301, 77.648811)); - route.add(new LatLng(12.9699401, 77.64891)); - route.add(new LatLng(12.9699702, 77.64972)); - return route; - } - private static ArrayList getRoute14() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9742101, 77.63459)); - route.add(new LatLng(12.9739301, 77.63459)); - route.add(new LatLng(12.97371, 77.6346)); - route.add(new LatLng(12.9733601, 77.634651)); - route.add(new LatLng(12.97328, 77.634701)); - route.add(new LatLng(12.97324, 77.634801)); - route.add(new LatLng(12.9729702, 77.63473)); - route.add(new LatLng(12.973, 77.634891)); - route.add(new LatLng(12.9730301, 77.635191)); - route.add(new LatLng(12.9731202, 77.6359)); - route.add(new LatLng(12.9727101, 77.63594)); - route.add(new LatLng(12.9720001, 77.63599)); - route.add(new LatLng(12.9716701, 77.63597)); - route.add(new LatLng(12.9715, 77.63598)); - route.add(new LatLng(12.9704402, 77.63597)); - route.add(new LatLng(12.9698501, 77.635951)); - route.add(new LatLng(12.96934, 77.63598)); - route.add(new LatLng(12.9694301, 77.637621)); - route.add(new LatLng(12.9694701, 77.63843)); - route.add(new LatLng(12.9695502, 77.639271)); - route.add(new LatLng(12.9696101, 77.640161)); - route.add(new LatLng(12.96855, 77.64024)); - route.add(new LatLng(12.96851, 77.64024)); - route.add(new LatLng(12.96851, 77.64028)); - route.add(new LatLng(12.9685301, 77.64069)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9686, 77.6414)); - route.add(new LatLng(12.96784, 77.64144)); - route.add(new LatLng(12.96696, 77.64148)); - route.add(new LatLng(12.9637802, 77.641641)); - route.add(new LatLng(12.9633201, 77.64166)); - route.add(new LatLng(12.96264, 77.641691)); - route.add(new LatLng(12.96254, 77.64243)); - route.add(new LatLng(12.9623702, 77.643751)); - route.add(new LatLng(12.96231, 77.64408)); - route.add(new LatLng(12.9631801, 77.644291)); + private static ArrayList getRoute26() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9772601, 77.643921)); + route.add(new LatLng(12.97722, 77.64278)); + route.add(new LatLng(12.97714, 77.640981)); + route.add(new LatLng(12.97558, 77.64105)); + route.add(new LatLng(12.9720001, 77.641241)); + route.add(new LatLng(12.9701801, 77.6413)); + route.add(new LatLng(12.9688502, 77.6414)); + route.add(new LatLng(12.96784, 77.64144)); + route.add(new LatLng(12.96696, 77.64148)); + route.add(new LatLng(12.9637802, 77.641641)); + route.add(new LatLng(12.96352, 77.641651)); + route.add(new LatLng(12.9634002, 77.64166)); + route.add(new LatLng(12.9633502, 77.64176)); + route.add(new LatLng(12.9633701, 77.642261)); + route.add(new LatLng(12.9632102, 77.64363)); + route.add(new LatLng(12.96381, 77.64378)); + route.add(new LatLng(12.9639301, 77.64381)); + route.add(new LatLng(12.96386, 77.64413)); + route.add(new LatLng(12.9634101, 77.644021)); + return route; + } - return route; - } - private static ArrayList getRoute15() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9728802, 77.64905)); - route.add(new LatLng(12.97278, 77.649441)); - route.add(new LatLng(12.9727101, 77.649831)); - route.add(new LatLng(12.9726502, 77.65013)); - route.add(new LatLng(12.9726002, 77.65016)); - route.add(new LatLng(12.97239, 77.650141)); - route.add(new LatLng(12.9724102, 77.650331)); - route.add(new LatLng(12.9724602, 77.65061)); - route.add(new LatLng(12.9721401, 77.65067)); - route.add(new LatLng(12.9715401, 77.650771)); - route.add(new LatLng(12.9714401, 77.650781)); - route.add(new LatLng(12.9714202, 77.650561)); - route.add(new LatLng(12.97127, 77.649621)); - route.add(new LatLng(12.97123, 77.649391)); - route.add(new LatLng(12.97112, 77.648681)); - route.add(new LatLng(12.97103, 77.64838)); - route.add(new LatLng(12.97098, 77.647911)); - route.add(new LatLng(12.97095, 77.64731)); - route.add(new LatLng(12.9704601, 77.647411)); - route.add(new LatLng(12.97042, 77.64685)); - route.add(new LatLng(12.97038, 77.64551)); - route.add(new LatLng(12.9691302, 77.645581)); - route.add(new LatLng(12.9687002, 77.64561)); - route.add(new LatLng(12.96794, 77.64564)); - route.add(new LatLng(12.9677202, 77.64564)); - route.add(new LatLng(12.9676302, 77.64557)); - route.add(new LatLng(12.9676001, 77.645441)); - route.add(new LatLng(12.9675802, 77.64448)); - route.add(new LatLng(12.9674902, 77.64275)); - route.add(new LatLng(12.9675001, 77.64206)); - route.add(new LatLng(12.9674902, 77.64144)); - route.add(new LatLng(12.96696, 77.64148)); - route.add(new LatLng(12.9668401, 77.641501)); - route.add(new LatLng(12.96685, 77.641421)); - route.add(new LatLng(12.9670801, 77.64059)); - route.add(new LatLng(12.96723, 77.640131)); - route.add(new LatLng(12.9671201, 77.639851)); - route.add(new LatLng(12.9670701, 77.639591)); - return route; - } - private static ArrayList getRoute16() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9631301, 77.63907)); - route.add(new LatLng(12.9633102, 77.638771)); - route.add(new LatLng(12.96362, 77.63839)); - route.add(new LatLng(12.9631702, 77.63814)); - route.add(new LatLng(12.9626502, 77.63782)); - route.add(new LatLng(12.96236, 77.637611)); - route.add(new LatLng(12.9616702, 77.638191)); - route.add(new LatLng(12.96119, 77.638641)); - route.add(new LatLng(12.96109, 77.638691)); - route.add(new LatLng(12.96105, 77.6387)); - route.add(new LatLng(12.9610301, 77.63898)); - route.add(new LatLng(12.9608901, 77.63956)); - route.add(new LatLng(12.9608301, 77.64009)); - route.add(new LatLng(12.96076, 77.64073)); - route.add(new LatLng(12.9606901, 77.641831)); - route.add(new LatLng(12.9605501, 77.642941)); - route.add(new LatLng(12.96047, 77.64337)); - route.add(new LatLng(12.96062, 77.643381)); - route.add(new LatLng(12.96127, 77.64341)); - route.add(new LatLng(12.96146, 77.643441)); - route.add(new LatLng(12.96241, 77.64346)); - route.add(new LatLng(12.96291, 77.64355)); - route.add(new LatLng(12.96352, 77.643711)); - route.add(new LatLng(12.9639301, 77.64381)); - route.add(new LatLng(12.9643601, 77.643921)); - route.add(new LatLng(12.96414, 77.64484)); - route.add(new LatLng(12.96465, 77.64498)); - route.add(new LatLng(12.9649502, 77.64502)); - route.add(new LatLng(12.9647701, 77.6456)); - return route; - } - private static ArrayList getRoute17() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.97577, 77.63826)); - route.add(new LatLng(12.97601, 77.63826)); - route.add(new LatLng(12.9760302, 77.638951)); - route.add(new LatLng(12.9760702, 77.63988)); - route.add(new LatLng(12.9760801, 77.64019)); - route.add(new LatLng(12.97572, 77.64022)); - route.add(new LatLng(12.9741902, 77.64028)); - route.add(new LatLng(12.9734101, 77.64031)); - route.add(new LatLng(12.97343, 77.641071)); - route.add(new LatLng(12.9738401, 77.64105)); - route.add(new LatLng(12.97385, 77.641141)); - route.add(new LatLng(12.97389, 77.642681)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.9739602, 77.64481)); - route.add(new LatLng(12.9726902, 77.644861)); - route.add(new LatLng(12.9716301, 77.64494)); - route.add(new LatLng(12.9716201, 77.644591)); - return route; - } - private static ArrayList getRoute18() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9587301, 77.639411)); - route.add(new LatLng(12.9588601, 77.63845)); - route.add(new LatLng(12.9588601, 77.63836)); - route.add(new LatLng(12.9602301, 77.63854)); - route.add(new LatLng(12.96076, 77.638601)); - route.add(new LatLng(12.96095, 77.638691)); - route.add(new LatLng(12.96105, 77.6387)); - route.add(new LatLng(12.9610301, 77.63898)); - route.add(new LatLng(12.9608901, 77.63956)); - route.add(new LatLng(12.9608301, 77.64009)); - route.add(new LatLng(12.96076, 77.64073)); - route.add(new LatLng(12.9606901, 77.641831)); - route.add(new LatLng(12.9605501, 77.642941)); - route.add(new LatLng(12.96047, 77.64337)); - route.add(new LatLng(12.96034, 77.644551)); - route.add(new LatLng(12.9602, 77.645591)); - route.add(new LatLng(12.96133, 77.645801)); - route.add(new LatLng(12.9621101, 77.64591)); - route.add(new LatLng(12.96264, 77.646021)); - route.add(new LatLng(12.9627101, 77.645711)); + private static ArrayList getRoute27() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.9671701, 77.63903)); + route.add(new LatLng(12.96724, 77.638821)); + route.add(new LatLng(12.96729, 77.63872)); + route.add(new LatLng(12.9673402, 77.638651)); + route.add(new LatLng(12.9674001, 77.638561)); + route.add(new LatLng(12.96747, 77.63858)); + route.add(new LatLng(12.9675802, 77.638591)); + route.add(new LatLng(12.9677202, 77.63858)); + route.add(new LatLng(12.9679701, 77.63852)); + route.add(new LatLng(12.9681601, 77.638501)); + route.add(new LatLng(12.96836, 77.63848)); + route.add(new LatLng(12.96837, 77.63888)); + route.add(new LatLng(12.9684702, 77.63978)); + route.add(new LatLng(12.96851, 77.64024)); + route.add(new LatLng(12.9685301, 77.64073)); + route.add(new LatLng(12.9686, 77.6414)); + route.add(new LatLng(12.9686102, 77.64203)); + route.add(new LatLng(12.9686, 77.6427)); + route.add(new LatLng(12.96865, 77.644141)); + route.add(new LatLng(12.9687002, 77.64561)); + route.add(new LatLng(12.9688402, 77.647771)); + route.add(new LatLng(12.96892, 77.647771)); + route.add(new LatLng(12.9689001, 77.64779)); + route.add(new LatLng(12.96888, 77.647871)); + route.add(new LatLng(12.96887, 77.64802)); + route.add(new LatLng(12.9687002, 77.6491)); + route.add(new LatLng(12.96846, 77.65012)); + route.add(new LatLng(12.96841, 77.650421)); + route.add(new LatLng(12.9685202, 77.650461)); + route.add(new LatLng(12.9700202, 77.650861)); + route.add(new LatLng(12.9703201, 77.65085)); + route.add(new LatLng(12.97038, 77.651861)); + return route; + } - return route; - } - private static ArrayList getRoute19() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9674501, 77.6393)); - route.add(new LatLng(12.96775, 77.63942)); - route.add(new LatLng(12.96766, 77.63961)); - route.add(new LatLng(12.9675302, 77.63987)); - route.add(new LatLng(12.9674802, 77.640071)); - route.add(new LatLng(12.96746, 77.64019)); - route.add(new LatLng(12.96738, 77.640161)); - route.add(new LatLng(12.96723, 77.640131)); - route.add(new LatLng(12.9672002, 77.64018)); - route.add(new LatLng(12.9669702, 77.64099)); - route.add(new LatLng(12.9668401, 77.641501)); - route.add(new LatLng(12.96606, 77.64152)); - route.add(new LatLng(12.9634002, 77.64166)); - route.add(new LatLng(12.9625, 77.6417)); - route.add(new LatLng(12.96245, 77.64175)); - route.add(new LatLng(12.96194, 77.64179)); - route.add(new LatLng(12.9617801, 77.641821)); - route.add(new LatLng(12.9616, 77.64193)); - route.add(new LatLng(12.9615202, 77.642011)); - route.add(new LatLng(12.9614401, 77.64215)); - route.add(new LatLng(12.96118, 77.64309)); - route.add(new LatLng(12.96113, 77.64318)); - route.add(new LatLng(12.96104, 77.643291)); - route.add(new LatLng(12.9608801, 77.6434)); - route.add(new LatLng(12.96047, 77.64337)); - route.add(new LatLng(12.9602701, 77.645041)); - route.add(new LatLng(12.96011, 77.646351)); - route.add(new LatLng(12.9599901, 77.64743)); - route.add(new LatLng(12.9599302, 77.64802)); - route.add(new LatLng(12.95982, 77.649071)); - route.add(new LatLng(12.95973, 77.64906)); - route.add(new LatLng(12.95982, 77.64837)); - route.add(new LatLng(12.9599302, 77.647381)); - route.add(new LatLng(12.9600702, 77.645991)); - route.add(new LatLng(12.9598001, 77.645901)); - route.add(new LatLng(12.95959, 77.64579)); - route.add(new LatLng(12.95889, 77.645501)); - route.add(new LatLng(12.9583802, 77.64524)); - route.add(new LatLng(12.9580502, 77.6451)); - route.add(new LatLng(12.9577202, 77.64493)); - route.add(new LatLng(12.9576901, 77.644911)); - route.add(new LatLng(12.9577901, 77.64472)); - route.add(new LatLng(12.9578602, 77.644561)); - route.add(new LatLng(12.95809, 77.64386)); - return route; - } - private static ArrayList getRoute20() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.96982, 77.64345)); - route.add(new LatLng(12.9703201, 77.643431)); - route.add(new LatLng(12.9703101, 77.64306)); - route.add(new LatLng(12.97029, 77.642401)); - route.add(new LatLng(12.9702601, 77.6422)); - route.add(new LatLng(12.9702201, 77.64198)); - route.add(new LatLng(12.9701801, 77.6413)); - route.add(new LatLng(12.9688502, 77.6414)); - route.add(new LatLng(12.96784, 77.64144)); - route.add(new LatLng(12.96696, 77.64148)); - route.add(new LatLng(12.9668401, 77.641501)); - route.add(new LatLng(12.9665902, 77.64234)); - route.add(new LatLng(12.9664502, 77.642671)); - route.add(new LatLng(12.96639, 77.642901)); - route.add(new LatLng(12.9662, 77.644061)); - route.add(new LatLng(12.96616, 77.64457)); - route.add(new LatLng(12.9661301, 77.64476)); - route.add(new LatLng(12.9660901, 77.64488)); - route.add(new LatLng(12.9659901, 77.64515)); - route.add(new LatLng(12.9657902, 77.64546)); - route.add(new LatLng(12.9655201, 77.64579)); - route.add(new LatLng(12.9651402, 77.646021)); - return route; - } - private static ArrayList getRoute21() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.96714, 77.63919)); - route.add(new LatLng(12.9670701, 77.63956)); - route.add(new LatLng(12.9670801, 77.639721)); - route.add(new LatLng(12.96723, 77.640131)); - route.add(new LatLng(12.9670801, 77.64059)); - route.add(new LatLng(12.96685, 77.641421)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9694301, 77.641241)); - route.add(new LatLng(12.9702701, 77.641191)); - route.add(new LatLng(12.97343, 77.641071)); - route.add(new LatLng(12.9761, 77.64094)); - route.add(new LatLng(12.9760901, 77.640341)); - route.add(new LatLng(12.97605, 77.63946)); - route.add(new LatLng(12.9760302, 77.638951)); - route.add(new LatLng(12.9760302, 77.63858)); - route.add(new LatLng(12.9750402, 77.638641)); - return route; - } - private static ArrayList getRoute22() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9750501, 77.644011)); - route.add(new LatLng(12.9750501, 77.6435)); - route.add(new LatLng(12.9744501, 77.64351)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.97389, 77.643081)); - route.add(new LatLng(12.9726101, 77.64319)); - route.add(new LatLng(12.9716, 77.643211)); - route.add(new LatLng(12.97047, 77.64328)); - route.add(new LatLng(12.9703201, 77.643291)); - route.add(new LatLng(12.9703201, 77.643431)); - route.add(new LatLng(12.97034, 77.64407)); - route.add(new LatLng(12.97014, 77.64408)); - return route; - } - private static ArrayList getRoute23() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.97577, 77.64529)); - route.add(new LatLng(12.9757601, 77.644861)); - route.add(new LatLng(12.9757101, 77.64346)); - route.add(new LatLng(12.9750501, 77.6435)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.97389, 77.642681)); - route.add(new LatLng(12.97385, 77.641141)); - route.add(new LatLng(12.9738401, 77.64105)); - route.add(new LatLng(12.9761, 77.64094)); - route.add(new LatLng(12.9760901, 77.640341)); - route.add(new LatLng(12.9760702, 77.63988)); - route.add(new LatLng(12.97605, 77.63946)); - route.add(new LatLng(12.9760302, 77.63898)); - route.add(new LatLng(12.9751401, 77.639011)); - route.add(new LatLng(12.9745202, 77.639041)); - route.add(new LatLng(12.9745, 77.6389)); - route.add(new LatLng(12.9744802, 77.638591)); - route.add(new LatLng(12.97446, 77.63826)); - route.add(new LatLng(12.9744001, 77.63799)); - route.add(new LatLng(12.9743501, 77.637891)); - route.add(new LatLng(12.9744501, 77.637841)); - route.add(new LatLng(12.97456, 77.63778)); - route.add(new LatLng(12.9745702, 77.63778)); - return route; - } - private static ArrayList getRoute24() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9738, 77.637831)); - route.add(new LatLng(12.9736802, 77.63787)); - route.add(new LatLng(12.9737202, 77.63812)); - route.add(new LatLng(12.97375, 77.638461)); - route.add(new LatLng(12.97375, 77.638471)); - route.add(new LatLng(12.97334, 77.638501)); - route.add(new LatLng(12.97338, 77.639411)); - route.add(new LatLng(12.97343, 77.641071)); - route.add(new LatLng(12.9738401, 77.64105)); - route.add(new LatLng(12.97385, 77.641141)); - route.add(new LatLng(12.97389, 77.642681)); - route.add(new LatLng(12.9739102, 77.643531)); - route.add(new LatLng(12.9739602, 77.64481)); - route.add(new LatLng(12.9726902, 77.644861)); - route.add(new LatLng(12.9716301, 77.64494)); - route.add(new LatLng(12.97089, 77.64494)); - route.add(new LatLng(12.9709102, 77.64561)); - route.add(new LatLng(12.9709102, 77.64636)); - route.add(new LatLng(12.97141, 77.646351)); - return route; - } - private static ArrayList getRoute25() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9783702, 77.64228)); - route.add(new LatLng(12.9783, 77.640261)); - route.add(new LatLng(12.9782501, 77.63934)); - route.add(new LatLng(12.9782401, 77.63888)); - route.add(new LatLng(12.97807, 77.63888)); - route.add(new LatLng(12.9775901, 77.63885)); - route.add(new LatLng(12.97723, 77.638921)); - route.add(new LatLng(12.9766901, 77.638951)); - route.add(new LatLng(12.9760302, 77.63898)); - route.add(new LatLng(12.9760302, 77.638951)); - route.add(new LatLng(12.9760302, 77.63858)); - route.add(new LatLng(12.9756502, 77.63861)); - return route; - } - private static ArrayList getRoute26() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9772601, 77.643921)); - route.add(new LatLng(12.97722, 77.64278)); - route.add(new LatLng(12.97714, 77.640981)); - route.add(new LatLng(12.97558, 77.64105)); - route.add(new LatLng(12.9720001, 77.641241)); - route.add(new LatLng(12.9701801, 77.6413)); - route.add(new LatLng(12.9688502, 77.6414)); - route.add(new LatLng(12.96784, 77.64144)); - route.add(new LatLng(12.96696, 77.64148)); - route.add(new LatLng(12.9637802, 77.641641)); - route.add(new LatLng(12.96352, 77.641651)); - route.add(new LatLng(12.9634002, 77.64166)); - route.add(new LatLng(12.9633502, 77.64176)); - route.add(new LatLng(12.9633701, 77.642261)); - route.add(new LatLng(12.9632102, 77.64363)); - route.add(new LatLng(12.96381, 77.64378)); - route.add(new LatLng(12.9639301, 77.64381)); - route.add(new LatLng(12.96386, 77.64413)); - route.add(new LatLng(12.9634101, 77.644021)); - return route; - } - private static ArrayList getRoute27() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.9671701, 77.63903)); - route.add(new LatLng(12.96724, 77.638821)); - route.add(new LatLng(12.96729, 77.63872)); - route.add(new LatLng(12.9673402, 77.638651)); - route.add(new LatLng(12.9674001, 77.638561)); - route.add(new LatLng(12.96747, 77.63858)); - route.add(new LatLng(12.9675802, 77.638591)); - route.add(new LatLng(12.9677202, 77.63858)); - route.add(new LatLng(12.9679701, 77.63852)); - route.add(new LatLng(12.9681601, 77.638501)); - route.add(new LatLng(12.96836, 77.63848)); - route.add(new LatLng(12.96837, 77.63888)); - route.add(new LatLng(12.9684702, 77.63978)); - route.add(new LatLng(12.96851, 77.64024)); - route.add(new LatLng(12.9685301, 77.64073)); - route.add(new LatLng(12.9686, 77.6414)); - route.add(new LatLng(12.9686102, 77.64203)); - route.add(new LatLng(12.9686, 77.6427)); - route.add(new LatLng(12.96865, 77.644141)); - route.add(new LatLng(12.9687002, 77.64561)); - route.add(new LatLng(12.9688402, 77.647771)); - route.add(new LatLng(12.96892, 77.647771)); - route.add(new LatLng(12.9689001, 77.64779)); - route.add(new LatLng(12.96888, 77.647871)); - route.add(new LatLng(12.96887, 77.64802)); - route.add(new LatLng(12.9687002, 77.6491)); - route.add(new LatLng(12.96846, 77.65012)); - route.add(new LatLng(12.96841, 77.650421)); - route.add(new LatLng(12.9685202, 77.650461)); - route.add(new LatLng(12.9700202, 77.650861)); - route.add(new LatLng(12.9703201, 77.65085)); - route.add(new LatLng(12.97038, 77.651861)); - return route; - } - private static ArrayList getRoute28() { - ArrayList route = new ArrayList<>(); - route.add(new LatLng(12.95865, 77.64378)); - route.add(new LatLng(12.95879, 77.643611)); - route.add(new LatLng(12.9590802, 77.64346)); - route.add(new LatLng(12.9597501, 77.64328)); - route.add(new LatLng(12.95983, 77.643261)); - route.add(new LatLng(12.9598901, 77.64314)); - route.add(new LatLng(12.9599401, 77.64282)); - route.add(new LatLng(12.96025, 77.642761)); - route.add(new LatLng(12.96044, 77.64275)); - route.add(new LatLng(12.96052, 77.64193)); - route.add(new LatLng(12.96053, 77.64139)); - route.add(new LatLng(12.9606802, 77.640251)); - route.add(new LatLng(12.9606901, 77.640211)); - route.add(new LatLng(12.96075, 77.64011)); - route.add(new LatLng(12.96086, 77.64002)); - route.add(new LatLng(12.9609701, 77.639981)); - route.add(new LatLng(12.96109, 77.63997)); - route.add(new LatLng(12.96122, 77.64)); - route.add(new LatLng(12.9613101, 77.640071)); - route.add(new LatLng(12.9613802, 77.640171)); - route.add(new LatLng(12.96141, 77.64024)); - route.add(new LatLng(12.9615001, 77.64136)); - route.add(new LatLng(12.9615302, 77.64145)); - route.add(new LatLng(12.9615901, 77.64153)); - route.add(new LatLng(12.9617, 77.64158)); - route.add(new LatLng(12.9624602, 77.64157)); - route.add(new LatLng(12.96259, 77.641591)); - route.add(new LatLng(12.9631, 77.641561)); - route.add(new LatLng(12.9634002, 77.64157)); - route.add(new LatLng(12.96349, 77.64157)); - route.add(new LatLng(12.96353, 77.64157)); - route.add(new LatLng(12.96582, 77.641461)); - route.add(new LatLng(12.96685, 77.641421)); - route.add(new LatLng(12.9685801, 77.641281)); - route.add(new LatLng(12.9702701, 77.641191)); - route.add(new LatLng(12.97343, 77.641071)); - route.add(new LatLng(12.9761, 77.64094)); - route.add(new LatLng(12.97831, 77.640801)); - route.add(new LatLng(12.97952, 77.64073)); - route.add(new LatLng(12.9799602, 77.64073)); - route.add(new LatLng(12.97995, 77.6397)); - route.add(new LatLng(12.9799602, 77.63925)); - route.add(new LatLng(12.9807701, 77.639181)); - route.add(new LatLng(12.98103, 77.63916)); - return route; - } + private static ArrayList getRoute28() { + ArrayList route = new ArrayList<>(); + route.add(new LatLng(12.95865, 77.64378)); + route.add(new LatLng(12.95879, 77.643611)); + route.add(new LatLng(12.9590802, 77.64346)); + route.add(new LatLng(12.9597501, 77.64328)); + route.add(new LatLng(12.95983, 77.643261)); + route.add(new LatLng(12.9598901, 77.64314)); + route.add(new LatLng(12.9599401, 77.64282)); + route.add(new LatLng(12.96025, 77.642761)); + route.add(new LatLng(12.96044, 77.64275)); + route.add(new LatLng(12.96052, 77.64193)); + route.add(new LatLng(12.96053, 77.64139)); + route.add(new LatLng(12.9606802, 77.640251)); + route.add(new LatLng(12.9606901, 77.640211)); + route.add(new LatLng(12.96075, 77.64011)); + route.add(new LatLng(12.96086, 77.64002)); + route.add(new LatLng(12.9609701, 77.639981)); + route.add(new LatLng(12.96109, 77.63997)); + route.add(new LatLng(12.96122, 77.64)); + route.add(new LatLng(12.9613101, 77.640071)); + route.add(new LatLng(12.9613802, 77.640171)); + route.add(new LatLng(12.96141, 77.64024)); + route.add(new LatLng(12.9615001, 77.64136)); + route.add(new LatLng(12.9615302, 77.64145)); + route.add(new LatLng(12.9615901, 77.64153)); + route.add(new LatLng(12.9617, 77.64158)); + route.add(new LatLng(12.9624602, 77.64157)); + route.add(new LatLng(12.96259, 77.641591)); + route.add(new LatLng(12.9631, 77.641561)); + route.add(new LatLng(12.9634002, 77.64157)); + route.add(new LatLng(12.96349, 77.64157)); + route.add(new LatLng(12.96353, 77.64157)); + route.add(new LatLng(12.96582, 77.641461)); + route.add(new LatLng(12.96685, 77.641421)); + route.add(new LatLng(12.9685801, 77.641281)); + route.add(new LatLng(12.9702701, 77.641191)); + route.add(new LatLng(12.97343, 77.641071)); + route.add(new LatLng(12.9761, 77.64094)); + route.add(new LatLng(12.97831, 77.640801)); + route.add(new LatLng(12.97952, 77.64073)); + route.add(new LatLng(12.9799602, 77.64073)); + route.add(new LatLng(12.97995, 77.6397)); + route.add(new LatLng(12.9799602, 77.63925)); + route.add(new LatLng(12.9807701, 77.639181)); + route.add(new LatLng(12.98103, 77.63916)); + return route; + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/marker/LatLngInterpolator.java b/app/src/main/java/com/amalbit/animationongooglemap/marker/LatLngInterpolator.java index aaa60ca..8629166 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/marker/LatLngInterpolator.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/marker/LatLngInterpolator.java @@ -4,14 +4,14 @@ public interface LatLngInterpolator { - public LatLng interpolate(float fraction, LatLng a, LatLng b); + public LatLng interpolate(float fraction, LatLng a, LatLng b); - public class Linear implements LatLngInterpolator { - @Override - public LatLng interpolate(float fraction, LatLng a, LatLng b) { - double lat = (b.latitude - a.latitude) * fraction + a.latitude; - double lng = (b.longitude - a.longitude) * fraction + a.longitude; - return new LatLng(lat, lng); + public class Linear implements LatLngInterpolator { + @Override + public LatLng interpolate(float fraction, LatLng a, LatLng b) { + double lat = (b.latitude - a.latitude) * fraction + a.latitude; + double lng = (b.longitude - a.longitude) * fraction + a.longitude; + return new LatLng(lat, lng); + } } - } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/marker/Repeat.java b/app/src/main/java/com/amalbit/animationongooglemap/marker/Repeat.java index 0abc146..e3a63cc 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/marker/Repeat.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/marker/Repeat.java @@ -4,56 +4,56 @@ import android.os.Looper; public class Repeat { - // Create a Handler that uses the Main Looper to run in - private Handler handler = new Handler(Looper.getMainLooper()); + // Create a Handler that uses the Main Looper to run in + private Handler handler = new Handler(Looper.getMainLooper()); - private Runnable statusChecker; - private int updateInterval = 2000; + private Runnable statusChecker; + private int updateInterval = 2000; - /** - * Creates an Repeat object, that can be used to - * perform UIUpdates on a specified time interval. - * - * @param uiUpdater A runnable containing the update routine. - */ - public Repeat(final Runnable uiUpdater) { - statusChecker = new Runnable() { - @Override - public void run() { - // Run the passed runnable - uiUpdater.run(); - // Re-run it after the update interval - handler.postDelayed(this, updateInterval); - } - }; - } + /** + * Creates an Repeat object, that can be used to + * perform UIUpdates on a specified time interval. + * + * @param uiUpdater A runnable containing the update routine. + */ + public Repeat(final Runnable uiUpdater) { + statusChecker = new Runnable() { + @Override + public void run() { + // Run the passed runnable + uiUpdater.run(); + // Re-run it after the update interval + handler.postDelayed(this, updateInterval); + } + }; + } - /** - * The same as the default constructor, but specifying the - * intended update interval. - * - * @param uiUpdater A runnable containing the update routine. - * @param interval The interval over which the routine - * should run (milliseconds). - */ - public Repeat(Runnable uiUpdater, int interval){ - this(uiUpdater); - updateInterval = interval; - } + /** + * The same as the default constructor, but specifying the + * intended update interval. + * + * @param uiUpdater A runnable containing the update routine. + * @param interval The interval over which the routine + * should run (milliseconds). + */ + public Repeat(Runnable uiUpdater, int interval) { + this(uiUpdater); + updateInterval = interval; + } - /** - * Starts the periodical update routine (statusChecker - * adds the callback to the handler). - */ - public synchronized void startUpdates(){ - statusChecker.run(); - } + /** + * Starts the periodical update routine (statusChecker + * adds the callback to the handler). + */ + public synchronized void startUpdates() { + statusChecker.run(); + } - /** - * Stops the periodical update routine from running, - * by removing the callback. - */ - public synchronized void stopUpdates(){ - handler.removeCallbacks(statusChecker); - } + /** + * Stops the periodical update routine from running, + * by removing the callback. + */ + public synchronized void stopUpdates() { + handler.removeCallbacks(statusChecker); + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapAnimator.java b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapAnimator.java index 47f7930..f38d848 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapAnimator.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapAnimator.java @@ -9,10 +9,12 @@ import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; + import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; + import java.util.List; /** @@ -21,203 +23,203 @@ public class MapAnimator { - private static MapAnimator mapAnimator; + private static MapAnimator mapAnimator; - private Polyline backgroundPolyline; + private Polyline backgroundPolyline; - private Polyline foregroundPolyline; + private Polyline foregroundPolyline; - private PolylineOptions optionsForeground; + private PolylineOptions optionsForeground; - private AnimatorSet firstRunAnimSet; + private AnimatorSet firstRunAnimSet; - private AnimatorSet secondLoopRunAnimSet; + private AnimatorSet secondLoopRunAnimSet; - static final int GREY = Color.parseColor("#FFA7A6A6"); + static final int GREY = Color.parseColor("#FFA7A6A6"); - private MapAnimator() { + private MapAnimator() { - } - - public static MapAnimator getInstance() { - if (mapAnimator == null) { - mapAnimator = new MapAnimator(); - } - return mapAnimator; - } - - public void animateRoute(GoogleMap googleMap, List bangaloreRoute) { - if (firstRunAnimSet == null) { - firstRunAnimSet = new AnimatorSet(); - } else { - firstRunAnimSet.removeAllListeners(); - firstRunAnimSet.end(); - firstRunAnimSet.cancel(); - - firstRunAnimSet = new AnimatorSet(); } - if (secondLoopRunAnimSet == null) { - secondLoopRunAnimSet = new AnimatorSet(); - } else { - secondLoopRunAnimSet.removeAllListeners(); - secondLoopRunAnimSet.end(); - secondLoopRunAnimSet.cancel(); - - secondLoopRunAnimSet = new AnimatorSet(); - } - //Reset the polylines - if (foregroundPolyline != null) { - foregroundPolyline.remove(); - } - if (backgroundPolyline != null) { - backgroundPolyline.remove(); - } - - PolylineOptions optionsBackground = new PolylineOptions().add(bangaloreRoute.get(0)).color(GREY).width(5); - backgroundPolyline = googleMap.addPolyline(optionsBackground); - - optionsForeground = new PolylineOptions().add(bangaloreRoute.get(0)).color(Color.BLACK).width(5); - foregroundPolyline = googleMap.addPolyline(optionsForeground); - - final ValueAnimator percentageCompletion = ValueAnimator.ofInt(0, 100); - percentageCompletion.setDuration(2000); - percentageCompletion.setInterpolator(new DecelerateInterpolator()); - percentageCompletion.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - List foregroundPoints = backgroundPolyline.getPoints(); - - int percentageValue = (int) animation.getAnimatedValue(); - int pointcount = foregroundPoints.size(); - int countTobeRemoved = (int) (pointcount * (percentageValue / 100.0f)); - List subListTobeRemoved = foregroundPoints.subList(0, countTobeRemoved); - subListTobeRemoved.clear(); - - foregroundPolyline.setPoints(foregroundPoints); - } - }); - percentageCompletion.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - } - - @Override - public void onAnimationEnd(Animator animation) { - foregroundPolyline.setColor(GREY); - foregroundPolyline.setPoints(backgroundPolyline.getPoints()); - } - - @Override - public void onAnimationCancel(Animator animation) { - } - - @Override - public void onAnimationRepeat(Animator animation) { - - } - }); - - ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), GREY, Color.BLACK); - colorAnimation.setInterpolator(new AccelerateInterpolator()); - colorAnimation.setDuration(1200); // milliseconds - - colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animator) { - foregroundPolyline.setColor((int) animator.getAnimatedValue()); - } - - }); - - ObjectAnimator foregroundRouteAnimator = ObjectAnimator - .ofObject(this, "routeIncreaseForward", new RouteEvaluator(), bangaloreRoute.toArray()); - foregroundRouteAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); - foregroundRouteAnimator.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - - } - - @Override - public void onAnimationEnd(Animator animation) { - backgroundPolyline.setPoints(foregroundPolyline.getPoints()); - } - - @Override - public void onAnimationCancel(Animator animation) { - - } - - @Override - public void onAnimationRepeat(Animator animation) { + public static MapAnimator getInstance() { + if (mapAnimator == null) { + mapAnimator = new MapAnimator(); + } + return mapAnimator; + } - } - }); - foregroundRouteAnimator.setDuration(1600); + public void animateRoute(GoogleMap googleMap, List bangaloreRoute) { + if (firstRunAnimSet == null) { + firstRunAnimSet = new AnimatorSet(); + } else { + firstRunAnimSet.removeAllListeners(); + firstRunAnimSet.end(); + firstRunAnimSet.cancel(); + + firstRunAnimSet = new AnimatorSet(); + } + if (secondLoopRunAnimSet == null) { + secondLoopRunAnimSet = new AnimatorSet(); + } else { + secondLoopRunAnimSet.removeAllListeners(); + secondLoopRunAnimSet.end(); + secondLoopRunAnimSet.cancel(); + + secondLoopRunAnimSet = new AnimatorSet(); + } + //Reset the polylines + if (foregroundPolyline != null) { + foregroundPolyline.remove(); + } + if (backgroundPolyline != null) { + backgroundPolyline.remove(); + } + + PolylineOptions optionsBackground = new PolylineOptions().add(bangaloreRoute.get(0)).color(GREY).width(5); + backgroundPolyline = googleMap.addPolyline(optionsBackground); + + optionsForeground = new PolylineOptions().add(bangaloreRoute.get(0)).color(Color.BLACK).width(5); + foregroundPolyline = googleMap.addPolyline(optionsForeground); + + final ValueAnimator percentageCompletion = ValueAnimator.ofInt(0, 100); + percentageCompletion.setDuration(2000); + percentageCompletion.setInterpolator(new DecelerateInterpolator()); + percentageCompletion.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + List foregroundPoints = backgroundPolyline.getPoints(); + + int percentageValue = (int) animation.getAnimatedValue(); + int pointcount = foregroundPoints.size(); + int countTobeRemoved = (int) (pointcount * (percentageValue / 100.0f)); + List subListTobeRemoved = foregroundPoints.subList(0, countTobeRemoved); + subListTobeRemoved.clear(); + + foregroundPolyline.setPoints(foregroundPoints); + } + }); + percentageCompletion.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + foregroundPolyline.setColor(GREY); + foregroundPolyline.setPoints(backgroundPolyline.getPoints()); + } + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + + ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), GREY, Color.BLACK); + colorAnimation.setInterpolator(new AccelerateInterpolator()); + colorAnimation.setDuration(1200); // milliseconds + + colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animator) { + foregroundPolyline.setColor((int) animator.getAnimatedValue()); + } + + }); + + ObjectAnimator foregroundRouteAnimator = ObjectAnimator + .ofObject(this, "routeIncreaseForward", new RouteEvaluator(), bangaloreRoute.toArray()); + foregroundRouteAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); + foregroundRouteAnimator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + backgroundPolyline.setPoints(foregroundPolyline.getPoints()); + } + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + foregroundRouteAnimator.setDuration(1600); // foregroundRouteAnimator.start(); - firstRunAnimSet.playSequentially(foregroundRouteAnimator, - percentageCompletion); - firstRunAnimSet.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { + firstRunAnimSet.playSequentially(foregroundRouteAnimator, + percentageCompletion); + firstRunAnimSet.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { - } + } - @Override - public void onAnimationEnd(Animator animation) { - secondLoopRunAnimSet.start(); - } + @Override + public void onAnimationEnd(Animator animation) { + secondLoopRunAnimSet.start(); + } - @Override - public void onAnimationCancel(Animator animation) { + @Override + public void onAnimationCancel(Animator animation) { - } + } - @Override - public void onAnimationRepeat(Animator animation) { + @Override + public void onAnimationRepeat(Animator animation) { - } - }); + } + }); - secondLoopRunAnimSet.playSequentially(colorAnimation, - percentageCompletion); - secondLoopRunAnimSet.setStartDelay(200); + secondLoopRunAnimSet.playSequentially(colorAnimation, + percentageCompletion); + secondLoopRunAnimSet.setStartDelay(200); - secondLoopRunAnimSet.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { + secondLoopRunAnimSet.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { - } + } - @Override - public void onAnimationEnd(Animator animation) { - secondLoopRunAnimSet.start(); - } + @Override + public void onAnimationEnd(Animator animation) { + secondLoopRunAnimSet.start(); + } - @Override - public void onAnimationCancel(Animator animation) { + @Override + public void onAnimationCancel(Animator animation) { - } + } - @Override - public void onAnimationRepeat(Animator animation) { + @Override + public void onAnimationRepeat(Animator animation) { - } - }); + } + }); - firstRunAnimSet.start(); - } + firstRunAnimSet.start(); + } - /** - * This will be invoked by the ObjectAnimator multiple times. Mostly every 16ms. - **/ - public void setRouteIncreaseForward(LatLng endLatLng) { - List foregroundPoints = foregroundPolyline.getPoints(); - foregroundPoints.add(endLatLng); - foregroundPolyline.setPoints(foregroundPoints); - } + /** + * This will be invoked by the ObjectAnimator multiple times. Mostly every 16ms. + **/ + public void setRouteIncreaseForward(LatLng endLatLng) { + List foregroundPoints = foregroundPolyline.getPoints(); + foregroundPoints.add(endLatLng); + foregroundPolyline.setPoints(foregroundPoints); + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java index d635677..75bea9d 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/MapsActivity.java @@ -14,95 +14,96 @@ import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; + import java.util.ArrayList; import java.util.List; public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback { - private static final LatLng POINT_A = new LatLng(12.922294704121231, 77.61939525604248); + private static final LatLng POINT_A = new LatLng(12.922294704121231, 77.61939525604248); - private static final LatLng POINT_B = new LatLng(12.933065305628435, 77.62390136718749); + private static final LatLng POINT_B = new LatLng(12.933065305628435, 77.62390136718749); - private List bangaloreRoute; + private List bangaloreRoute; - private GoogleMap mMap; + private GoogleMap mMap; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_maps); - // Obtain the SupportMapFragment and get notified when the map is ready to be used. - SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() - .findFragmentById(R.id.map); - mapFragment.getMapAsync(this); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_maps); + // Obtain the SupportMapFragment and get notified when the map is ready to be used. + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() + .findFragmentById(R.id.map); + mapFragment.getMapAsync(this); - createRoute(); - } + createRoute(); + } - private void createRoute() { - if (bangaloreRoute == null) { - bangaloreRoute = new ArrayList<>(); - } else { - bangaloreRoute.clear(); + private void createRoute() { + if (bangaloreRoute == null) { + bangaloreRoute = new ArrayList<>(); + } else { + bangaloreRoute.clear(); + } + + bangaloreRoute.add(new LatLng(12.922294704121231, 77.61939525604248)); + bangaloreRoute.add(new LatLng(12.924637088068884, 77.6180648803711)); + bangaloreRoute.add(new LatLng(12.925557304321782, 77.6200819015503)); + bangaloreRoute.add(new LatLng(12.927104933097784, 77.62081146240234)); + bangaloreRoute.add(new LatLng(12.928234277770715, 77.62111186981201)); + bangaloreRoute.add(new LatLng(12.92990737159723, 77.6218843460083)); + bangaloreRoute.add(new LatLng(12.9337554448302, 77.62342929840088)); + bangaloreRoute.add(new LatLng(12.9346338010532, 77.62390136718749)); + bangaloreRoute.add(new LatLng(12.935177543831987, 77.62437343597412)); + bangaloreRoute.add(new LatLng(12.934487408564122, 77.62561798095703)); + bangaloreRoute.add(new LatLng(12.934320102757125, 77.62589693069457)); + bangaloreRoute.add(new LatLng(12.933860011209374, 77.62572526931763)); + bangaloreRoute.add(new LatLng(12.934550148212828, 77.62460947036743)); + bangaloreRoute.add(new LatLng(12.933379005502244, 77.62398719787598)); + bangaloreRoute.add(new LatLng(12.933065305628435, 77.62390136718749)); } - bangaloreRoute.add(new LatLng(12.922294704121231, 77.61939525604248)); - bangaloreRoute.add(new LatLng(12.924637088068884, 77.6180648803711)); - bangaloreRoute.add(new LatLng(12.925557304321782, 77.6200819015503)); - bangaloreRoute.add(new LatLng(12.927104933097784, 77.62081146240234)); - bangaloreRoute.add(new LatLng(12.928234277770715, 77.62111186981201)); - bangaloreRoute.add(new LatLng(12.92990737159723, 77.6218843460083)); - bangaloreRoute.add(new LatLng(12.9337554448302, 77.62342929840088)); - bangaloreRoute.add(new LatLng(12.9346338010532, 77.62390136718749)); - bangaloreRoute.add(new LatLng(12.935177543831987, 77.62437343597412)); - bangaloreRoute.add(new LatLng(12.934487408564122, 77.62561798095703)); - bangaloreRoute.add(new LatLng(12.934320102757125, 77.62589693069457)); - bangaloreRoute.add(new LatLng(12.933860011209374, 77.62572526931763)); - bangaloreRoute.add(new LatLng(12.934550148212828, 77.62460947036743)); - bangaloreRoute.add(new LatLng(12.933379005502244, 77.62398719787598)); - bangaloreRoute.add(new LatLng(12.933065305628435, 77.62390136718749)); - } - - - /** - * Manipulates the map once available. - * This callback is triggered when the map is ready to be used. - * This is where we can add markers or lines, add listeners or move the camera. In this case, - * we just add a marker near Sydney, Australia. - * If Google Play services is not installed on the device, the user will be prompted to install - * it inside the SupportMapFragment. This method will only be triggered once the user has - * installed Google Play services and returned to the app. - */ - @Override - public void onMapReady(GoogleMap map) { - mMap = map; - - mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { - @Override - public void onMapLoaded() { - LatLngBounds.Builder builder = new LatLngBounds.Builder(); - builder.include(POINT_A); - builder.include(POINT_B); - LatLngBounds bounds = builder.build(); - CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 200); - - mMap.moveCamera(cu); - mMap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null); - startAnim(); - } - }); - } - - private void startAnim() { - if (mMap != null) { - MapAnimator.getInstance().animateRoute(mMap, bangaloreRoute); - } else { - Toast.makeText(getApplicationContext(), "Map not ready", Toast.LENGTH_LONG).show(); + /** + * Manipulates the map once available. + * This callback is triggered when the map is ready to be used. + * This is where we can add markers or lines, add listeners or move the camera. In this case, + * we just add a marker near Sydney, Australia. + * If Google Play services is not installed on the device, the user will be prompted to install + * it inside the SupportMapFragment. This method will only be triggered once the user has + * installed Google Play services and returned to the app. + */ + @Override + public void onMapReady(GoogleMap map) { + mMap = map; + + mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { + @Override + public void onMapLoaded() { + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + builder.include(POINT_A); + builder.include(POINT_B); + LatLngBounds bounds = builder.build(); + CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 200); + + mMap.moveCamera(cu); + mMap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null); + + startAnim(); + } + }); } - } - public void resetAnimation(View view) { - startAnim(); - } + private void startAnim() { + if (mMap != null) { + MapAnimator.getInstance().animateRoute(mMap, bangaloreRoute); + } else { + Toast.makeText(getApplicationContext(), "Map not ready", Toast.LENGTH_LONG).show(); + } + } + + public void resetAnimation(View view) { + startAnim(); + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/RouteEvaluator.java b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/RouteEvaluator.java index 0c320e1..2e4ea47 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/RouteEvaluator.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/polylineBased/RouteEvaluator.java @@ -1,6 +1,7 @@ package com.amalbit.animationongooglemap.polylineBased; import android.animation.TypeEvaluator; + import com.google.android.gms.maps.model.LatLng; /** @@ -9,10 +10,10 @@ public class RouteEvaluator implements TypeEvaluator { - @Override - public LatLng evaluate(float t, LatLng startPoint, LatLng endPoint) { - double lat = startPoint.latitude + t * (endPoint.latitude - startPoint.latitude); - double lng = startPoint.longitude + t * (endPoint.longitude - startPoint.longitude); - return new LatLng(lat, lng); - } + @Override + public LatLng evaluate(float t, LatLng startPoint, LatLng endPoint) { + double lat = startPoint.latitude + t * (endPoint.latitude - startPoint.latitude); + double lng = startPoint.longitude + t * (endPoint.longitude - startPoint.longitude); + return new LatLng(lat, lng); + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java index d5898e3..434bd03 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/BaseActivity.java @@ -18,61 +18,61 @@ public class BaseActivity extends AppCompatActivity { - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - Window w = getWindow(); - w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window w = getWindow(); + w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + } } - } - public void setMapBounds(GoogleMap googleMap) { - List latLngs = new ArrayList<>(); - latLngs.add(new LatLng(12.9715002, 77.6374856));//NW - latLngs.add(new LatLng(12.9703733, 77.6372037));//NE - latLngs.add(new LatLng(12.9595674, 77.6366595));//SE - latLngs.add(new LatLng(12.9595672, 77.6519803));//SW - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - for (LatLng latLngPoint : latLngs) { - boundsBuilder.include(latLngPoint); + public void setMapBounds(GoogleMap googleMap) { + List latLngs = new ArrayList<>(); + latLngs.add(new LatLng(12.9715002, 77.6374856));//NW + latLngs.add(new LatLng(12.9703733, 77.6372037));//NE + latLngs.add(new LatLng(12.9595674, 77.6366595));//SE + latLngs.add(new LatLng(12.9595672, 77.6519803));//SW + LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); + for (LatLng latLngPoint : latLngs) { + boundsBuilder.include(latLngPoint); + } + LatLngBounds latLngBounds = boundsBuilder.build(); + googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 100)); } - LatLngBounds latLngBounds = boundsBuilder.build(); - googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 100)); - } - float getBearing(LatLng begin, LatLng end) { - double lat = Math.abs(begin.latitude - end.latitude); - double lng = Math.abs(begin.longitude - end.longitude); + float getBearing(LatLng begin, LatLng end) { + double lat = Math.abs(begin.latitude - end.latitude); + double lng = Math.abs(begin.longitude - end.longitude); - if (begin.latitude < end.latitude && begin.longitude < end.longitude) { - return (float) (Math.toDegrees(Math.atan(lng / lat))); - } else if (begin.latitude >= end.latitude && begin.longitude < end.longitude) { - return (float) ((90 - Math.toDegrees(Math.atan(lng / lat))) + 90); - } else if (begin.latitude >= end.latitude && begin.longitude >= end.longitude) { - return (float) (Math.toDegrees(Math.atan(lng / lat)) + 180); - } else if (begin.latitude < end.latitude && begin.longitude >= end.longitude) { - return (float) ((90 - Math.toDegrees(Math.atan(lng / lat))) + 270); + if (begin.latitude < end.latitude && begin.longitude < end.longitude) { + return (float) (Math.toDegrees(Math.atan(lng / lat))); + } else if (begin.latitude >= end.latitude && begin.longitude < end.longitude) { + return (float) ((90 - Math.toDegrees(Math.atan(lng / lat))) + 90); + } else if (begin.latitude >= end.latitude && begin.longitude >= end.longitude) { + return (float) (Math.toDegrees(Math.atan(lng / lat)) + 180); + } else if (begin.latitude < end.latitude && begin.longitude >= end.longitude) { + return (float) ((90 - Math.toDegrees(Math.atan(lng / lat))) + 270); + } + return -1; } - return -1; - } - public static final int STRAIGHT_ANGLE = 180; - public static final int FULL_ROTATION = 360; + public static final int STRAIGHT_ANGLE = 180; + public static final int FULL_ROTATION = 360; - float calcMinAngle(float markerCurrentRotation, float markerNextRotation) { - float angleDifference = (Math.abs(markerNextRotation - markerCurrentRotation)); - if (angleDifference > STRAIGHT_ANGLE) { - if (markerCurrentRotation < 0) { - markerNextRotation = (-FULL_ROTATION + angleDifference) + markerCurrentRotation; - } else { - markerNextRotation = (FULL_ROTATION - angleDifference) + markerCurrentRotation; - } + float calcMinAngle(float markerCurrentRotation, float markerNextRotation) { + float angleDifference = (Math.abs(markerNextRotation - markerCurrentRotation)); + if (angleDifference > STRAIGHT_ANGLE) { + if (markerCurrentRotation < 0) { + markerNextRotation = (-FULL_ROTATION + angleDifference) + markerCurrentRotation; + } else { + markerNextRotation = (FULL_ROTATION - angleDifference) + markerCurrentRotation; + } + } + return markerNextRotation > FULL_ROTATION + ? markerNextRotation - FULL_ROTATION + : markerNextRotation; } - return markerNextRotation > FULL_ROTATION - ? markerNextRotation - FULL_ROTATION - : markerNextRotation; - } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/FromToActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/FromToActivity.java index 6217377..fd1d3b6 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/FromToActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/FromToActivity.java @@ -8,6 +8,7 @@ import android.os.Bundle; import android.view.animation.LinearInterpolator; import android.widget.ImageView; + import com.amalbit.animationongooglemap.R; import com.amalbit.animationongooglemap.U; import com.amalbit.animationongooglemap.data.CarData.Car; @@ -21,181 +22,182 @@ import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; + import java.util.ArrayList; import java.util.List; public class FromToActivity extends BaseActivity implements OnMapReadyCallback, OnMarkerUpdate { - private GoogleMap mMap; + private GoogleMap mMap; - private MarkerOverlayView markerOverlayView; + private MarkerOverlayView markerOverlayView; - private Bitmap markerIcon; + private Bitmap markerIcon; - private Repeat repeat; + private Repeat repeat; - private ImageView imgTest; + private ImageView imgTest; - private float lastBearing = 0; + private float lastBearing = 0; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_from_to); - markerIcon = BitmapFactory.decodeResource(getResources(), R.drawable.car); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_from_to); + markerIcon = BitmapFactory.decodeResource(getResources(), R.drawable.car); - imgTest = findViewById(R.id.imgTest); - imgTest.setOnClickListener(v -> { + imgTest = findViewById(R.id.imgTest); + imgTest.setOnClickListener(v -> { // imgTest.setImageBitmap( // rotateBitmap1(markerIcon, ) // ); - float bearing = 30;//ThreadLocalRandom.current().nextInt(0, 360 + 1); - ValueAnimator rotateValueAnimator = ValueAnimator.ofFloat(lastBearing, bearing); - rotateValueAnimator.addUpdateListener(animation -> { - float v1 = (float) animation.getAnimatedValue(); - U.log("rotation", "from " + lastBearing + "| to " + bearing + " || " + "fraction : " + v); - imgTest.setImageBitmap(rotateBitmap1(markerIcon, v1)); - }); + float bearing = 30;//ThreadLocalRandom.current().nextInt(0, 360 + 1); + ValueAnimator rotateValueAnimator = ValueAnimator.ofFloat(lastBearing, bearing); + rotateValueAnimator.addUpdateListener(animation -> { + float v1 = (float) animation.getAnimatedValue(); + U.log("rotation", "from " + lastBearing + "| to " + bearing + " || " + "fraction : " + v); + imgTest.setImageBitmap(rotateBitmap1(markerIcon, v1)); + }); // rotateValueAnimator.setFloatValues(0, 1); // Ignored. - rotateValueAnimator.setDuration(200); - rotateValueAnimator.start(); - }); - - markerOverlayView = findViewById(R.id.mapMarkerOverlayView); - SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() - .findFragmentById(R.id.map); - mapFragment.getMapAsync(this); - } - - @Override - public void onMapReady(GoogleMap map) { - mMap = map; - - mMap.setOnMapLoadedCallback(() -> { - mMap.setOnCameraMoveListener(() -> markerOverlayView.onCameraMove(mMap)); - - setMapBounds(map); - - ArrayList indiranagarRoutes = LatlngData.getIndiranagarRoutes(); - repeat = new Repeat(() -> addMarkerWithAnimation(indiranagarRoutes), 1000); - - markerOverlayView.post(() -> { - repeat.startUpdates(); - }); - }); - } - - public void addMarkerWithAnimation(List cars) { - U.log("doublemarker", "-------------------------------addMarkerWithAnimation----------------------------"); - U.log("doublemarker", "Cars count : " + cars.size()); - U.log("doublemarker", "Markers count : " + markerOverlayView.getMarkerCount()); - U.log("doublemarker", "---------------------------------------------------------------------------------"); - runOnUiThread(() -> { - for (Car car : cars) { - final OverlayMarker overlayMarker = markerOverlayView.findMarkerById(car.getCarId()); - if (overlayMarker == null) { - OverlayMarker overlayMarker1 = new OverlayMarker(); - overlayMarker1.setIcon(markerIcon.copy(markerIcon.getConfig(), true)); - overlayMarker1.setMarkerId(car.getCarId()); - overlayMarker1.setLatLng(car.getLatLng()); - overlayMarker1.setOnMarkerUpdate(FromToActivity.this); - - ValueAnimator translateValueAnimator = new ValueAnimator(); - translateValueAnimator.setInterpolator(new LinearInterpolator()); - overlayMarker1.setTranslateValueAnimator(translateValueAnimator); - - ValueAnimator rotateValueAnimator = new ValueAnimator(); - rotateValueAnimator.setInterpolator(new LinearInterpolator()); - overlayMarker1.setRotateValueAnimator(rotateValueAnimator); - - markerOverlayView.addMarker(overlayMarker1, mMap.getProjection()); - } else { - final LatLng startLatLng = overlayMarker.getLatLng(); - final LatLng endLatLng = car.getLatLng(); - float bearing = 0; + rotateValueAnimator.setDuration(200); + rotateValueAnimator.start(); + }); + + markerOverlayView = findViewById(R.id.mapMarkerOverlayView); + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() + .findFragmentById(R.id.map); + mapFragment.getMapAsync(this); + } + + @Override + public void onMapReady(GoogleMap map) { + mMap = map; + + mMap.setOnMapLoadedCallback(() -> { + mMap.setOnCameraMoveListener(() -> markerOverlayView.onCameraMove(mMap)); + + setMapBounds(map); + + ArrayList indiranagarRoutes = LatlngData.getIndiranagarRoutes(); + repeat = new Repeat(() -> addMarkerWithAnimation(indiranagarRoutes), 1000); + + markerOverlayView.post(() -> { + repeat.startUpdates(); + }); + }); + } + + public void addMarkerWithAnimation(List cars) { + U.log("doublemarker", "-------------------------------addMarkerWithAnimation----------------------------"); + U.log("doublemarker", "Cars count : " + cars.size()); + U.log("doublemarker", "Markers count : " + markerOverlayView.getMarkerCount()); + U.log("doublemarker", "---------------------------------------------------------------------------------"); + runOnUiThread(() -> { + for (Car car : cars) { + final OverlayMarker overlayMarker = markerOverlayView.findMarkerById(car.getCarId()); + if (overlayMarker == null) { + OverlayMarker overlayMarker1 = new OverlayMarker(); + overlayMarker1.setIcon(markerIcon.copy(markerIcon.getConfig(), true)); + overlayMarker1.setMarkerId(car.getCarId()); + overlayMarker1.setLatLng(car.getLatLng()); + overlayMarker1.setOnMarkerUpdate(FromToActivity.this); + + ValueAnimator translateValueAnimator = new ValueAnimator(); + translateValueAnimator.setInterpolator(new LinearInterpolator()); + overlayMarker1.setTranslateValueAnimator(translateValueAnimator); + + ValueAnimator rotateValueAnimator = new ValueAnimator(); + rotateValueAnimator.setInterpolator(new LinearInterpolator()); + overlayMarker1.setRotateValueAnimator(rotateValueAnimator); + + markerOverlayView.addMarker(overlayMarker1, mMap.getProjection()); + } else { + final LatLng startLatLng = overlayMarker.getLatLng(); + final LatLng endLatLng = car.getLatLng(); + float bearing = 0; // overlayMarker.setIcon(markerIcon); - bearing = getBearing(startLatLng, endLatLng); - - ValueAnimator valueAnimator = overlayMarker.getTranslateValueAnimator(); - valueAnimator.removeAllUpdateListeners(); - valueAnimator.addUpdateListener(animation -> { - float v = animation.getAnimatedFraction(); - LatLng newPosition = new LatLngInterpolator.Linear().interpolate(v, startLatLng, endLatLng); - overlayMarker.setLatLng(newPosition); - markerOverlayView.updateMarker(overlayMarker, mMap.getProjection()); - }); - valueAnimator.setFloatValues(0, 1); // Ignored. - valueAnimator.setDuration(1000); - valueAnimator.start(); - - overlayMarker.setLatLng(endLatLng); - markerOverlayView.updateMarker(overlayMarker, mMap.getProjection()); - - float lastBearing = overlayMarker.getBearing(); - ValueAnimator rotateValueAnimator = overlayMarker.getRotateValueAnimator(); - rotateValueAnimator.removeAllUpdateListeners(); - rotateValueAnimator.cancel(); - - final float brearingFinal = bearing; - - rotateValueAnimator = ValueAnimator.ofFloat(lastBearing, calcMinAngle(lastBearing, bearing)); - rotateValueAnimator.addUpdateListener(animation -> { - float v = (float) animation.getAnimatedValue(); - overlayMarker.setBearing(v); - overlayMarker.rotateIcon(v); + bearing = getBearing(startLatLng, endLatLng); + + ValueAnimator valueAnimator = overlayMarker.getTranslateValueAnimator(); + valueAnimator.removeAllUpdateListeners(); + valueAnimator.addUpdateListener(animation -> { + float v = animation.getAnimatedFraction(); + LatLng newPosition = new LatLngInterpolator.Linear().interpolate(v, startLatLng, endLatLng); + overlayMarker.setLatLng(newPosition); + markerOverlayView.updateMarker(overlayMarker, mMap.getProjection()); + }); + valueAnimator.setFloatValues(0, 1); // Ignored. + valueAnimator.setDuration(1000); + valueAnimator.start(); + + overlayMarker.setLatLng(endLatLng); + markerOverlayView.updateMarker(overlayMarker, mMap.getProjection()); + + float lastBearing = overlayMarker.getBearing(); + ValueAnimator rotateValueAnimator = overlayMarker.getRotateValueAnimator(); + rotateValueAnimator.removeAllUpdateListeners(); + rotateValueAnimator.cancel(); + + final float brearingFinal = bearing; + + rotateValueAnimator = ValueAnimator.ofFloat(lastBearing, calcMinAngle(lastBearing, bearing)); + rotateValueAnimator.addUpdateListener(animation -> { + float v = (float) animation.getAnimatedValue(); + overlayMarker.setBearing(v); + overlayMarker.rotateIcon(v); // U.log("rotation", "from " + lastBearing + "| to " + brearingFinal + " || " + "fraction : " + v); - markerOverlayView.updateMarkerAngle(overlayMarker); - }); - rotateValueAnimator.setDuration(200); - rotateValueAnimator.start(); + markerOverlayView.updateMarkerAngle(overlayMarker); + }); + rotateValueAnimator.setDuration(200); + rotateValueAnimator.start(); - overlayMarker.setRotateValueAnimator(rotateValueAnimator); - } - } - }); - } + overlayMarker.setRotateValueAnimator(rotateValueAnimator); + } + } + }); + } - private Bitmap rotateBitmap(Bitmap original, float degrees) { - int width = original.getWidth(); - int height = original.getHeight(); + private Bitmap rotateBitmap(Bitmap original, float degrees) { + int width = original.getWidth(); + int height = original.getHeight(); - Matrix matrix = new Matrix(); - matrix.preRotate(degrees); + Matrix matrix = new Matrix(); + matrix.preRotate(degrees); - Bitmap workingBitmap = Bitmap.createBitmap(original); - Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); + Bitmap workingBitmap = Bitmap.createBitmap(original); + Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); - Bitmap rotatedBitmap = Bitmap.createBitmap(mutableBitmap, 0, 0, width, height, matrix, true); - Canvas canvas = new Canvas(rotatedBitmap); - canvas.drawBitmap(original, 5.0f, 0.0f, null); + Bitmap rotatedBitmap = Bitmap.createBitmap(mutableBitmap, 0, 0, width, height, matrix, true); + Canvas canvas = new Canvas(rotatedBitmap); + canvas.drawBitmap(original, 5.0f, 0.0f, null); - return rotatedBitmap; - } + return rotatedBitmap; + } - public Bitmap rotateBitmap1(Bitmap original, float degrees) { - int width = original.getWidth(); - int height = original.getHeight(); + public Bitmap rotateBitmap1(Bitmap original, float degrees) { + int width = original.getWidth(); + int height = original.getHeight(); - Matrix matrix = new Matrix(); + Matrix matrix = new Matrix(); - matrix.postRotate(degrees); + matrix.postRotate(degrees); - Bitmap scaledBitmap = Bitmap.createScaledBitmap(original, width, height, true); + Bitmap scaledBitmap = Bitmap.createScaledBitmap(original, width, height, true); // original.recycle(); - return Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); - } + return Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); + } - @Override - protected void onPause() { - super.onPause(); - repeat.stopUpdates(); - } + @Override + protected void onPause() { + super.onPause(); + repeat.stopUpdates(); + } - @Override - public void onMarkerUpdate() { - markerOverlayView.invalidate(); - } + @Override + public void onMarkerUpdate() { + markerOverlayView.invalidate(); + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/OverlayRouteActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/OverlayRouteActivity.java index 9faf8af..2c23b65 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/OverlayRouteActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/OverlayRouteActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; + import com.amalbit.animationongooglemap.R; import com.amalbit.animationongooglemap.data.LatlngData; import com.amalbit.trail.OverlayPolyline; @@ -13,132 +14,131 @@ import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.CancelableCallback; import com.google.android.gms.maps.OnMapReadyCallback; -import com.google.android.gms.maps.Projection; import com.google.android.gms.maps.SupportMapFragment; -import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.MapStyleOptions; + import java.util.List; public class OverlayRouteActivity extends BaseActivity implements OnMapReadyCallback { - private static String TAG = "OverlayRouteActivity"; + private static String TAG = "OverlayRouteActivity"; - private GoogleMap mMap; + private GoogleMap mMap; - private MapStyleOptions mapStyle; + private MapStyleOptions mapStyle; - private List mRoute; + private List mRoute; - private RouteOverlayView mRouteOverlayView; + private RouteOverlayView mRouteOverlayView; - private SupportMapFragment mapFragment; + private SupportMapFragment mapFragment; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_projection_route); - initUI(); - mapFragment = (SupportMapFragment) getSupportFragmentManager() - .findFragmentById(R.id.map); - mapFragment.getMapAsync(this); - mRoute = LatlngData.getRoute(); - mapStyle = MapStyleOptions.loadRawResourceStyle(getApplicationContext(), R.raw.map_style); - } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_projection_route); + initUI(); + mapFragment = (SupportMapFragment) getSupportFragmentManager() + .findFragmentById(R.id.map); + mapFragment.getMapAsync(this); + mRoute = LatlngData.getRoute(); + mapStyle = MapStyleOptions.loadRawResourceStyle(getApplicationContext(), R.raw.map_style); + } - public void onClick1(View view) { - switch (view.getId()) { - case R.id.btnAdd: - mRouteOverlayView.removeRoutes(); - zoomRoute(mRoute); - break; - case R.id.btnRemove: - mRouteOverlayView.removeRoutes(); - break; + public void onClick1(View view) { + switch (view.getId()) { + case R.id.btnAdd: + mRouteOverlayView.removeRoutes(); + zoomRoute(mRoute); + break; + case R.id.btnRemove: + mRouteOverlayView.removeRoutes(); + break; + } } - } - - private void initUI() { - mRouteOverlayView = findViewById(R.id.mapOverlayView); - ArrayAdapter adapter = ArrayAdapter.createFromResource(this, - R.array.array_place, android.R.layout.simple_spinner_item); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - } - - @Override - public void onMapReady(final GoogleMap map) { - mMap = map; - mMap.setMapStyle(mapStyle); - mMap.getUiSettings().setRotateGesturesEnabled(false); - mMap.getUiSettings().setTiltGesturesEnabled(false); - - mMap.setOnMapLoadedCallback(() -> { - mMap.setPadding(0, 0, 0, 250); - zoomRoute(mRoute); - drawRoutes(); - mMap.setOnCameraMoveListener(() -> { - mRouteOverlayView.onCameraMove(); - - } - ); - }); - } - - public void zoomRoute(List lstLatLngRoute) { - - if (mMap == null || lstLatLngRoute == null || lstLatLngRoute.isEmpty()) { - return; + + private void initUI() { + mRouteOverlayView = findViewById(R.id.mapOverlayView); + ArrayAdapter adapter = ArrayAdapter.createFromResource(this, + R.array.array_place, android.R.layout.simple_spinner_item); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); } - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - for (LatLng latLngPoint : lstLatLngRoute) { - boundsBuilder.include(latLngPoint); + + @Override + public void onMapReady(final GoogleMap map) { + mMap = map; + mMap.setMapStyle(mapStyle); + mMap.getUiSettings().setRotateGesturesEnabled(false); + mMap.getUiSettings().setTiltGesturesEnabled(false); + + mMap.setOnMapLoadedCallback(() -> { + mMap.setPadding(0, 0, 0, 250); + zoomRoute(mRoute); + drawRoutes(); + mMap.setOnCameraMoveListener(() -> { + mRouteOverlayView.onCameraMove(); + + } + ); + }); } - for (LatLng latLng : LatlngData.getRouteB()) { - boundsBuilder.include(latLng); + + public void zoomRoute(List lstLatLngRoute) { + + if (mMap == null || lstLatLngRoute == null || lstLatLngRoute.isEmpty()) { + return; + } + LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); + for (LatLng latLngPoint : lstLatLngRoute) { + boundsBuilder.include(latLngPoint); + } + for (LatLng latLng : LatlngData.getRouteB()) { + boundsBuilder.include(latLng); + } + + LatLngBounds latLngBounds = boundsBuilder.build(); + + mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 100), 200, new CancelableCallback() { + @Override + public void onFinish() { + drawRoutes(); + } + + @Override + public void onCancel() { + + } + }); } - LatLngBounds latLngBounds = boundsBuilder.build(); - - mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 100), 200, new CancelableCallback() { - @Override - public void onFinish() { - drawRoutes(); - } - - @Override - public void onCancel() { - - } - }); - } - - private void drawRoutes() { - OverlayPolyline normalOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) - .setRouteType(RouteType.PATH) - .setCameraPosition(mMap.getCameraPosition()) - .setProjection(mMap.getProjection()) - .setLatLngs(mRoute) - .setBottomLayerColor(Color.YELLOW) - .setTopLayerColor(Color.RED) - .create(); - - OverlayPolyline dashOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) - .setRouteType(RouteType.DASH) - .setCameraPosition(mMap.getCameraPosition()) - .setProjection(mMap.getProjection()) - .setLatLngs(LatlngData.getRouteB()) - .setDashColor(Color.BLACK) - .create(); - - OverlayPolyline arcOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) - .setRouteType(RouteType.ARC) - .setCameraPosition(mMap.getCameraPosition()) - .setProjection(mMap.getProjection()) - .setLatLngs(LatlngData.getRouteB()) - .setBottomLayerColor(Color.GRAY) - .setTopLayerColor(Color.BLACK) - .setRouteShadowColor(Color.GRAY) - .create(); - } + private void drawRoutes() { + OverlayPolyline normalOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) + .setRouteType(RouteType.PATH) + .setCameraPosition(mMap.getCameraPosition()) + .setProjection(mMap.getProjection()) + .setLatLngs(mRoute) + .setBottomLayerColor(Color.YELLOW) + .setTopLayerColor(Color.RED) + .create(); + + OverlayPolyline dashOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) + .setRouteType(RouteType.DASH) + .setCameraPosition(mMap.getCameraPosition()) + .setProjection(mMap.getProjection()) + .setLatLngs(LatlngData.getRouteB()) + .setDashColor(Color.BLACK) + .create(); + + OverlayPolyline arcOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) + .setRouteType(RouteType.ARC) + .setCameraPosition(mMap.getCameraPosition()) + .setProjection(mMap.getProjection()) + .setLatLngs(LatlngData.getRouteB()) + .setBottomLayerColor(Color.GRAY) + .setTopLayerColor(Color.BLACK) + .setRouteShadowColor(Color.GRAY) + .create(); + } } diff --git a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/ViewOverlayActivity.java b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/ViewOverlayActivity.java index 80577c8..247e677 100644 --- a/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/ViewOverlayActivity.java +++ b/app/src/main/java/com/amalbit/animationongooglemap/projectionBased/ViewOverlayActivity.java @@ -9,6 +9,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.animation.LinearInterpolator; + import com.amalbit.animationongooglemap.R; import com.amalbit.animationongooglemap.U; import com.amalbit.animationongooglemap.data.CarData.Car; @@ -31,413 +32,412 @@ import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.MarkerOptions; + import java.util.ArrayList; import java.util.List; public class ViewOverlayActivity extends BaseActivity implements OnMapReadyCallback, OnClickListener, OnMarkerUpdate { - private GoogleMap mMap; + private GoogleMap mMap; - private OverlayLayout overlayLayout; + private OverlayLayout overlayLayout; - private ViewOverlayView viewOverlayView; + private ViewOverlayView viewOverlayView; - private RouteOverlayView mRouteOverlayView; + private RouteOverlayView mRouteOverlayView; - private List route = LatlngData.getRoute(); + private List route = LatlngData.getRoute(); - private Bitmap dotBitmap; - private Bitmap yellowDotBitmap; - private Bitmap carBitmap; + private Bitmap dotBitmap; + private Bitmap yellowDotBitmap; + private Bitmap carBitmap; - private Repeat repeat; + private Repeat repeat; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_view_overlay); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_overlay); - dotBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_dot); - yellowDotBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_dot_yellow); - carBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.car); + dotBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_dot); + yellowDotBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_dot_yellow); + carBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.car); - overlayLayout = findViewById(R.id.viewOverLayView); - mRouteOverlayView = overlayLayout.getRouteOverlayView(); - viewOverlayView = overlayLayout.getViewOverlayView(); + overlayLayout = findViewById(R.id.viewOverLayView); + mRouteOverlayView = overlayLayout.getRouteOverlayView(); + viewOverlayView = overlayLayout.getViewOverlayView(); - findViewById(R.id.btnPlus).setOnClickListener(this); - findViewById(R.id.btnMinus).setOnClickListener(this); - findViewById(R.id.btnPrint).setOnClickListener(this); + findViewById(R.id.btnPlus).setOnClickListener(this); + findViewById(R.id.btnMinus).setOnClickListener(this); + findViewById(R.id.btnPrint).setOnClickListener(this); - SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() - .findFragmentById(R.id.map); - mapFragment.getMapAsync(this); - } + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() + .findFragmentById(R.id.map); + mapFragment.getMapAsync(this); + } - @Override - public void onMapReady(GoogleMap map) { - mMap = map; + @Override + public void onMapReady(GoogleMap map) { + mMap = map; - mMap.setOnMapLoadedCallback(() -> { - overlayLayout.addGoogleMap(map); - initializeLatLngPerPixel(); - updatePixelPerZoom(); + mMap.setOnMapLoadedCallback(() -> { + overlayLayout.addGoogleMap(map); + initializeLatLngPerPixel(); + updatePixelPerZoom(); - mMap.setOnCameraMoveListener(this::onCameraMove); - setMapBoundsRow(map); - addCenterMarker(); - addSecondMarker(); - addNormalMarker(); + mMap.setOnCameraMoveListener(this::onCameraMove); + setMapBoundsRow(map); + addCenterMarker(); + addSecondMarker(); + addNormalMarker(); - mMap.setOnMapClickListener(this::moveToLatLngWithoutProjection); + mMap.setOnMapClickListener(this::moveToLatLngWithoutProjection); - ArrayList indiranagarRoutes = LatlngData.getIndiranagarRoutes(); - repeat = new Repeat(() -> addMarkerWithAnimation(indiranagarRoutes), 2000); + ArrayList indiranagarRoutes = LatlngData.getIndiranagarRoutes(); + repeat = new Repeat(() -> addMarkerWithAnimation(indiranagarRoutes), 2000); - viewOverlayView.post( - () -> repeat.startUpdates() - ); + viewOverlayView.post( + () -> repeat.startUpdates() + ); - OverlayPolyline normalOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) - .setRouteType(RouteType.PATH) - .setCameraPosition(mMap.getCameraPosition()) - .setProjection(mMap.getProjection()) - .setLatLngs(route) - .setBottomLayerColor(Color.YELLOW) - .setTopLayerColor(Color.RED) - .create(); + OverlayPolyline normalOverlayPolyline = new OverlayPolyline.Builder(mRouteOverlayView) + .setRouteType(RouteType.PATH) + .setCameraPosition(mMap.getCameraPosition()) + .setProjection(mMap.getProjection()) + .setLatLngs(route) + .setBottomLayerColor(Color.YELLOW) + .setTopLayerColor(Color.RED) + .create(); - }); - } + }); + } - @Override - protected void onPause() { - super.onPause(); - if (repeat!= null) { - repeat.stopUpdates(); + @Override + protected void onPause() { + super.onPause(); + if (repeat != null) { + repeat.stopUpdates(); + } } - } - @Override - protected void onResume() { - super.onResume(); - if (repeat!= null) { - repeat.startUpdates(); + @Override + protected void onResume() { + super.onResume(); + if (repeat != null) { + repeat.startUpdates(); + } } - } - private void onCameraMove() { - Projection projection = mMap.getProjection(); - CameraPosition cameraPosition = mMap.getCameraPosition(); + private void onCameraMove() { + Projection projection = mMap.getProjection(); + CameraPosition cameraPosition = mMap.getCameraPosition(); - zoomLevel = mMap.getCameraPosition().zoom; + zoomLevel = mMap.getCameraPosition().zoom; // viewOverlayView.onCameraMove(projection, cameraPosition); - updatePixelPerZoom(); - updateMarkerPointsOnScreen(); + updatePixelPerZoom(); + updateMarkerPointsOnScreen(); // mRouteOverlayView.onCameraMove(projection, cameraPosition); - overlayLayout.onCameraMoved(); - } - - public void addMarkerWithAnimation(List cars) { - U.log("doublemarker", "-------------------------------addMarkerWithAnimation----------------------------"); - U.log("doublemarker", "Cars count : " + cars.size()); - U.log("doublemarker", "Markers count : " + viewOverlayView.getOverLayMarkers().size()); - U.log("doublemarker", "---------------------------------------------------------------------------------"); - runOnUiThread(() -> { - for (Car car : cars) { - final OverlayMarkerOptim overlayMarker = viewOverlayView.findMarkerById(car.getCarId()); - if (overlayMarker == null) { - OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); - overlayMarker1.setIcon(carBitmap.copy(carBitmap.getConfig(), true)); - overlayMarker1.setMarkerId(car.getCarId()); - overlayMarker1.setLatLng(car.getLatLng()); - overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); - - ValueAnimator translateValueAnimator = new ValueAnimator(); - translateValueAnimator.setInterpolator(new LinearInterpolator()); - overlayMarker1.setTranslateValueAnimator(translateValueAnimator); - - ValueAnimator rotateValueAnimator = new ValueAnimator(); - rotateValueAnimator.setInterpolator(new LinearInterpolator()); - overlayMarker1.setRotateValueAnimator(rotateValueAnimator); - - viewOverlayView.addOverlayMarker(overlayMarker1, mMap.getProjection()); - } - else { - final LatLng startLatLng = overlayMarker.getLatLng(); - final LatLng endLatLng = car.getLatLng(); - float bearing = 0; - bearing = getBearing(startLatLng, endLatLng); + overlayLayout.onCameraMoved(); + } + + public void addMarkerWithAnimation(List cars) { + U.log("doublemarker", "-------------------------------addMarkerWithAnimation----------------------------"); + U.log("doublemarker", "Cars count : " + cars.size()); + U.log("doublemarker", "Markers count : " + viewOverlayView.getOverLayMarkers().size()); + U.log("doublemarker", "---------------------------------------------------------------------------------"); + runOnUiThread(() -> { + for (Car car : cars) { + final OverlayMarkerOptim overlayMarker = viewOverlayView.findMarkerById(car.getCarId()); + if (overlayMarker == null) { + OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); + overlayMarker1.setIcon(carBitmap.copy(carBitmap.getConfig(), true)); + overlayMarker1.setMarkerId(car.getCarId()); + overlayMarker1.setLatLng(car.getLatLng()); + overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); + + ValueAnimator translateValueAnimator = new ValueAnimator(); + translateValueAnimator.setInterpolator(new LinearInterpolator()); + overlayMarker1.setTranslateValueAnimator(translateValueAnimator); + + ValueAnimator rotateValueAnimator = new ValueAnimator(); + rotateValueAnimator.setInterpolator(new LinearInterpolator()); + overlayMarker1.setRotateValueAnimator(rotateValueAnimator); + + viewOverlayView.addOverlayMarker(overlayMarker1, mMap.getProjection()); + } else { + final LatLng startLatLng = overlayMarker.getLatLng(); + final LatLng endLatLng = car.getLatLng(); + float bearing = 0; + bearing = getBearing(startLatLng, endLatLng); // - ValueAnimator valueAnimator = overlayMarker.getTranslateValueAnimator(); - valueAnimator.removeAllUpdateListeners(); - valueAnimator.addUpdateListener(animation -> { - float v = animation.getAnimatedFraction(); - LatLng newPosition = new LatLngInterpolator.Linear().interpolate(v, startLatLng, endLatLng); - moveToLatLngWithoutProjection(newPosition, overlayMarker); - }); - valueAnimator.setFloatValues(0, 1); // Ignored. - valueAnimator.setDuration(2000); - valueAnimator.start(); + ValueAnimator valueAnimator = overlayMarker.getTranslateValueAnimator(); + valueAnimator.removeAllUpdateListeners(); + valueAnimator.addUpdateListener(animation -> { + float v = animation.getAnimatedFraction(); + LatLng newPosition = new LatLngInterpolator.Linear().interpolate(v, startLatLng, endLatLng); + moveToLatLngWithoutProjection(newPosition, overlayMarker); + }); + valueAnimator.setFloatValues(0, 1); // Ignored. + valueAnimator.setDuration(2000); + valueAnimator.start(); // - overlayMarker.setLatLng(endLatLng); - moveToLatLngWithoutProjection(endLatLng, overlayMarker); - - float lastBearing = overlayMarker.getBearing(); - ValueAnimator rotateValueAnimator = overlayMarker.getRotateValueAnimator(); - rotateValueAnimator.removeAllUpdateListeners(); - rotateValueAnimator.cancel(); - - rotateValueAnimator = ValueAnimator.ofFloat(lastBearing, calcMinAngle(lastBearing, bearing)); - rotateValueAnimator.addUpdateListener(animation -> { - float v = (float) animation.getAnimatedValue(); - overlayMarker.setBearing(v); - viewOverlayView.updateMarkerAngle(overlayMarker); - }); - rotateValueAnimator.setDuration(500); - rotateValueAnimator.start(); - - overlayMarker.setRotateValueAnimator(rotateValueAnimator); + overlayMarker.setLatLng(endLatLng); + moveToLatLngWithoutProjection(endLatLng, overlayMarker); + + float lastBearing = overlayMarker.getBearing(); + ValueAnimator rotateValueAnimator = overlayMarker.getRotateValueAnimator(); + rotateValueAnimator.removeAllUpdateListeners(); + rotateValueAnimator.cancel(); + + rotateValueAnimator = ValueAnimator.ofFloat(lastBearing, calcMinAngle(lastBearing, bearing)); + rotateValueAnimator.addUpdateListener(animation -> { + float v = (float) animation.getAnimatedValue(); + overlayMarker.setBearing(v); + viewOverlayView.updateMarkerAngle(overlayMarker); + }); + rotateValueAnimator.setDuration(500); + rotateValueAnimator.start(); + + overlayMarker.setRotateValueAnimator(rotateValueAnimator); + } + + } + }); + } + + private LatLng pointOne = new LatLng(12.9715002, 77.6344856); + private LatLng pointTwo = new LatLng(12.9715002, 77.6354856); + private LatLng pointThree = new LatLng(12.9715002, 77.6364856); + private LatLng pointFour = new LatLng(12.9715002, 77.6374856); + + private LatLng pointFive = new LatLng(12.9725002, 77.6344856); + private LatLng pointSix = new LatLng(12.9725002, 77.6354856); + private LatLng pointSeven = new LatLng(12.9725002, 77.6364856); + private LatLng pointEight = new LatLng(12.9725002, 77.6374856); + + private void setMapBoundsRow(GoogleMap googleMap) { + List latLngs = new ArrayList<>(); + latLngs.add(pointOne); + latLngs.add(pointTwo); + latLngs.add(pointThree); + latLngs.add(pointFour); + LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); + for (LatLng latLngPoint : latLngs) { + boundsBuilder.include(latLngPoint); } + LatLngBounds latLngBounds = boundsBuilder.build(); + googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 100)); + googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pointTwo, zoomLevel)); + } + + private void addNormalMarker() { + mMap.addMarker(new MarkerOptions().position(pointOne)); + mMap.addMarker(new MarkerOptions().position(pointTwo)); + mMap.addMarker(new MarkerOptions().position(pointThree)); + mMap.addMarker(new MarkerOptions().position(pointFour)); + mMap.addMarker(new MarkerOptions().position(pointFive)); + mMap.addMarker(new MarkerOptions().position(pointSix)); + mMap.addMarker(new MarkerOptions().position(pointSeven)); + mMap.addMarker(new MarkerOptions().position(pointEight)); + } + + private void addCenterMarker() { + LatLng centerLatLng = mMap.getCameraPosition().target; - } - }); - } - - private LatLng pointOne = new LatLng(12.9715002, 77.6344856); - private LatLng pointTwo = new LatLng(12.9715002, 77.6354856); - private LatLng pointThree = new LatLng(12.9715002, 77.6364856); - private LatLng pointFour = new LatLng(12.9715002, 77.6374856); - - private LatLng pointFive = new LatLng(12.9725002, 77.6344856); - private LatLng pointSix = new LatLng(12.9725002, 77.6354856); - private LatLng pointSeven = new LatLng(12.9725002, 77.6364856); - private LatLng pointEight = new LatLng(12.9725002, 77.6374856); - - private void setMapBoundsRow(GoogleMap googleMap) { - List latLngs = new ArrayList<>(); - latLngs.add(pointOne); - latLngs.add(pointTwo); - latLngs.add(pointThree); - latLngs.add(pointFour); - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - for (LatLng latLngPoint : latLngs) { - boundsBuilder.include(latLngPoint); + OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); + overlayMarker1.setIcon(yellowDotBitmap.copy(yellowDotBitmap.getConfig(), true)); + overlayMarker1.setMarkerId(2323); + overlayMarker1.setLatLng(centerLatLng); + overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); + + viewOverlayView.addCenterMarker(overlayMarker1, mMap.getProjection()); } - LatLngBounds latLngBounds = boundsBuilder.build(); - googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds, 100)); - googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pointTwo, zoomLevel)); - } - - private void addNormalMarker() { - mMap.addMarker(new MarkerOptions().position(pointOne)); - mMap.addMarker(new MarkerOptions().position(pointTwo)); - mMap.addMarker(new MarkerOptions().position(pointThree)); - mMap.addMarker(new MarkerOptions().position(pointFour)); - mMap.addMarker(new MarkerOptions().position(pointFive)); - mMap.addMarker(new MarkerOptions().position(pointSix)); - mMap.addMarker(new MarkerOptions().position(pointSeven)); - mMap.addMarker(new MarkerOptions().position(pointEight)); - } - - private void addCenterMarker() { - LatLng centerLatLng = mMap.getCameraPosition().target; - - OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); - overlayMarker1.setIcon(yellowDotBitmap.copy(yellowDotBitmap.getConfig(), true)); - overlayMarker1.setMarkerId(2323); - overlayMarker1.setLatLng(centerLatLng); - overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); - - viewOverlayView.addCenterMarker(overlayMarker1, mMap.getProjection()); - } - - private void addSecondMarker() { - LatLng centerLatLng = mMap.getCameraPosition().target; - - OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); - overlayMarker1.setIcon(dotBitmap.copy(dotBitmap.getConfig(), true)); - overlayMarker1.setMarkerId(2324); - overlayMarker1.setLatLng(centerLatLng); - overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); - - viewOverlayView.addOverlayMarker(overlayMarker1, mMap.getProjection()); - } - - @Override - public void onMarkerUpdate() { - viewOverlayView.invalidate(); - } - - - private void initializeLatLngPerPixel() { - lastZoomLevel = mMap.getCameraPosition().zoom; - lngPerPixel = average1PixDistanceX(); - } - - private double lngPerPixel = 0.00001404902103; - private float lastZoomLevel = 18; - private float zoomLevel = 18; - - private void updatePixelPerZoom() { - //Pixel 2 xl phone - U.log("updatePixelPerZoom", "lastZoomLevel " + lastZoomLevel); - U.log("updatePixelPerZoom", "zoomLevel " + zoomLevel); - lngPerPixel = lngPerPixel * Math.pow(2, lastZoomLevel - zoomLevel); - U.log("updatePixelPerZoom", "lngPerPixel " + lngPerPixel); - lastZoomLevel = zoomLevel; - } - - private void updateMarkerPointsOnScreen() { - for (OverlayMarkerOptim overlayMarkerOptim : viewOverlayView.getOverLayMarkers()) { - int dx = (int) ((viewOverlayView.getAnchorMarker().getLatLng().longitude - overlayMarkerOptim - .getLatLng().longitude) / lngPerPixel); - int dy = (int) ((viewOverlayView.getAnchorMarker().getLatLng().latitude - overlayMarkerOptim - .getLatLng().latitude) / lngPerPixel); - - U.log("updateMarkerPointsOnScreen", "dx, dy : " + dx + ", " + dy); - U.log("updateMarkerPointsOnScreen", "zoom,latPerPixel :" + zoomLevel + ", " + lngPerPixel); - Point predictedPointOnScreen = new Point( - viewOverlayView.getAnchorMarker().getScreenPoint().x - dx, - viewOverlayView.getAnchorMarker().getScreenPoint().y + dy); - overlayMarkerOptim.setScreenPoint(predictedPointOnScreen); - overlayMarkerOptim.setLatLng(overlayMarkerOptim.getLatLng()); + + private void addSecondMarker() { + LatLng centerLatLng = mMap.getCameraPosition().target; + + OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); + overlayMarker1.setIcon(dotBitmap.copy(dotBitmap.getConfig(), true)); + overlayMarker1.setMarkerId(2324); + overlayMarker1.setLatLng(centerLatLng); + overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); + + viewOverlayView.addOverlayMarker(overlayMarker1, mMap.getProjection()); } - viewOverlayView.invalidate(); - } - - private void moveToLatLngWithoutProjection(final LatLng latLng, OverlayMarkerOptim overlayMarker1) { - overlayMarker1.setLatLng(latLng); - - //(Difference between longs / 0.00001252926886 ) - int dx = (int) ((viewOverlayView.getAnchorMarker().getLatLng().longitude - latLng.longitude) / lngPerPixel); - //(Difference between lats / 0.00001252926886 ) - int dy = (int) ((viewOverlayView.getAnchorMarker().getLatLng().latitude - latLng.latitude) / lngPerPixel); - - Point predictedPointOnScreen = new Point( - viewOverlayView.getAnchorMarker().getScreenPoint().x - dx, - viewOverlayView.getAnchorMarker().getScreenPoint().y + dy); - overlayMarker1.setScreenPoint(predictedPointOnScreen); - - viewOverlayView.invalidate(); - - U.log("updateMarkerPointsOnScreen", "dx, dy : " + dx + ", " + dy); - U.log("updateMarkerPointsOnScreen", "zoom,latPerPixel :" + zoomLevel + ", " + lngPerPixel); - } - - private void moveToLatLngWithoutProjection(final LatLng latLng) { - - OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); - overlayMarker1.setIcon(dotBitmap.copy(dotBitmap.getConfig(), true)); - overlayMarker1.setMarkerId(123123); - overlayMarker1.setLatLng(latLng); - overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); - - //(Difference between longs / 0.00001252926886 ) - int dx = (int) ((viewOverlayView.getAnchorMarker().getLatLng().longitude - latLng.longitude) / lngPerPixel); - //(Difference between lats / 0.00001252926886 ) - int dy = (int) ((viewOverlayView.getAnchorMarker().getLatLng().latitude - latLng.latitude) / lngPerPixel); - - Point predictedPointOnScreen = new Point( - viewOverlayView.getAnchorMarker().getScreenPoint().x - dx, - viewOverlayView.getAnchorMarker().getScreenPoint().y + dy); - overlayMarker1.setScreenPoint(predictedPointOnScreen); - - viewOverlayView.addOverlayMarker(overlayMarker1, mMap.getProjection()); - viewOverlayView.invalidate(); - - U.log("updateMarkerPointsOnScreen", "dx, dy : " + dx + ", " + dy); - U.log("updateMarkerPointsOnScreen", "zoom,latPerPixel :" + zoomLevel + ", " + lngPerPixel); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.btnPlus: - zoomLevel += 1; - mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pointTwo, zoomLevel)); - updatePixelPerZoom(); - updateMarkerPointsOnScreen(); - break; - case R.id.btnMinus: - zoomLevel -= 1; - mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pointTwo, zoomLevel)); - updatePixelPerZoom(); - updateMarkerPointsOnScreen(); - break; - case R.id.btnPrint: - printAverage1PixDistance(); - break; + + @Override + public void onMarkerUpdate() { + viewOverlayView.invalidate(); + } + + + private void initializeLatLngPerPixel() { + lastZoomLevel = mMap.getCameraPosition().zoom; + lngPerPixel = average1PixDistanceX(); + } + + private double lngPerPixel = 0.00001404902103; + private float lastZoomLevel = 18; + private float zoomLevel = 18; + + private void updatePixelPerZoom() { + //Pixel 2 xl phone + U.log("updatePixelPerZoom", "lastZoomLevel " + lastZoomLevel); + U.log("updatePixelPerZoom", "zoomLevel " + zoomLevel); + lngPerPixel = lngPerPixel * Math.pow(2, lastZoomLevel - zoomLevel); + U.log("updatePixelPerZoom", "lngPerPixel " + lngPerPixel); + lastZoomLevel = zoomLevel; + } + + private void updateMarkerPointsOnScreen() { + for (OverlayMarkerOptim overlayMarkerOptim : viewOverlayView.getOverLayMarkers()) { + int dx = (int) ((viewOverlayView.getAnchorMarker().getLatLng().longitude - overlayMarkerOptim + .getLatLng().longitude) / lngPerPixel); + int dy = (int) ((viewOverlayView.getAnchorMarker().getLatLng().latitude - overlayMarkerOptim + .getLatLng().latitude) / lngPerPixel); + + U.log("updateMarkerPointsOnScreen", "dx, dy : " + dx + ", " + dy); + U.log("updateMarkerPointsOnScreen", "zoom,latPerPixel :" + zoomLevel + ", " + lngPerPixel); + Point predictedPointOnScreen = new Point( + viewOverlayView.getAnchorMarker().getScreenPoint().x - dx, + viewOverlayView.getAnchorMarker().getScreenPoint().y + dy); + overlayMarkerOptim.setScreenPoint(predictedPointOnScreen); + overlayMarkerOptim.setLatLng(overlayMarkerOptim.getLatLng()); + } + viewOverlayView.invalidate(); + } + + private void moveToLatLngWithoutProjection(final LatLng latLng, OverlayMarkerOptim overlayMarker1) { + overlayMarker1.setLatLng(latLng); + + //(Difference between longs / 0.00001252926886 ) + int dx = (int) ((viewOverlayView.getAnchorMarker().getLatLng().longitude - latLng.longitude) / lngPerPixel); + //(Difference between lats / 0.00001252926886 ) + int dy = (int) ((viewOverlayView.getAnchorMarker().getLatLng().latitude - latLng.latitude) / lngPerPixel); + + Point predictedPointOnScreen = new Point( + viewOverlayView.getAnchorMarker().getScreenPoint().x - dx, + viewOverlayView.getAnchorMarker().getScreenPoint().y + dy); + overlayMarker1.setScreenPoint(predictedPointOnScreen); + + viewOverlayView.invalidate(); + + U.log("updateMarkerPointsOnScreen", "dx, dy : " + dx + ", " + dy); + U.log("updateMarkerPointsOnScreen", "zoom,latPerPixel :" + zoomLevel + ", " + lngPerPixel); + } + + private void moveToLatLngWithoutProjection(final LatLng latLng) { + + OverlayMarkerOptim overlayMarker1 = new OverlayMarkerOptim(); + overlayMarker1.setIcon(dotBitmap.copy(dotBitmap.getConfig(), true)); + overlayMarker1.setMarkerId(123123); + overlayMarker1.setLatLng(latLng); + overlayMarker1.setOnMarkerUpdate(ViewOverlayActivity.this); + + //(Difference between longs / 0.00001252926886 ) + int dx = (int) ((viewOverlayView.getAnchorMarker().getLatLng().longitude - latLng.longitude) / lngPerPixel); + //(Difference between lats / 0.00001252926886 ) + int dy = (int) ((viewOverlayView.getAnchorMarker().getLatLng().latitude - latLng.latitude) / lngPerPixel); + + Point predictedPointOnScreen = new Point( + viewOverlayView.getAnchorMarker().getScreenPoint().x - dx, + viewOverlayView.getAnchorMarker().getScreenPoint().y + dy); + overlayMarker1.setScreenPoint(predictedPointOnScreen); + + viewOverlayView.addOverlayMarker(overlayMarker1, mMap.getProjection()); + viewOverlayView.invalidate(); + + U.log("updateMarkerPointsOnScreen", "dx, dy : " + dx + ", " + dy); + U.log("updateMarkerPointsOnScreen", "zoom,latPerPixel :" + zoomLevel + ", " + lngPerPixel); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btnPlus: + zoomLevel += 1; + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pointTwo, zoomLevel)); + updatePixelPerZoom(); + updateMarkerPointsOnScreen(); + break; + case R.id.btnMinus: + zoomLevel -= 1; + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pointTwo, zoomLevel)); + updatePixelPerZoom(); + updateMarkerPointsOnScreen(); + break; + case R.id.btnPrint: + printAverage1PixDistance(); + break; + } } - } - private double average1PixDistanceX() { - U.log("average1PixDistanceX", "-------------------------------------------------------------------------"); + private double average1PixDistanceX() { + U.log("average1PixDistanceX", "-------------------------------------------------------------------------"); // double average1pixDistanceY = 0; - double average1pixDistanceX = 0; - for ( int i = 0; i < 100; i++) { + double average1pixDistanceX = 0; + for (int i = 0; i < 100; i++) { - LatLng centerLatlng = mMap.getCameraPosition().target; - Point centerPoint = mMap.getProjection().toScreenLocation(centerLatlng); - U.log("average1PixDistanceX", "centerPoint: " + centerPoint); - centerPoint.x = centerPoint.x + 1; - U.log("average1PixDistanceX", "next centerPoint: " + centerPoint); - LatLng nextCenterLatLng = mMap.getProjection().fromScreenLocation(centerPoint); + LatLng centerLatlng = mMap.getCameraPosition().target; + Point centerPoint = mMap.getProjection().toScreenLocation(centerLatlng); + U.log("average1PixDistanceX", "centerPoint: " + centerPoint); + centerPoint.x = centerPoint.x + 1; + U.log("average1PixDistanceX", "next centerPoint: " + centerPoint); + LatLng nextCenterLatLng = mMap.getProjection().fromScreenLocation(centerPoint); // average1pixDistanceY += nextCenterLatLng.latitude - centerLatlng.latitude; - average1pixDistanceX += nextCenterLatLng.longitude - centerLatlng.longitude; - } + average1pixDistanceX += nextCenterLatLng.longitude - centerLatlng.longitude; + } // U.log("average1PixDistanceX", "average1pixDistanceY" + (average1pixDistanceY / 100)); - U.log("average1PixDistanceX", "average1pixDistanceX" + (average1pixDistanceX / 100)); - - - U.log("average1PixDistanceX", "zoomlevel" + zoomLevel); - - U.log("average1PixDistanceX", "-------------------------------------------------------------------------"); - return Math.abs(average1pixDistanceX/100); - } - - /** - * 1. Find latlng per pixel(LPP) in a particular zoomlevel(ZL). - * 2. Add an invisible anchor marker. Keep listening to get - * projection and update its screen co ordinate on each map movement. - * 3. For each new marker to be added, use this - * formula to find the co-ordinate on screen. (anchorLatLng - newLatlng) / LPP - * 4. For finding LPP. Take two screen points one pixel apart, using projection get the corresponding latLngs and find their difference. This gives us the LPP. - * P1(x, y) = LatLng(lat, lng) - * P2(P1.x+1, P1.y) = LatLng1(lat, lng) - * 1Xpix = LatLng.lat - LatLng1.lat; - * 1Ypix = LatLng.lng - LatLng1.lng; - * - **/ - private void printAverage1PixDistance() { - U.log("printAverage1PixDistance", "-------------------------------------------------------------------------"); + U.log("average1PixDistanceX", "average1pixDistanceX" + (average1pixDistanceX / 100)); + + + U.log("average1PixDistanceX", "zoomlevel" + zoomLevel); + + U.log("average1PixDistanceX", "-------------------------------------------------------------------------"); + return Math.abs(average1pixDistanceX / 100); + } + + /** + * 1. Find latlng per pixel(LPP) in a particular zoomlevel(ZL). + * 2. Add an invisible anchor marker. Keep listening to get + * projection and update its screen co ordinate on each map movement. + * 3. For each new marker to be added, use this + * formula to find the co-ordinate on screen. (anchorLatLng - newLatlng) / LPP + * 4. For finding LPP. Take two screen points one pixel apart, using projection get the corresponding latLngs and find their difference. This gives us the LPP. + * P1(x, y) = LatLng(lat, lng) + * P2(P1.x+1, P1.y) = LatLng1(lat, lng) + * 1Xpix = LatLng.lat - LatLng1.lat; + * 1Ypix = LatLng.lng - LatLng1.lng; + **/ + private void printAverage1PixDistance() { + U.log("printAverage1PixDistance", "-------------------------------------------------------------------------"); // double average1pixDistanceX = 0; - double average1pixDistanceY = 0; - for (int i = 0; i < 100; i++) { - LatLng centerLatlng = mMap.getCameraPosition().target; - Point centerPoint = mMap.getProjection().toScreenLocation(centerLatlng); - U.log("printAverage1PixDistance", "centerPoint: " + centerPoint); + double average1pixDistanceY = 0; + for (int i = 0; i < 100; i++) { + LatLng centerLatlng = mMap.getCameraPosition().target; + Point centerPoint = mMap.getProjection().toScreenLocation(centerLatlng); + U.log("printAverage1PixDistance", "centerPoint: " + centerPoint); // centerPoint.x = centerPoint.x + 1; - centerPoint.y = centerPoint.y + 1; + centerPoint.y = centerPoint.y + 1; // centerPoint.y = centerPoint.y + 1; - U.log("printAverage1PixDistance", "next centerPoint: " + centerPoint); - LatLng nextCenterLatLng = mMap.getProjection().fromScreenLocation(centerPoint); - U.log("printAverage1PixDistance", "1pixDistanceY" + (average1pixDistanceY)); - mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(nextCenterLatLng, zoomLevel)); + U.log("printAverage1PixDistance", "next centerPoint: " + centerPoint); + LatLng nextCenterLatLng = mMap.getProjection().fromScreenLocation(centerPoint); + U.log("printAverage1PixDistance", "1pixDistanceY" + (average1pixDistanceY)); + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(nextCenterLatLng, zoomLevel)); // average1pixDistanceX += nextCenterLatLng.longitude - centerLatlng.longitude; - average1pixDistanceY += nextCenterLatLng.latitude - centerLatlng.latitude; - } + average1pixDistanceY += nextCenterLatLng.latitude - centerLatlng.latitude; + } // U.log("point", "average1pixDistanceX" + (average1pixDistanceX / 100)); - U.log("printAverage1PixDistance", "average1pixDistanceY" + (average1pixDistanceY / 100)); - U.log("printAverage1PixDistance", "zoomlevel" + zoomLevel); + U.log("printAverage1PixDistance", "average1pixDistanceY" + (average1pixDistanceY / 100)); + U.log("printAverage1PixDistance", "zoomlevel" + zoomLevel); - U.log("printAverage1PixDistance", "-------------------------------------------------------------------------"); - } + U.log("printAverage1PixDistance", "-------------------------------------------------------------------------"); + } // private void findScreenPointForFirstLatLng() { // //Find distance between current center and first point. diff --git a/app/src/main/res/drawable/bg_rect.xml b/app/src/main/res/drawable/bg_rect.xml index d641c47..f59c484 100644 --- a/app/src/main/res/drawable/bg_rect.xml +++ b/app/src/main/res/drawable/bg_rect.xml @@ -1,6 +1,14 @@ - - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_from_to.xml b/app/src/main/res/layout/activity_from_to.xml index 5a669a4..4eebf5e 100644 --- a/app/src/main/res/layout/activity_from_to.xml +++ b/app/src/main/res/layout/activity_from_to.xml @@ -1,28 +1,31 @@ - - - + tools:context=".projectionBased.FromToActivity"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 8c9869f..1d5630a 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -1,62 +1,66 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="com.amalbit.animationongooglemap.HomeActivity"> - - - - -