From f995d4bf2dcf9e0b6014935af2c39b4772614921 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 10 May 2019 16:20:52 +0800 Subject: [PATCH 01/19] Create scale bar module --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 487 +++++++++--------- .../activity/scalebar/ScalebarActivity.kt | 63 +++ app/src/main/res/drawable/ic_scale.xml | 9 + app/src/main/res/layout/activity_scalebar.xml | 26 + app/src/main/res/values/strings.xml | 138 ++--- plugin-scalebar/.gitignore | 1 + plugin-scalebar/build.gradle | 35 ++ plugin-scalebar/gradle.properties | 5 + plugin-scalebar/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + plugin-scalebar/src/main/AndroidManifest.xml | 2 + .../com/mapbox/pluginscalebar/ScaleBar.java | 73 +++ .../src/main/res/values/strings.xml | 3 + .../pluginscalebar/ExampleUnitTest.java | 17 + settings.gradle | 3 +- 16 files changed, 610 insertions(+), 300 deletions(-) create mode 100644 app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt create mode 100644 app/src/main/res/drawable/ic_scale.xml create mode 100644 app/src/main/res/layout/activity_scalebar.xml create mode 100644 plugin-scalebar/.gitignore create mode 100644 plugin-scalebar/build.gradle create mode 100644 plugin-scalebar/gradle.properties create mode 100644 plugin-scalebar/proguard-rules.pro create mode 100644 plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java create mode 100644 plugin-scalebar/src/main/AndroidManifest.xml create mode 100644 plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java create mode 100644 plugin-scalebar/src/main/res/values/strings.xml create mode 100644 plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java diff --git a/app/build.gradle b/app/build.gradle index ec30d13d1..2cecc81fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,6 +113,7 @@ dependencies { implementation project(':plugin-annotation') implementation project(':plugin-markerview') implementation project(':ktx-mapbox-maps') + implementation project(path: ':plugin-scalebar') } apply from: "${rootDir}/gradle/checkstyle.gradle" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d2b9f9947..a579a2b6c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,262 +1,275 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.mapbox.mapboxsdk.plugins.testapp"> - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + - - - - - - - - + + + - - - - + + + - - - - - - - - + + + - - - - - + + + - - - + + + + + + + + + + - + + + + + + - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt new file mode 100644 index 000000000..845a20779 --- /dev/null +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -0,0 +1,63 @@ +package com.mapbox.mapboxsdk.plugins.testapp.activity.scalebar + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.plugins.markerview.MarkerViewManager +import com.mapbox.mapboxsdk.plugins.testapp.R +import com.mapbox.pluginscalebar.ScaleBar +import kotlinx.android.synthetic.main.activity_annotation.* + +/** + * Activity showing a scalebar used on mapview. + */ +class ScalebarActivity : AppCompatActivity() { + private var scaleBar: ScaleBar? = null + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_scalebar) + mapView.onCreate(savedInstanceState) + mapView.getMapAsync { mapboxMap -> + mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0)) + scaleBar = ScaleBar(mapView, mapboxMap) + scaleBar?.isEnabled = true + } + } + + + override fun onStart() { + super.onStart() + mapView.onStart() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onStop() { + super.onStop() + mapView.onStop() + } + + override fun onLowMemory() { + super.onLowMemory() + mapView.onLowMemory() + } + + override fun onDestroy() { + super.onDestroy() + mapView.onDestroy() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView?.onSaveInstanceState(outState) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_scale.xml b/app/src/main/res/drawable/ic_scale.xml new file mode 100644 index 000000000..0de4c28f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_scale.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_scalebar.xml b/app/src/main/res/layout/activity_scalebar.xml new file mode 100644 index 000000000..00ab4be91 --- /dev/null +++ b/app/src/main/res/layout/activity_scalebar.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72f16c108..162b3293c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,69 +1,83 @@ - Map Plugins + Map Plugins - - category - Extrusions - Navigation - Navigation - Places - Offline - Localization - Annotation plugin - Kotlin extension functions - View synchronisation + + category + Extrusions + Navigation + Location + Navigation + Places + Offline + Scalebar + Localization + Annotation plugin + Kotlin extension functions + View synchronisation - - Traffic Plugin - Building Plugin - Places Autocomplete - Places Autocomplete Fragment - Create region - List regions - Place picker - Localization Plugin - Offline Ui Components - Symbol - Press for Symbol - Bulk amount of Symbols - Change Symbol - Fill - Change Fill - Circle - Line - Change Line - MarkerView plugin - Mapbox Maps KTX + + Traffic Plugin + Building Plugin + Location Modes + Location Layer Map Change + Toggle Manual Location Updates + Compass Listener + Places Autocomplete + Places Autocomplete Fragment + Create region + List regions + Place picker + Localization Plugin + Offline Ui Components + Location Fragment + Symbol + Fill + Circle + Line + MarkerView plugin + Mapbox Maps KTX + Scale bar - - Add Traffic layers to any Mapbox basemap. - Add 3D Building layer to a Mapbox map. - Launch the autocomplete activity. - Launch the autocomplete fragment inside an activity - Use a form to create an offline region. - List all offline regions. - Launch the place picker activity and receive result - Automatically localize the map labels into the device\'s set language. - Shows off the UI components included in the offline plugin. - Show symbols on a map - Show a symbol by pressing the map - Dynamically change a symbol on the map - Show fire hydrants in Washington DC area - Show lines on a map - Show changing lines on a map - Show fills on a map - Show changing a fill on a map - Show circles on a map - Synchronise a view on a map - Test Mapbox Maps SDK for Android Kotlin extension functions + + Add Traffic layers to any Mapbox basemap. + Add 3D Building layer to a Mapbox map. + Switch between the different location modes. + Change map styles while the location layers on the map. + Toggle the user location manual mode on and off. + Add a compass listener to know when heading changes or when the accuracy drops. + Launch the autocomplete activity. + Launch the autocomplete fragment inside an activity + Use a form to create an offline region. + List all offline regions. + Launch the place picker activity and receive result + Automatically localize the map labels into the device\'s set language. + Shows off the UI components included in the offline plugin. + Show current location in the Fragment + Show symbols on a map + Show lines on a map + Show fills on a map + Show circles on a map + Synchronise a view on a map + Test Mapbox Maps SDK for Android Kotlin extension functions + Show scale bar on a map - - Example shows how to launch the Place Picker using the Floating action button and receiving a result in onActivityResult. + + None + Normal + Tracking + Compass + Nav + + + Example shows how to launch the Place Picker using the Floating action button and receiving a result in onActivityResult. + + + Min zoom: %1$d + Max zoom: %1$d + Make sure that the device\'s default language is not English + Map not localized to device language and now set to French + Map localized to device language + Tracking: + Mode: - - Min zoom: %1$d - Max zoom: %1$d - Make sure that the device\'s default language is not English - Map not localized to device language and now set to French - Map localized to device language diff --git a/plugin-scalebar/.gitignore b/plugin-scalebar/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/plugin-scalebar/.gitignore @@ -0,0 +1 @@ +/build diff --git a/plugin-scalebar/build.gradle b/plugin-scalebar/build.gradle new file mode 100644 index 000000000..42a13944c --- /dev/null +++ b/plugin-scalebar/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion androidVersions.compileSdkVersion + + defaultConfig { + minSdkVersion androidVersions.minSdkVersion + targetSdkVersion androidVersions.targetSdkVersion + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + configurations { + javadocDeps + } + + lintOptions { + abortOnError false + } + + testOptions { + unitTests.returnDefaultValues true + } +} + +dependencies { + implementation dependenciesList.supportAppcompatV7 + implementation dependenciesList.mapboxMapSdk + javadocDeps dependenciesList.mapboxMapSdk + testImplementation dependenciesList.junit + testImplementation dependenciesList.mockito +} + +apply from: "${rootDir}/gradle/javadoc.gradle" +apply from: "${rootDir}/gradle/publish.gradle" +apply from: "${rootDir}/gradle/checkstyle.gradle" \ No newline at end of file diff --git a/plugin-scalebar/gradle.properties b/plugin-scalebar/gradle.properties new file mode 100644 index 000000000..e411d8081 --- /dev/null +++ b/plugin-scalebar/gradle.properties @@ -0,0 +1,5 @@ +VERSION_NAME=0.1.0-SNAPSHOT +POM_ARTIFACT_ID=mapbox-android-plugin-scalebar +POM_NAME=Mapbox Android Scalebar Plugin +POM_DESCRIPTION=Mapbox Android Scalebar Plugin +POM_PACKAGING=aar \ No newline at end of file diff --git a/plugin-scalebar/proguard-rules.pro b/plugin-scalebar/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/plugin-scalebar/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java b/plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java new file mode 100644 index 000000000..eabb96dcd --- /dev/null +++ b/plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.mapbox.pluginscalebar; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.mapbox.pluginscalebar.test", appContext.getPackageName()); + } +} diff --git a/plugin-scalebar/src/main/AndroidManifest.xml b/plugin-scalebar/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c2d2d0e94 --- /dev/null +++ b/plugin-scalebar/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java new file mode 100644 index 000000000..a731696c4 --- /dev/null +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -0,0 +1,73 @@ +package com.mapbox.pluginscalebar; + +import android.support.annotation.NonNull; +import android.support.annotation.UiThread; +import android.view.View; +import android.widget.ProgressBar; + +import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.Projection; + + +public class ScaleBar{ +// private ScaleWidget scaleWidget; + private MapboxMap mapboxMap; + private Projection projection; + private MapView mapView; + private boolean enabled; + private ProgressBar progressBar; + public ScaleBar(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { + this.mapView = mapView; + this.mapboxMap = mapboxMap; + this.projection = mapboxMap.getProjection(); + this.progressBar = new ProgressBar(mapView.getContext()); +// this.scaleWidget = new ScaleWidget(mapView.getContext()); + this.mapView.addView(progressBar); + } + + /** + * Returns true if the scale plugin is currently enabled and visible. + * + * @return true if enabled, false otherwise + */ + public boolean isEnabled() { + return enabled; + } + + /** + * Toggles the scale plugin state. + *

+ * If the scale plugin wasn't enabled, a {@link com.mapbox.mapboxsdk.maps.MapView.OnMapChangedListener} + * will be added to the {@link MapView} to listen to map change events to update the state of this plugin. If the + * plugin was enabled the {@link com.mapbox.mapboxsdk.maps.MapView.OnMapChangedListener} will be removed from the map. + *

+ */ + @UiThread + public void setEnabled(boolean enabled) { + if(this.enabled==enabled){ + // already in correct state + return; + } + this.enabled = enabled; + progressBar.setVisibility(enabled ? View.VISIBLE : View.GONE); +// if (enabled) { +// mapView.addOnMapChangedListener(this); +// // trigger initial update +// onMapChanged(MapView.REGION_DID_CHANGE); +// } else { +// mapView.removeOnMapChangedListener(this); +// } + } + +///* @Override +// public void onMapChanged(int change) { +// Timber.e("OnMapChange %s", change); +// if (change == MapView.REGION_DID_CHANGE || change == MapView.REGION_DID_CHANGE_ANIMATED) { +// CameraPosition cameraPosition = mapboxMap.getCameraPosition(); +// double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); +//// scaleWidget.setMetersPerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); +// }*/ +// } +} diff --git a/plugin-scalebar/src/main/res/values/strings.xml b/plugin-scalebar/src/main/res/values/strings.xml new file mode 100644 index 000000000..69214f2fd --- /dev/null +++ b/plugin-scalebar/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + pluginScalebar + diff --git a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java new file mode 100644 index 000000000..d14970c11 --- /dev/null +++ b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.mapbox.pluginscalebar; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index e29d567ac..07e316702 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,4 +6,5 @@ include ':plugin-offline' include ':plugin-localization' include ':plugin-annotation' include ':plugin-markerview' -include ':ktx-mapbox-maps' \ No newline at end of file +include ':ktx-mapbox-maps' +include ':plugin-scalebar' \ No newline at end of file From 7fd12753d98de0dcfa9fd16155eeb2a21d41f748 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 15 May 2019 15:31:53 +0800 Subject: [PATCH 02/19] Implement scale bar function --- .../activity/scalebar/ScalebarActivity.kt | 16 +- .../com/mapbox/pluginscalebar/ScaleBar.java | 81 +++++---- .../pluginscalebar/ScaleBarConstants.java | 79 +++++++++ .../mapbox/pluginscalebar/ScaleBarWidget.java | 161 ++++++++++++++++++ 4 files changed, 300 insertions(+), 37 deletions(-) create mode 100644 plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarConstants.java create mode 100644 plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 845a20779..77a5d9a94 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -3,11 +3,10 @@ package com.mapbox.mapboxsdk.plugins.testapp.activity.scalebar import android.os.Bundle import android.support.v7.app.AppCompatActivity import com.mapbox.mapboxsdk.camera.CameraUpdateFactory -import com.mapbox.mapboxsdk.maps.MapboxMap -import com.mapbox.mapboxsdk.plugins.markerview.MarkerViewManager +import com.mapbox.mapboxsdk.maps.Style import com.mapbox.mapboxsdk.plugins.testapp.R import com.mapbox.pluginscalebar.ScaleBar -import kotlinx.android.synthetic.main.activity_annotation.* +import kotlinx.android.synthetic.main.activity_scalebar.* /** * Activity showing a scalebar used on mapview. @@ -19,9 +18,14 @@ class ScalebarActivity : AppCompatActivity() { setContentView(R.layout.activity_scalebar) mapView.onCreate(savedInstanceState) mapView.getMapAsync { mapboxMap -> - mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0)) - scaleBar = ScaleBar(mapView, mapboxMap) - scaleBar?.isEnabled = true + mapboxMap.setStyle(Style.MAPBOX_STREETS) { _ -> + mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0)) + scaleBar = ScaleBar(mapView, mapboxMap) + scaleBar!!.isEnabled = true + fabScaleWidget.setOnClickListener { + scaleBar!!.isEnabled = !scaleBar?.isEnabled!! + } + } } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java index a731696c4..d1c7f791b 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -1,30 +1,32 @@ package com.mapbox.pluginscalebar; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.UiThread; import android.view.View; -import android.widget.ProgressBar; +import com.mapbox.android.gestures.StandardScaleGestureDetector; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.Projection; - -public class ScaleBar{ -// private ScaleWidget scaleWidget; +/** + * Plugin class that show scale bar on mapView and changes scale corresponding to mapView's scale. + */ +public class ScaleBar implements MapboxMap.OnScaleListener { private MapboxMap mapboxMap; private Projection projection; - private MapView mapView; private boolean enabled; - private ProgressBar progressBar; + private ScaleBarWidget scaleBarWidget; + public ScaleBar(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { - this.mapView = mapView; this.mapboxMap = mapboxMap; this.projection = mapboxMap.getProjection(); - this.progressBar = new ProgressBar(mapView.getContext()); -// this.scaleWidget = new ScaleWidget(mapView.getContext()); - this.mapView.addView(progressBar); + this.scaleBarWidget = new ScaleBarWidget(mapView.getContext()); + mapView.addView(scaleBarWidget); + mapboxMap.addOnScaleListener(this); + scaleBarWidget.setWidth(mapView.getWidth()); } /** @@ -39,35 +41,52 @@ public boolean isEnabled() { /** * Toggles the scale plugin state. *

- * If the scale plugin wasn't enabled, a {@link com.mapbox.mapboxsdk.maps.MapView.OnMapChangedListener} - * will be added to the {@link MapView} to listen to map change events to update the state of this plugin. If the - * plugin was enabled the {@link com.mapbox.mapboxsdk.maps.MapView.OnMapChangedListener} will be removed from the map. + * If the scale plugin wasn't enabled, a {@link com.mapbox.mapboxsdk.maps.MapboxMap.OnScaleListener} + * will be added to the {@link MapView} to listen to scale change events to update the state of this plugin. If the + * plugin was enabled the {@link com.mapbox.mapboxsdk.maps.MapboxMap.OnScaleListener} will be removed from the map. *

*/ @UiThread public void setEnabled(boolean enabled) { - if(this.enabled==enabled){ + if (this.enabled == enabled) { // already in correct state return; } this.enabled = enabled; - progressBar.setVisibility(enabled ? View.VISIBLE : View.GONE); -// if (enabled) { -// mapView.addOnMapChangedListener(this); -// // trigger initial update -// onMapChanged(MapView.REGION_DID_CHANGE); -// } else { -// mapView.removeOnMapChangedListener(this); -// } + scaleBarWidget.setVisibility(enabled ? View.VISIBLE : View.GONE); + if (enabled) { + mapboxMap.addOnScaleListener(this); + } else { + mapboxMap.removeOnScaleListener(this); + } + } + + @Override + public void onScaleBegin(@NonNull StandardScaleGestureDetector detector) { + + } + + /** + * Set colors for the scale bar. + * + * @param textColor The color for the texts above scale bar. + * @param primaryColor The color for odd number index bars. + * @param secondaryColor The color for even number index bars. + */ + public void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { + scaleBarWidget.setColors(textColor, primaryColor, secondaryColor); + } + + @Override + public void onScale(@NonNull StandardScaleGestureDetector detector) { + CameraPosition cameraPosition = mapboxMap.getCameraPosition(); + double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); + scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); + } + + @Override + public void onScaleEnd(@NonNull StandardScaleGestureDetector detector) { + } -///* @Override -// public void onMapChanged(int change) { -// Timber.e("OnMapChange %s", change); -// if (change == MapView.REGION_DID_CHANGE || change == MapView.REGION_DID_CHANGE_ANIMATED) { -// CameraPosition cameraPosition = mapboxMap.getCameraPosition(); -// double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); -//// scaleWidget.setMetersPerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); -// }*/ -// } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarConstants.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarConstants.java new file mode 100644 index 000000000..8a170f4f1 --- /dev/null +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarConstants.java @@ -0,0 +1,79 @@ +package com.mapbox.pluginscalebar; + +import android.util.Pair; + +import java.util.ArrayList; + +class ScaleBarConstants { + static double FEET_PER_METER = 3.2808; + static int FEET_PER_MILE = 5280; + static String METER_UNIT = " m"; + static String FEET_UNIT = " ft"; + static ArrayList> metricTable = new ArrayList>() { + { + add(new Pair<>(1, 2)); + add(new Pair<>(2, 2)); + add(new Pair<>(4, 2)); + add(new Pair<>(10, 2)); + add(new Pair<>(20, 2)); + add(new Pair<>(50, 2)); + add(new Pair<>(75, 3)); + add(new Pair<>(100, 2)); + add(new Pair<>(150, 2)); + add(new Pair<>(200, 2)); + add(new Pair<>(300, 3)); + add(new Pair<>(500, 2)); + add(new Pair<>(1000, 2)); + add(new Pair<>(1500, 2)); + add(new Pair<>(3000, 3)); + add(new Pair<>(5000, 2)); + add(new Pair<>(10000, 2)); + add(new Pair<>(20000, 2)); + add(new Pair<>(30000, 3)); + add(new Pair<>(50000, 2)); + add(new Pair<>(100000, 2)); + add(new Pair<>(200000, 2)); + add(new Pair<>(300000, 3)); + add(new Pair<>(400000, 2)); + add(new Pair<>(500000, 2)); + add(new Pair<>(600000, 3)); + add(new Pair<>(800000, 2)); + } + }; + + static ArrayList> imperialTable = new ArrayList>() { + { + add(new Pair<>(4, 2)); + add(new Pair<>(6, 2)); + add(new Pair<>(10, 2)); + add(new Pair<>(20, 2)); + add(new Pair<>(30, 2)); + add(new Pair<>(50, 2)); + add(new Pair<>(75, 3)); + add(new Pair<>(100, 2)); + add(new Pair<>(200, 2)); + add(new Pair<>(300, 3)); + add(new Pair<>(400, 2)); + add(new Pair<>(600, 3)); + add(new Pair<>(800, 2)); + add(new Pair<>(1000, 2)); + add(new Pair<>((int) (0.25f * FEET_PER_MILE), 2)); + add(new Pair<>((int) (0.5f * FEET_PER_MILE), 2)); + add(new Pair<>(FEET_PER_MILE, 2)); + add(new Pair<>(2 * FEET_PER_MILE, 2)); + add(new Pair<>(3 * FEET_PER_MILE, 3)); + add(new Pair<>(4 * FEET_PER_MILE, 2)); + add(new Pair<>(8 * FEET_PER_MILE, 2)); + add(new Pair<>(12 * FEET_PER_MILE, 2)); + add(new Pair<>(15 * FEET_PER_MILE, 3)); + add(new Pair<>(20 * FEET_PER_MILE, 2)); + add(new Pair<>(30 * FEET_PER_MILE, 3)); + add(new Pair<>(40 * FEET_PER_MILE, 2)); + add(new Pair<>(80 * FEET_PER_MILE, 2)); + add(new Pair<>(120 * FEET_PER_MILE, 2)); + add(new Pair<>(200 * FEET_PER_MILE, 2)); + add(new Pair<>(300 * FEET_PER_MILE, 3)); + add(new Pair<>(400 * FEET_PER_MILE, 2)); + } + }; +} diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java new file mode 100644 index 000000000..763f8218c --- /dev/null +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -0,0 +1,161 @@ +package com.mapbox.pluginscalebar; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.support.annotation.ColorInt; +import android.util.Pair; +import android.view.View; + +import java.util.ArrayList; +import java.util.Locale; + +/** + * The scale widget is a visually representation of the scale plugin. + */ +class ScaleBarWidget extends View { + private int textColor; + private int primaryColor; + private int secondaryColor; + private int width; + private int margin; + private int maxBarWidth; + private double distancePerPixel; + private final Paint textPaint = new Paint(); + private final Paint barPaint = new Paint(); + private boolean isMetricSystem; + private ArrayList> scaleTable; + private String unit; + + public ScaleBarWidget(Context context) { + super(context); + textPaint.setAntiAlias(true); + textPaint.setTextSize(20); + textPaint.setTextAlign(Paint.Align.CENTER); + barPaint.setAntiAlias(true); + textColor = context.getResources().getColor(android.R.color.black); + primaryColor = context.getResources().getColor(android.R.color.black); + secondaryColor = context.getResources().getColor(android.R.color.white); + isMetricSystem = LocaleUnitResolver.isMetricSystem(); + scaleTable = isMetricSystem ? ScaleBarConstants.metricTable : ScaleBarConstants.imperialTable; + unit = isMetricSystem ? ScaleBarConstants.METER_UNIT : ScaleBarConstants.FEET_UNIT; + } + + @Override + protected void onDraw(Canvas canvas) { + if (distancePerPixel <= 0) { + return; + } + textPaint.setColor(textColor); + double maxDistance = width * distancePerPixel / 2; + Pair pair = scaleTable.get(0); + for (int i = 1; i < scaleTable.size(); i++) { + pair = scaleTable.get(i); + if (pair.first > maxDistance) { + //use the last scale here, otherwise the scale will be too large + pair = scaleTable.get(i - 1); + break; + } + } + + int unitDistance = pair.first / pair.second; + float unitBarWidth = maxBarWidth / 2f; + if (unitDistance == 0) { + unitDistance = 1; + } else { + unitBarWidth = (float) (unitDistance / distancePerPixel); + } + //Drawing the surrounding borders + barPaint.setStyle(Paint.Style.FILL_AND_STROKE); + barPaint.setColor(secondaryColor); + int barHeight = 10; + int borderWidth = 2; + canvas.drawRect(margin - borderWidth * 2, margin - borderWidth * 2, + margin + unitBarWidth * pair.second + borderWidth * 2, margin + barHeight + borderWidth * 2, barPaint); + barPaint.setColor(primaryColor); + canvas.drawRect(margin - borderWidth, margin - borderWidth, + margin + unitBarWidth * pair.second + borderWidth, margin + barHeight + borderWidth, barPaint); + + //Drawing the fill + barPaint.setStyle(Paint.Style.FILL); + int i = 0; + for (; i < pair.second; i++) { + barPaint.setColor(i % 2 == 0 ? primaryColor : secondaryColor); + String text = i == 0 ? String.valueOf(unitDistance * i) : unitDistance * i + unit; + canvas.drawText(text, margin + unitBarWidth * i, margin - barHeight, textPaint); + canvas.drawRect(margin + unitBarWidth * i, margin, margin + unitBarWidth * (1 + i), + margin + barHeight, barPaint); + } + canvas.drawText(String.valueOf(unitDistance * i) + unit, margin + unitBarWidth * i, margin - barHeight, textPaint); + + } + + /** + * Update the scale when mapView's scale has changed. + * @param metersPerPixel how many meters in each pixel. + */ + void setDistancePerPixel(double metersPerPixel) { + this.distancePerPixel = isMetricSystem ? metersPerPixel : metersPerPixel * ScaleBarConstants.FEET_PER_METER; + invalidate(); + } + + /** + * Set the width of current mapView. + * @param width mapView's width. + */ + void setWidth(int width) { + this.width = width; + margin = width / 20; + maxBarWidth = width / 2 - margin; + } + + /** + * Set colors for the scale bar. + * @param textColor The color for the texts above scale bar. + * @param primaryColor The color for odd number index bars. + * @param secondaryColor The color for even number index bars. + */ + void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { + this.textColor = textColor; + this.primaryColor = primaryColor; + this.secondaryColor = secondaryColor; + } + + /** + * Helper class to determine the user measuring system. + *

+ * Currently supports differentiating between metric vs imperial system. + *

+ *

+ * Depends on {@link Locale#getDefault()} which returns the locale used at application startup. + *

+ */ + private static class LocaleUnitResolver { + + /** + * Returns true if the user is in a country using the metric system. + * + * @return true if user country is using metric, false if imperial + */ + static boolean isMetricSystem() { + String countryCode = Locale.getDefault().getCountry().toUpperCase(); + switch (countryCode) { + case ImperialCountryCode.US: + case ImperialCountryCode.LIBERIA: + case ImperialCountryCode.MYANMAR: + return false; + default: + return true; + } + } + + /** + * Data class containing uppercase country codes for countries using the imperial system. + */ + static class ImperialCountryCode { + static final String US = "US"; + static final String MYANMAR = "MM"; + static final String LIBERIA = "LR"; + } + } +} From 439dd2a244be61bad207a282467bc5afada69105 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 15 May 2019 15:46:42 +0800 Subject: [PATCH 03/19] revert manifest --- app/src/main/AndroidManifest.xml | 493 ++++++++++++++-------------- app/src/main/res/values/strings.xml | 141 ++++---- 2 files changed, 311 insertions(+), 323 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a579a2b6c..4b893a088 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,275 +1,274 @@ + xmlns:tools="http://schemas.android.com/tools" package="com.mapbox.mapboxsdk.plugins.testapp"> - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + - - - - + + + + + + + - - - - + + + - - - - + + + + + + + - - - - + + + + - - - + + + - - - - - - + + + - - - - - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 162b3293c..fd05fc15b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,83 +1,72 @@ - Map Plugins + Map Plugins - - category - Extrusions - Navigation - Location - Navigation - Places - Offline - Scalebar - Localization - Annotation plugin - Kotlin extension functions - View synchronisation + + category + Extrusions + Navigation + Navigation + Places + Offline + Localization + Annotation plugin + Kotlin extension functions + View synchronisation + Scalebar - - Traffic Plugin - Building Plugin - Location Modes - Location Layer Map Change - Toggle Manual Location Updates - Compass Listener - Places Autocomplete - Places Autocomplete Fragment - Create region - List regions - Place picker - Localization Plugin - Offline Ui Components - Location Fragment - Symbol - Fill - Circle - Line - MarkerView plugin - Mapbox Maps KTX - Scale bar + + Traffic Plugin + Building Plugin + Places Autocomplete + Places Autocomplete Fragment + Create region + List regions + Place picker + Localization Plugin + Offline Ui Components + Symbol + Press for Symbol + Bulk amount of Symbols + Change Symbol + Fill + Change Fill + Circle + Line + Change Line + MarkerView plugin + Mapbox Maps KTX + Scale bar - - Add Traffic layers to any Mapbox basemap. - Add 3D Building layer to a Mapbox map. - Switch between the different location modes. - Change map styles while the location layers on the map. - Toggle the user location manual mode on and off. - Add a compass listener to know when heading changes or when the accuracy drops. - Launch the autocomplete activity. - Launch the autocomplete fragment inside an activity - Use a form to create an offline region. - List all offline regions. - Launch the place picker activity and receive result - Automatically localize the map labels into the device\'s set language. - Shows off the UI components included in the offline plugin. - Show current location in the Fragment - Show symbols on a map - Show lines on a map - Show fills on a map - Show circles on a map - Synchronise a view on a map - Test Mapbox Maps SDK for Android Kotlin extension functions - Show scale bar on a map + + Add Traffic layers to any Mapbox basemap. + Add 3D Building layer to a Mapbox map. + Launch the autocomplete activity. + Launch the autocomplete fragment inside an activity + Use a form to create an offline region. + List all offline regions. + Launch the place picker activity and receive result + Automatically localize the map labels into the device\'s set language. + Shows off the UI components included in the offline plugin. + Show symbols on a map + Show a symbol by pressing the map + Dynamically change a symbol on the map + Show fire hydrants in Washington DC area + Show lines on a map + Show changing lines on a map + Show fills on a map + Show changing a fill on a map + Show circles on a map + Synchronise a view on a map + Test Mapbox Maps SDK for Android Kotlin extension functions + Show scale bar on a map - - None - Normal - Tracking - Compass - Nav - - - Example shows how to launch the Place Picker using the Floating action button and receiving a result in onActivityResult. - - - Min zoom: %1$d - Max zoom: %1$d - Make sure that the device\'s default language is not English - Map not localized to device language and now set to French - Map localized to device language - Tracking: - Mode: + + Example shows how to launch the Place Picker using the Floating action button and receiving a result in onActivityResult. + + Min zoom: %1$d + Max zoom: %1$d + Make sure that the device\'s default language is not English + Map not localized to device language and now set to French + Map localized to device language From 0e1c7a64a6a5e7217a569b5c43478864c1d3fe16 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Fri, 17 May 2019 08:09:31 +0800 Subject: [PATCH 04/19] Update app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt Co-Authored-By: Langston Smith --- .../plugins/testapp/activity/scalebar/ScalebarActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 77a5d9a94..a3acb1572 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -9,7 +9,7 @@ import com.mapbox.pluginscalebar.ScaleBar import kotlinx.android.synthetic.main.activity_scalebar.* /** - * Activity showing a scalebar used on mapview. + * Activity showing a scalebar used on a MapView. */ class ScalebarActivity : AppCompatActivity() { private var scaleBar: ScaleBar? = null @@ -64,4 +64,4 @@ class ScalebarActivity : AppCompatActivity() { super.onSaveInstanceState(outState) mapView?.onSaveInstanceState(outState) } -} \ No newline at end of file +} From e87c8d516af3a0c11d30d0137a90ecf7c615ccc4 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Fri, 17 May 2019 08:09:40 +0800 Subject: [PATCH 05/19] Update plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java Co-Authored-By: Langston Smith --- .../src/main/java/com/mapbox/pluginscalebar/ScaleBar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java index d1c7f791b..e94f779e2 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -12,7 +12,7 @@ import com.mapbox.mapboxsdk.maps.Projection; /** - * Plugin class that show scale bar on mapView and changes scale corresponding to mapView's scale. + * Plugin class that shows a scale bar on MapView and changes the scale corresponding to the MapView's scale. */ public class ScaleBar implements MapboxMap.OnScaleListener { private MapboxMap mapboxMap; From 65e4c3834ebd4f29be69536697263ba9014e475c Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Fri, 17 May 2019 08:09:50 +0800 Subject: [PATCH 06/19] Update plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java Co-Authored-By: Langston Smith --- .../src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 763f8218c..78278b688 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -11,7 +11,7 @@ import java.util.Locale; /** - * The scale widget is a visually representation of the scale plugin. + * The scale widget is a visual representation of the scale bar plugin. */ class ScaleBarWidget extends View { private int textColor; From 321fb75f8eed279b0f07e884b4e8b0f481c57c79 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 17 May 2019 12:00:22 +0800 Subject: [PATCH 07/19] fix review comments --- app/build.gradle | 2 +- .../activity/scalebar/ScalebarActivity.kt | 9 ++-- .../ExampleInstrumentedTest.java | 26 ------------ .../com/mapbox/pluginscalebar/ScaleBar.java | 42 ++++++++++--------- .../mapbox/pluginscalebar/ScaleBarWidget.java | 14 +++---- .../src/main/res/values/strings.xml | 3 -- .../pluginscalebar/ExampleUnitTest.java | 17 -------- 7 files changed, 35 insertions(+), 78 deletions(-) delete mode 100644 plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java delete mode 100644 plugin-scalebar/src/main/res/values/strings.xml delete mode 100644 plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java diff --git a/app/build.gradle b/app/build.gradle index 2cecc81fa..328b4f7d5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,7 +113,7 @@ dependencies { implementation project(':plugin-annotation') implementation project(':plugin-markerview') implementation project(':ktx-mapbox-maps') - implementation project(path: ':plugin-scalebar') + implementation project(path: ':plugin-scalebar') } apply from: "${rootDir}/gradle/checkstyle.gradle" diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index a3acb1572..945337dc8 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -12,18 +12,17 @@ import kotlinx.android.synthetic.main.activity_scalebar.* * Activity showing a scalebar used on a MapView. */ class ScalebarActivity : AppCompatActivity() { - private var scaleBar: ScaleBar? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_scalebar) mapView.onCreate(savedInstanceState) mapView.getMapAsync { mapboxMap -> - mapboxMap.setStyle(Style.MAPBOX_STREETS) { _ -> + mapboxMap.setStyle(Style.MAPBOX_STREETS) { mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0)) - scaleBar = ScaleBar(mapView, mapboxMap) - scaleBar!!.isEnabled = true + val scaleBar = ScaleBar(mapView, mapboxMap) + scaleBar.isEnabled = true fabScaleWidget.setOnClickListener { - scaleBar!!.isEnabled = !scaleBar?.isEnabled!! + scaleBar.isEnabled = !scaleBar.isEnabled } } } diff --git a/plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java b/plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java deleted file mode 100644 index eabb96dcd..000000000 --- a/plugin-scalebar/src/androidTest/java/com/mapbox/pluginscalebar/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.mapbox.pluginscalebar; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.mapbox.pluginscalebar.test", appContext.getPackageName()); - } -} diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java index e94f779e2..3bc5e9de2 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -4,7 +4,6 @@ import android.support.annotation.NonNull; import android.support.annotation.UiThread; import android.view.View; - import com.mapbox.android.gestures.StandardScaleGestureDetector; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.maps.MapView; @@ -14,19 +13,21 @@ /** * Plugin class that shows a scale bar on MapView and changes the scale corresponding to the MapView's scale. */ -public class ScaleBar implements MapboxMap.OnScaleListener { +public class ScaleBar { private MapboxMap mapboxMap; private Projection projection; private boolean enabled; private ScaleBarWidget scaleBarWidget; + private ScaleListener scaleListener; public ScaleBar(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { this.mapboxMap = mapboxMap; this.projection = mapboxMap.getProjection(); this.scaleBarWidget = new ScaleBarWidget(mapView.getContext()); mapView.addView(scaleBarWidget); - mapboxMap.addOnScaleListener(this); - scaleBarWidget.setWidth(mapView.getWidth()); + scaleListener = new ScaleListener(); + mapboxMap.addOnScaleListener(scaleListener); + scaleBarWidget.setMapViewWidth(mapView.getWidth()); } /** @@ -55,21 +56,18 @@ public void setEnabled(boolean enabled) { this.enabled = enabled; scaleBarWidget.setVisibility(enabled ? View.VISIBLE : View.GONE); if (enabled) { - mapboxMap.addOnScaleListener(this); + mapboxMap.addOnScaleListener(scaleListener); } else { - mapboxMap.removeOnScaleListener(this); + mapboxMap.removeOnScaleListener(scaleListener); } } - @Override - public void onScaleBegin(@NonNull StandardScaleGestureDetector detector) { - } /** * Set colors for the scale bar. * - * @param textColor The color for the texts above scale bar. + * @param textColor The color for the texts above the scale bar. * @param primaryColor The color for odd number index bars. * @param secondaryColor The color for even number index bars. */ @@ -77,16 +75,22 @@ public void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @Colo scaleBarWidget.setColors(textColor, primaryColor, secondaryColor); } - @Override - public void onScale(@NonNull StandardScaleGestureDetector detector) { - CameraPosition cameraPosition = mapboxMap.getCameraPosition(); - double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); - scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); - } + class ScaleListener implements MapboxMap.OnScaleListener { + @Override + public void onScaleBegin(@NonNull StandardScaleGestureDetector detector) { - @Override - public void onScaleEnd(@NonNull StandardScaleGestureDetector detector) { + } - } + @Override + public void onScale(@NonNull StandardScaleGestureDetector detector) { + CameraPosition cameraPosition = mapboxMap.getCameraPosition(); + double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); + scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); + } + + @Override + public void onScaleEnd(@NonNull StandardScaleGestureDetector detector) { + } + } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 78278b688..cae381dd9 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -17,7 +17,7 @@ class ScaleBarWidget extends View { private int textColor; private int primaryColor; private int secondaryColor; - private int width; + private int mapViewWidth; private int margin; private int maxBarWidth; private double distancePerPixel; @@ -47,7 +47,7 @@ protected void onDraw(Canvas canvas) { return; } textPaint.setColor(textColor); - double maxDistance = width * distancePerPixel / 2; + double maxDistance = mapViewWidth * distancePerPixel / 2; Pair pair = scaleTable.get(0); for (int i = 1; i < scaleTable.size(); i++) { pair = scaleTable.get(i); @@ -101,12 +101,12 @@ void setDistancePerPixel(double metersPerPixel) { /** * Set the width of current mapView. - * @param width mapView's width. + * @param mapViewWidth mapView's wdith. */ - void setWidth(int width) { - this.width = width; - margin = width / 20; - maxBarWidth = width / 2 - margin; + void setMapViewWidth(int mapViewWidth) { + this.mapViewWidth = mapViewWidth; + margin = mapViewWidth / 20; + maxBarWidth = mapViewWidth / 2 - margin; } /** diff --git a/plugin-scalebar/src/main/res/values/strings.xml b/plugin-scalebar/src/main/res/values/strings.xml deleted file mode 100644 index 69214f2fd..000000000 --- a/plugin-scalebar/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - pluginScalebar - diff --git a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java deleted file mode 100644 index d14970c11..000000000 --- a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mapbox.pluginscalebar; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file From f93491280d8c72b882a2e062eef24c69f883ee0e Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 20 May 2019 13:48:04 +0800 Subject: [PATCH 08/19] Add test cases --- .../com/mapbox/pluginscalebar/ScaleBar.java | 2 +- .../mapbox/pluginscalebar/ScaleBarWidget.java | 16 +++++ .../mapbox/pluginscalebar/ScalebarTest.java | 67 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java index 3bc5e9de2..490cc7500 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -16,7 +16,7 @@ public class ScaleBar { private MapboxMap mapboxMap; private Projection projection; - private boolean enabled; + private boolean enabled = true; private ScaleBarWidget scaleBarWidget; private ScaleListener scaleListener; diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index cae381dd9..309ffc185 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -121,6 +121,22 @@ void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt in this.secondaryColor = secondaryColor; } + public int getTextColor() { + return textColor; + } + + public int getPrimaryColor() { + return primaryColor; + } + + public int getSecondaryColor() { + return secondaryColor; + } + + public int getMapViewWidth() { + return mapViewWidth; + } + /** * Helper class to determine the user measuring system. *

diff --git a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java new file mode 100644 index 000000000..3c5d2ec7e --- /dev/null +++ b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java @@ -0,0 +1,67 @@ +package com.mapbox.pluginscalebar; + +import android.content.Context; +import android.content.res.Resources; +import android.view.View; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.Projection; +import org.junit.Before; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +public class ScalebarTest { + private static int MAPVIEW_WIDTH = 1080; + private ScaleBar scaleBar; + private ScaleBarWidget scaleBarWidget; + + @Before + public void setUp() { + Context context = mock(Context.class); + Resources resources = mock(Resources.class); + when(context.getResources()).thenReturn(resources); + when(resources.getColor(android.R.color.black)).thenReturn(0xff000000); + when(resources.getColor(android.R.color.white)).thenReturn(0xffffffff); + MapView mapView = mock(MapView.class); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + scaleBarWidget = (ScaleBarWidget) invocation.getArguments()[0]; + return null; + } + }).when(mapView).addView(any(View.class)); + when(mapView.getContext()).thenReturn(context); + when(mapView.getWidth()).thenReturn(MAPVIEW_WIDTH); + MapboxMap mapboxMap = mock(MapboxMap.class); + Projection projection = mock(Projection.class); + when(mapboxMap.getProjection()).thenReturn(projection); + scaleBar = new ScaleBar(mapView, mapboxMap); + assertNotNull(scaleBar); + assertNotNull(scaleBarWidget); + } + + @Test + public void testEnable() { + assertTrue(scaleBar.isEnabled()); + scaleBar.setEnabled(false); + assertFalse(scaleBar.isEnabled()); + } + + @Test + public void testVariables() { + assertEquals(MAPVIEW_WIDTH, scaleBarWidget.getMapViewWidth()); + assertEquals(0xff000000, scaleBarWidget.getTextColor()); + assertEquals(0xff000000, scaleBarWidget.getPrimaryColor()); + assertEquals(0xffffffff, scaleBarWidget.getSecondaryColor()); + + scaleBar.setColors(0xff000000, 0xff000001, 0xff000002); + assertEquals(0xff000000, scaleBarWidget.getTextColor()); + assertEquals(0xff000001, scaleBarWidget.getPrimaryColor()); + assertEquals(0xff000002, scaleBarWidget.getSecondaryColor()); + } +} From 2a6e8b22b31d8bb4b785c3da6c03dd8f34cce505 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 22 May 2019 11:28:30 +0800 Subject: [PATCH 09/19] Add Handler to limit fresh frequent --- .../com/mapbox/pluginscalebar/ScaleBar.java | 27 ++++------- .../mapbox/pluginscalebar/ScaleBarWidget.java | 45 +++++++++++++++---- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java index 490cc7500..475fc3d47 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -4,7 +4,6 @@ import android.support.annotation.NonNull; import android.support.annotation.UiThread; import android.view.View; -import com.mapbox.android.gestures.StandardScaleGestureDetector; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; @@ -18,15 +17,15 @@ public class ScaleBar { private Projection projection; private boolean enabled = true; private ScaleBarWidget scaleBarWidget; - private ScaleListener scaleListener; + private CameraMoveListener cameraMoveListener; public ScaleBar(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { this.mapboxMap = mapboxMap; this.projection = mapboxMap.getProjection(); this.scaleBarWidget = new ScaleBarWidget(mapView.getContext()); mapView.addView(scaleBarWidget); - scaleListener = new ScaleListener(); - mapboxMap.addOnScaleListener(scaleListener); + cameraMoveListener = new CameraMoveListener(); + mapboxMap.addOnCameraMoveListener(cameraMoveListener); scaleBarWidget.setMapViewWidth(mapView.getWidth()); } @@ -56,9 +55,9 @@ public void setEnabled(boolean enabled) { this.enabled = enabled; scaleBarWidget.setVisibility(enabled ? View.VISIBLE : View.GONE); if (enabled) { - mapboxMap.addOnScaleListener(scaleListener); + mapboxMap.addOnCameraMoveListener(cameraMoveListener); } else { - mapboxMap.removeOnScaleListener(scaleListener); + mapboxMap.removeOnCameraMoveListener(cameraMoveListener); } } @@ -71,26 +70,16 @@ public void setEnabled(boolean enabled) { * @param primaryColor The color for odd number index bars. * @param secondaryColor The color for even number index bars. */ - public void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { + void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { scaleBarWidget.setColors(textColor, primaryColor, secondaryColor); } - class ScaleListener implements MapboxMap.OnScaleListener { + class CameraMoveListener implements MapboxMap.OnCameraMoveListener { @Override - public void onScaleBegin(@NonNull StandardScaleGestureDetector detector) { - - } - - @Override - public void onScale(@NonNull StandardScaleGestureDetector detector) { + public void onCameraMove() { CameraPosition cameraPosition = mapboxMap.getCameraPosition(); double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); } - - @Override - public void onScaleEnd(@NonNull StandardScaleGestureDetector detector) { - - } } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 309ffc185..4dfa69448 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -3,10 +3,13 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; +import android.os.Handler; +import android.os.Message; import android.support.annotation.ColorInt; import android.util.Pair; import android.view.View; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Locale; @@ -14,6 +17,8 @@ * The scale widget is a visual representation of the scale bar plugin. */ class ScaleBarWidget extends View { + private static int MSG_WHAT = 0; + private static int REFRESH_DURATION = 300; private int textColor; private int primaryColor; private int secondaryColor; @@ -26,6 +31,7 @@ class ScaleBarWidget extends View { private boolean isMetricSystem; private ArrayList> scaleTable; private String unit; + private RefreshHandler refreshHandler; public ScaleBarWidget(Context context) { super(context); @@ -39,6 +45,7 @@ public ScaleBarWidget(Context context) { isMetricSystem = LocaleUnitResolver.isMetricSystem(); scaleTable = isMetricSystem ? ScaleBarConstants.metricTable : ScaleBarConstants.imperialTable; unit = isMetricSystem ? ScaleBarConstants.METER_UNIT : ScaleBarConstants.FEET_UNIT; + refreshHandler = new RefreshHandler(this); } @Override @@ -86,21 +93,25 @@ protected void onDraw(Canvas canvas) { canvas.drawRect(margin + unitBarWidth * i, margin, margin + unitBarWidth * (1 + i), margin + barHeight, barPaint); } - canvas.drawText(String.valueOf(unitDistance * i) + unit, margin + unitBarWidth * i, margin - barHeight, textPaint); + canvas.drawText(unitDistance * i + unit, margin + unitBarWidth * i, margin - barHeight, textPaint); } /** * Update the scale when mapView's scale has changed. + * * @param metersPerPixel how many meters in each pixel. */ void setDistancePerPixel(double metersPerPixel) { this.distancePerPixel = isMetricSystem ? metersPerPixel : metersPerPixel * ScaleBarConstants.FEET_PER_METER; - invalidate(); + if (!refreshHandler.hasMessages(MSG_WHAT)) { + refreshHandler.sendEmptyMessageDelayed(MSG_WHAT, REFRESH_DURATION); + } } /** * Set the width of current mapView. + * * @param mapViewWidth mapView's wdith. */ void setMapViewWidth(int mapViewWidth) { @@ -111,8 +122,9 @@ void setMapViewWidth(int mapViewWidth) { /** * Set colors for the scale bar. - * @param textColor The color for the texts above scale bar. - * @param primaryColor The color for odd number index bars. + * + * @param textColor The color for the texts above scale bar. + * @param primaryColor The color for odd number index bars. * @param secondaryColor The color for even number index bars. */ void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { @@ -121,22 +133,39 @@ void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt in this.secondaryColor = secondaryColor; } - public int getTextColor() { + int getTextColor() { return textColor; } - public int getPrimaryColor() { + int getPrimaryColor() { return primaryColor; } - public int getSecondaryColor() { + int getSecondaryColor() { return secondaryColor; } - public int getMapViewWidth() { + int getMapViewWidth() { return mapViewWidth; } + /** + * Handler class to limit the refresh frequent. + */ + private static class RefreshHandler extends Handler { + WeakReference scaleBarWidgetWeakReference; + + RefreshHandler(ScaleBarWidget scaleBarWidget) { + scaleBarWidgetWeakReference = new WeakReference<>(scaleBarWidget); + } + + public void handleMessage(Message msg) { + if (msg.what == MSG_WHAT && scaleBarWidgetWeakReference.get() != null) { + scaleBarWidgetWeakReference.get().invalidate(); + } + } + } + /** * Helper class to determine the user measuring system. *

From 781c487f6161fec35eaaa280f8ec35eb891a1f1b Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 22 May 2019 14:43:56 +0800 Subject: [PATCH 10/19] Add instrumentation test --- .../plugins/scalebar/ScaleBarTest.java | 94 ++++++++++++++++ .../com/mapbox/pluginscalebar/ScaleBar.java | 14 ++- .../mapbox/pluginscalebar/ScaleBarWidget.java | 28 +++-- .../mapbox/pluginscalebar/ScalebarTest.java | 102 ++++++++++-------- 4 files changed, 178 insertions(+), 60 deletions(-) create mode 100644 app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java new file mode 100644 index 000000000..a741e9f40 --- /dev/null +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -0,0 +1,94 @@ +package com.mapbox.mapboxsdk.plugins.scalebar; + + +import android.app.Activity; +import android.support.test.runner.AndroidJUnit4; +import android.view.View; + +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.plugins.BaseActivityTest; +import com.mapbox.mapboxsdk.plugins.testapp.R; +import com.mapbox.mapboxsdk.plugins.testapp.activity.TestActivity; +import com.mapbox.pluginscalebar.ScaleBar; +import com.mapbox.pluginscalebar.ScaleBarWidget; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import timber.log.Timber; + +import static com.mapbox.mapboxsdk.plugins.annotation.MapboxMapAction.invoke; +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Basic smoke tests for ScaleBar + */ +@RunWith(AndroidJUnit4.class) +public class ScaleBarTest extends BaseActivityTest { + private ScaleBar scaleBar; + + @Override + protected Class getActivityClass() { + return TestActivity.class; + } + + private void setupScaleBar() { + Timber.i("Retrieving layer"); + invoke(mapboxMap, (uiController, mapboxMap) -> { + scaleBar = new ScaleBar(idlingResource.getMapView(), mapboxMap); + }); + } + + @Test + public void testScaleBarEnable() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertNotNull(scaleBar); + ScaleBarWidget scaleBarWidget = scaleBar.getScaleBarWidget(); + assertNotNull(scaleBarWidget); + assertEquals(View.VISIBLE, scaleBarWidget.getVisibility()); + assertTrue(scaleBar.isEnabled()); + scaleBar.setEnabled(false); + assertEquals(View.GONE, scaleBarWidget.getVisibility()); + assertFalse(scaleBar.isEnabled()); + }); + } + + @Test + public void testScaleBarColor() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertNotNull(scaleBar); + ScaleBarWidget scaleBarWidget = scaleBar.getScaleBarWidget(); + assertNotNull(scaleBarWidget); + Activity activity = rule.getActivity(); + assertEquals(activity.getResources().getColor(android.R.color.black), scaleBarWidget.getTextColor()); + assertEquals(activity.getResources().getColor(android.R.color.black), scaleBarWidget.getPrimaryColor()); + assertEquals(activity.getResources().getColor(android.R.color.white), scaleBarWidget.getSecondaryColor()); + scaleBar.setColors(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark); + assertEquals(activity.getResources().getColor(R.color.colorAccent), scaleBarWidget.getTextColor()); + assertEquals(activity.getResources().getColor(R.color.colorPrimary), scaleBarWidget.getPrimaryColor()); + assertEquals(activity.getResources().getColor(R.color.colorPrimaryDark), scaleBarWidget.getSecondaryColor()); + }); + } + + @Test + public void testScaleBarWidth() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertNotNull(scaleBar); + ScaleBarWidget scaleBarWidget = scaleBar.getScaleBarWidget(); + assertNotNull(scaleBarWidget); + assertEquals(MapView.class, scaleBarWidget.getParent().getClass()); + MapView parent = (MapView) scaleBarWidget.getParent(); + assertEquals(parent.getWidth(), scaleBarWidget.getMapViewWidth()); + }); + } + +} diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java index 475fc3d47..e0050bec2 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java @@ -1,9 +1,11 @@ package com.mapbox.pluginscalebar; -import android.support.annotation.ColorInt; +import android.support.annotation.ColorRes; import android.support.annotation.NonNull; import android.support.annotation.UiThread; +import android.support.annotation.VisibleForTesting; import android.view.View; + import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; @@ -12,7 +14,7 @@ /** * Plugin class that shows a scale bar on MapView and changes the scale corresponding to the MapView's scale. */ -public class ScaleBar { +public class ScaleBar { private MapboxMap mapboxMap; private Projection projection; private boolean enabled = true; @@ -62,7 +64,6 @@ public void setEnabled(boolean enabled) { } - /** * Set colors for the scale bar. * @@ -70,7 +71,7 @@ public void setEnabled(boolean enabled) { * @param primaryColor The color for odd number index bars. * @param secondaryColor The color for even number index bars. */ - void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { + public void setColors(@ColorRes int textColor, @ColorRes int primaryColor, @ColorRes int secondaryColor) { scaleBarWidget.setColors(textColor, primaryColor, secondaryColor); } @@ -82,4 +83,9 @@ public void onCameraMove() { scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); } } + + @VisibleForTesting + public ScaleBarWidget getScaleBarWidget() { + return scaleBarWidget; + } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 4dfa69448..26c90f7a7 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -5,7 +5,8 @@ import android.graphics.Paint; import android.os.Handler; import android.os.Message; -import android.support.annotation.ColorInt; +import android.support.annotation.ColorRes; +import android.support.annotation.VisibleForTesting; import android.util.Pair; import android.view.View; @@ -16,7 +17,8 @@ /** * The scale widget is a visual representation of the scale bar plugin. */ -class ScaleBarWidget extends View { +@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) +public class ScaleBarWidget extends View { private static int MSG_WHAT = 0; private static int REFRESH_DURATION = 300; private int textColor; @@ -32,9 +34,11 @@ class ScaleBarWidget extends View { private ArrayList> scaleTable; private String unit; private RefreshHandler refreshHandler; + private Context context; public ScaleBarWidget(Context context) { super(context); + this.context = context; textPaint.setAntiAlias(true); textPaint.setTextSize(20); textPaint.setTextAlign(Paint.Align.CENTER); @@ -127,25 +131,29 @@ void setMapViewWidth(int mapViewWidth) { * @param primaryColor The color for odd number index bars. * @param secondaryColor The color for even number index bars. */ - void setColors(@ColorInt int textColor, @ColorInt int primaryColor, @ColorInt int secondaryColor) { - this.textColor = textColor; - this.primaryColor = primaryColor; - this.secondaryColor = secondaryColor; + void setColors(@ColorRes int textColor, @ColorRes int primaryColor, @ColorRes int secondaryColor) { + this.textColor = context.getResources().getColor(textColor); + this.primaryColor = context.getResources().getColor(primaryColor); + this.secondaryColor = context.getResources().getColor(secondaryColor); } - int getTextColor() { + @VisibleForTesting + public int getTextColor() { return textColor; } - int getPrimaryColor() { + @VisibleForTesting + public int getPrimaryColor() { return primaryColor; } - int getSecondaryColor() { + @VisibleForTesting + public int getSecondaryColor() { return secondaryColor; } - int getMapViewWidth() { + @VisibleForTesting + public int getMapViewWidth() { return mapViewWidth; } diff --git a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java index 3c5d2ec7e..d54e351b3 100644 --- a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java +++ b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java @@ -3,65 +3,75 @@ import android.content.Context; import android.content.res.Resources; import android.view.View; + import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.Projection; + import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class ScalebarTest { - private static int MAPVIEW_WIDTH = 1080; - private ScaleBar scaleBar; - private ScaleBarWidget scaleBarWidget; + private static int MAPVIEW_WIDTH = 1080; + private ScaleBar scaleBar; + private ScaleBarWidget scaleBarWidget; - @Before - public void setUp() { - Context context = mock(Context.class); - Resources resources = mock(Resources.class); - when(context.getResources()).thenReturn(resources); - when(resources.getColor(android.R.color.black)).thenReturn(0xff000000); - when(resources.getColor(android.R.color.white)).thenReturn(0xffffffff); - MapView mapView = mock(MapView.class); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - scaleBarWidget = (ScaleBarWidget) invocation.getArguments()[0]; - return null; - } - }).when(mapView).addView(any(View.class)); - when(mapView.getContext()).thenReturn(context); - when(mapView.getWidth()).thenReturn(MAPVIEW_WIDTH); - MapboxMap mapboxMap = mock(MapboxMap.class); - Projection projection = mock(Projection.class); - when(mapboxMap.getProjection()).thenReturn(projection); - scaleBar = new ScaleBar(mapView, mapboxMap); - assertNotNull(scaleBar); - assertNotNull(scaleBarWidget); - } + @Before + public void setUp() { + Context context = mock(Context.class); + Resources resources = mock(Resources.class); + when(context.getResources()).thenReturn(resources); + when(resources.getColor(android.R.color.black)).thenReturn(0xff000000); + when(resources.getColor(android.R.color.white)).thenReturn(0xffffffff); + when(resources.getColor(0xff000000)).thenReturn(0xff000000); + when(resources.getColor(0xff000001)).thenReturn(0xff000001); + when(resources.getColor(0xff000002)).thenReturn(0xff000002); + MapView mapView = mock(MapView.class); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + scaleBarWidget = (ScaleBarWidget) invocation.getArguments()[0]; + return null; + } + }).when(mapView).addView(any(View.class)); + when(mapView.getContext()).thenReturn(context); + when(mapView.getWidth()).thenReturn(MAPVIEW_WIDTH); + MapboxMap mapboxMap = mock(MapboxMap.class); + Projection projection = mock(Projection.class); + when(mapboxMap.getProjection()).thenReturn(projection); + scaleBar = new ScaleBar(mapView, mapboxMap); + assertNotNull(scaleBar); + assertNotNull(scaleBarWidget); + } - @Test - public void testEnable() { - assertTrue(scaleBar.isEnabled()); - scaleBar.setEnabled(false); - assertFalse(scaleBar.isEnabled()); - } + @Test + public void testEnable() { + assertTrue(scaleBar.isEnabled()); + scaleBar.setEnabled(false); + assertFalse(scaleBar.isEnabled()); + } - @Test - public void testVariables() { - assertEquals(MAPVIEW_WIDTH, scaleBarWidget.getMapViewWidth()); - assertEquals(0xff000000, scaleBarWidget.getTextColor()); - assertEquals(0xff000000, scaleBarWidget.getPrimaryColor()); - assertEquals(0xffffffff, scaleBarWidget.getSecondaryColor()); + @Test + public void testVariables() { + assertEquals(MAPVIEW_WIDTH, scaleBarWidget.getMapViewWidth()); + assertEquals(0xff000000, scaleBarWidget.getTextColor()); + assertEquals(0xff000000, scaleBarWidget.getPrimaryColor()); + assertEquals(0xffffffff, scaleBarWidget.getSecondaryColor()); - scaleBar.setColors(0xff000000, 0xff000001, 0xff000002); - assertEquals(0xff000000, scaleBarWidget.getTextColor()); - assertEquals(0xff000001, scaleBarWidget.getPrimaryColor()); - assertEquals(0xff000002, scaleBarWidget.getSecondaryColor()); - } + scaleBar.setColors(0xff000000, 0xff000001, 0xff000002); + assertEquals(0xff000000, scaleBarWidget.getTextColor()); + assertEquals(0xff000001, scaleBarWidget.getPrimaryColor()); + assertEquals(0xff000002, scaleBarWidget.getSecondaryColor()); + } } From 027cf783186503301dcb5e471bed0bed3821b257 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 22 May 2019 15:40:15 +0800 Subject: [PATCH 11/19] rm redundant codes --- app/build.gradle | 2 +- .../plugins/testapp/activity/scalebar/ScalebarActivity.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 328b4f7d5..28c995e48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,7 +113,7 @@ dependencies { implementation project(':plugin-annotation') implementation project(':plugin-markerview') implementation project(':ktx-mapbox-maps') - implementation project(path: ':plugin-scalebar') + implementation project(':plugin-scalebar') } apply from: "${rootDir}/gradle/checkstyle.gradle" diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 945337dc8..45367a99c 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -20,7 +20,6 @@ class ScalebarActivity : AppCompatActivity() { mapboxMap.setStyle(Style.MAPBOX_STREETS) { mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0)) val scaleBar = ScaleBar(mapView, mapboxMap) - scaleBar.isEnabled = true fabScaleWidget.setOnClickListener { scaleBar.isEnabled = !scaleBar.isEnabled } From 496f8de7cb3f62a84b02eb7be1227876affc2e08 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 22 May 2019 17:05:10 +0800 Subject: [PATCH 12/19] move judgement of WeakReference --- .../main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 26c90f7a7..89ad9a6bf 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -168,8 +168,9 @@ private static class RefreshHandler extends Handler { } public void handleMessage(Message msg) { - if (msg.what == MSG_WHAT && scaleBarWidgetWeakReference.get() != null) { - scaleBarWidgetWeakReference.get().invalidate(); + ScaleBarWidget scaleBarWidget = scaleBarWidgetWeakReference.get(); + if (msg.what == MSG_WHAT && scaleBarWidget != null) { + scaleBarWidget.invalidate(); } } } From c7ae1a28ded1e858f769c613eeabad83bf050347 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 27 May 2019 12:02:35 +0800 Subject: [PATCH 13/19] Add ScalebarOption. --- .../plugins/scalebar/ScaleBarTest.java | 161 +++++++-- .../activity/scalebar/ScalebarActivity.kt | 33 +- .../{ScaleBar.java => ScaleBarManager.java} | 53 +-- .../mapbox/pluginscalebar/ScaleBarOption.java | 248 ++++++++++++++ .../mapbox/pluginscalebar/ScaleBarWidget.java | 324 +++++++++++++----- .../mapbox/pluginscalebar/ScalebarTest.java | 77 ----- 6 files changed, 676 insertions(+), 220 deletions(-) rename plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/{ScaleBar.java => ScaleBarManager.java} (69%) create mode 100644 plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java delete mode 100644 plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index a741e9f40..152f635a2 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -3,13 +3,15 @@ import android.app.Activity; import android.support.test.runner.AndroidJUnit4; +import android.util.DisplayMetrics; import android.view.View; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.plugins.BaseActivityTest; import com.mapbox.mapboxsdk.plugins.testapp.R; import com.mapbox.mapboxsdk.plugins.testapp.activity.TestActivity; -import com.mapbox.pluginscalebar.ScaleBar; +import com.mapbox.pluginscalebar.ScaleBarManager; +import com.mapbox.pluginscalebar.ScaleBarOption; import com.mapbox.pluginscalebar.ScaleBarWidget; import org.junit.Test; @@ -28,7 +30,9 @@ */ @RunWith(AndroidJUnit4.class) public class ScaleBarTest extends BaseActivityTest { - private ScaleBar scaleBar; + private ScaleBarManager scaleBarManager; + private Activity activity; + private ScaleBarWidget scaleBarWidget; @Override protected Class getActivityClass() { @@ -38,7 +42,11 @@ protected Class getActivityClass() { private void setupScaleBar() { Timber.i("Retrieving layer"); invoke(mapboxMap, (uiController, mapboxMap) -> { - scaleBar = new ScaleBar(idlingResource.getMapView(), mapboxMap); + scaleBarManager = new ScaleBarManager(idlingResource.getMapView(), mapboxMap); + activity = rule.getActivity(); + scaleBarWidget = scaleBarManager.create(new ScaleBarOption(activity)); + assertNotNull(scaleBarManager); + assertNotNull(scaleBarWidget); }); } @@ -47,14 +55,11 @@ public void testScaleBarEnable() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertNotNull(scaleBar); - ScaleBarWidget scaleBarWidget = scaleBar.getScaleBarWidget(); - assertNotNull(scaleBarWidget); assertEquals(View.VISIBLE, scaleBarWidget.getVisibility()); - assertTrue(scaleBar.isEnabled()); - scaleBar.setEnabled(false); + assertTrue(scaleBarManager.isEnabled()); + scaleBarManager.setEnabled(false); assertEquals(View.GONE, scaleBarWidget.getVisibility()); - assertFalse(scaleBar.isEnabled()); + assertFalse(scaleBarManager.isEnabled()); }); } @@ -63,17 +68,24 @@ public void testScaleBarColor() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertNotNull(scaleBar); - ScaleBarWidget scaleBarWidget = scaleBar.getScaleBarWidget(); - assertNotNull(scaleBarWidget); - Activity activity = rule.getActivity(); assertEquals(activity.getResources().getColor(android.R.color.black), scaleBarWidget.getTextColor()); assertEquals(activity.getResources().getColor(android.R.color.black), scaleBarWidget.getPrimaryColor()); assertEquals(activity.getResources().getColor(android.R.color.white), scaleBarWidget.getSecondaryColor()); - scaleBar.setColors(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark); - assertEquals(activity.getResources().getColor(R.color.colorAccent), scaleBarWidget.getTextColor()); - assertEquals(activity.getResources().getColor(R.color.colorPrimary), scaleBarWidget.getPrimaryColor()); - assertEquals(activity.getResources().getColor(R.color.colorPrimaryDark), scaleBarWidget.getSecondaryColor()); + + + int textColor = activity.getResources().getColor(R.color.colorAccent); + int colorPrimary = activity.getResources().getColor(R.color.colorPrimary); + int colorSecondary = activity.getResources().getColor(R.color.colorPrimaryDark); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setTextColor(textColor); + option.setPrimaryColor(colorPrimary); + option.setSecondaryColor(colorSecondary); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(textColor, scaleBarWidget.getTextColor()); + assertEquals(colorPrimary, scaleBarWidget.getPrimaryColor()); + assertEquals(colorSecondary, scaleBarWidget.getSecondaryColor()); }); } @@ -82,13 +94,122 @@ public void testScaleBarWidth() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertNotNull(scaleBar); - ScaleBarWidget scaleBarWidget = scaleBar.getScaleBarWidget(); - assertNotNull(scaleBarWidget); assertEquals(MapView.class, scaleBarWidget.getParent().getClass()); MapView parent = (MapView) scaleBarWidget.getParent(); assertEquals(parent.getWidth(), scaleBarWidget.getMapViewWidth()); }); } + @Test + public void testMargin() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertEquals(convertDpToPixel(ScaleBarOption.MARGIN_LEFT_DEFAULT), scaleBarWidget.getMarginLeft(), 0); + assertEquals(convertDpToPixel(ScaleBarOption.MARGIN_TOP_DEFAULT), scaleBarWidget.getMarginTop(), 0); + assertEquals(convertDpToPixel(ScaleBarOption.TEXT_BAR_MARGIN_DEFAULT), scaleBarWidget.getTextBarMargin(), 0); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setMarginLeft(100); + option.setMarginTop(50); + option.setTextBarMargin(30); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(convertDpToPixel(100), scaleBarWidget.getMarginLeft(), 0); + assertEquals(convertDpToPixel(50), scaleBarWidget.getMarginTop(), 0); + assertEquals(convertDpToPixel(30), scaleBarWidget.getTextBarMargin(), 0); + + }); + } + + @Test + public void testBarHeight() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertEquals(convertDpToPixel(ScaleBarOption.BAR_HEIGHT_DEFAULT), scaleBarWidget.getBarHeight(), 0); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setBarHeight(100); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(convertDpToPixel(100), scaleBarWidget.getBarHeight(), 0); + + }); + } + + @Test + public void testTextSize() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertEquals(convertDpToPixel(ScaleBarOption.TEXT_SIZE_DEFAULT), scaleBarWidget.getTextSize(), 0); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setTextSize(100); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(convertDpToPixel(100), scaleBarWidget.getTextSize(), 0); + + }); + } + + @Test + public void testBorderWidth() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertEquals(convertDpToPixel(ScaleBarOption.BORDER_WIDTH_DEFAULT), scaleBarWidget.getBorderWidth(), 0); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setBorderWidth(100); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(convertDpToPixel(100), scaleBarWidget.getBorderWidth(), 0); + + }); + } + + + @Test + public void testRefreshDuration() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertEquals(ScaleBarOption.REFRESH_DURATION_DEFAULT, scaleBarWidget.getRefreshDuration(), 0); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setRefreshDuration(1000); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(1000, scaleBarWidget.getRefreshDuration(), 0); + + }); + } + + @Test + public void testMetrics() { + validateTestSetup(); + setupScaleBar(); + invoke(mapboxMap, (uiController, mapboxMap) -> { + assertEquals(ScaleBarOption.LocaleUnitResolver.isMetricSystem(), scaleBarWidget.isMetricUnit()); + + ScaleBarOption option = new ScaleBarOption(activity); + option.setMetricUnit(true); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertTrue(scaleBarWidget.isMetricUnit()); + + option = new ScaleBarOption(activity); + option.setMetricUnit(false); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertFalse(scaleBarWidget.isMetricUnit()); + }); + } + + + private float convertDpToPixel(float dp) { + return dp * ((float) activity.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); + } } diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 45367a99c..6c48a53fe 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -2,10 +2,11 @@ package com.mapbox.mapboxsdk.plugins.testapp.activity.scalebar import android.os.Bundle import android.support.v7.app.AppCompatActivity -import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.maps.MapboxMap import com.mapbox.mapboxsdk.maps.Style import com.mapbox.mapboxsdk.plugins.testapp.R -import com.mapbox.pluginscalebar.ScaleBar +import com.mapbox.pluginscalebar.ScaleBarManager +import com.mapbox.pluginscalebar.ScaleBarOption import kotlinx.android.synthetic.main.activity_scalebar.* /** @@ -18,15 +19,31 @@ class ScalebarActivity : AppCompatActivity() { mapView.onCreate(savedInstanceState) mapView.getMapAsync { mapboxMap -> mapboxMap.setStyle(Style.MAPBOX_STREETS) { - mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0)) - val scaleBar = ScaleBar(mapView, mapboxMap) - fabScaleWidget.setOnClickListener { - scaleBar.isEnabled = !scaleBar.isEnabled - } + addScalebar(mapboxMap) } } } + private fun addScalebar(mapboxMap: MapboxMap) { + val scaleBarManager = ScaleBarManager(mapView, mapboxMap) + val scaleBarOption = ScaleBarOption(this) + scaleBarOption + .setTextColor(this.resources.getColor(R.color.mapboxRed)) + .setTextSize(8f) + .setBarHeight(5f) + .setBorderWidth(2f) + .setMetricUnit(true) + .setRefreshDuration(100) + .setMarginTop(5f) + .setMarginLeft(6f) + .setTextBarMargin(5f) + + scaleBarManager.create(scaleBarOption) + fabScaleWidget.setOnClickListener { + scaleBarManager.isEnabled = !scaleBarManager.isEnabled + } + } + override fun onStart() { super.onStart() @@ -60,6 +77,6 @@ class ScalebarActivity : AppCompatActivity() { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView?.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java similarity index 69% rename from plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java rename to plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java index e0050bec2..650558bf2 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBar.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java @@ -1,9 +1,7 @@ package com.mapbox.pluginscalebar; -import android.support.annotation.ColorRes; import android.support.annotation.NonNull; import android.support.annotation.UiThread; -import android.support.annotation.VisibleForTesting; import android.view.View; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -14,21 +12,39 @@ /** * Plugin class that shows a scale bar on MapView and changes the scale corresponding to the MapView's scale. */ -public class ScaleBar { +public class ScaleBarManager { private MapboxMap mapboxMap; private Projection projection; private boolean enabled = true; private ScaleBarWidget scaleBarWidget; private CameraMoveListener cameraMoveListener; + private MapView mapView; - public ScaleBar(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { + public ScaleBarManager(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { + this.mapView = mapView; this.mapboxMap = mapboxMap; this.projection = mapboxMap.getProjection(); - this.scaleBarWidget = new ScaleBarWidget(mapView.getContext()); - mapView.addView(scaleBarWidget); + } + + /** + * Create a scale bar widget on mapView. + * + * @param option The scale bar widget options that used to build scale bar widget. + * @return The created ScaleBarWidget instance. + */ + public ScaleBarWidget create(ScaleBarOption option) { + if (scaleBarWidget != null) { + mapView.removeView(scaleBarWidget); + } + scaleBarWidget = option.build(); + scaleBarWidget.setMapViewWidth(mapView.getWidth()); cameraMoveListener = new CameraMoveListener(); mapboxMap.addOnCameraMoveListener(cameraMoveListener); - scaleBarWidget.setMapViewWidth(mapView.getWidth()); + mapView.addView(scaleBarWidget); + CameraPosition cameraPosition = mapboxMap.getCameraPosition(); + double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); + scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); + return scaleBarWidget; } /** @@ -55,7 +71,9 @@ public void setEnabled(boolean enabled) { return; } this.enabled = enabled; - scaleBarWidget.setVisibility(enabled ? View.VISIBLE : View.GONE); + if (scaleBarWidget != null) { + scaleBarWidget.setVisibility(enabled ? View.VISIBLE : View.GONE); + } if (enabled) { mapboxMap.addOnCameraMoveListener(cameraMoveListener); } else { @@ -63,19 +81,7 @@ public void setEnabled(boolean enabled) { } } - - /** - * Set colors for the scale bar. - * - * @param textColor The color for the texts above the scale bar. - * @param primaryColor The color for odd number index bars. - * @param secondaryColor The color for even number index bars. - */ - public void setColors(@ColorRes int textColor, @ColorRes int primaryColor, @ColorRes int secondaryColor) { - scaleBarWidget.setColors(textColor, primaryColor, secondaryColor); - } - - class CameraMoveListener implements MapboxMap.OnCameraMoveListener { + private class CameraMoveListener implements MapboxMap.OnCameraMoveListener { @Override public void onCameraMove() { CameraPosition cameraPosition = mapboxMap.getCameraPosition(); @@ -83,9 +89,4 @@ public void onCameraMove() { scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); } } - - @VisibleForTesting - public ScaleBarWidget getScaleBarWidget() { - return scaleBarWidget; - } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java new file mode 100644 index 000000000..734cd89e3 --- /dev/null +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java @@ -0,0 +1,248 @@ +package com.mapbox.pluginscalebar; + +import android.content.Context; +import android.support.annotation.ColorInt; +import android.support.annotation.VisibleForTesting; +import android.util.DisplayMetrics; + +import java.util.Locale; + +/** + * Builder class from which a scale bar is created. + */ +public class ScaleBarOption { + public static final int REFRESH_DURATION_DEFAULT = 100; + public static final int BAR_HEIGHT_DEFAULT = 4; + public static final int BORDER_WIDTH_DEFAULT = 1; + public static final int TEXT_SIZE_DEFAULT = 6; + public static final int MARGIN_TOP_DEFAULT = 8; + public static final int MARGIN_LEFT_DEFAULT = 10; + public static final int TEXT_BAR_MARGIN_DEFAULT = 2; + private final Context context; + private int refreshDuration; + private int textColor; + private int primaryColor; + private int secondaryColor; + private float marginTop; + private float marginLeft; + private float textBarMargin; + private float barHeight; + private float borderWidth; + private float textSize; + private boolean isMetricUnit; + + public ScaleBarOption(Context context) { + this.context = context; + refreshDuration = REFRESH_DURATION_DEFAULT; + setBarHeight(BAR_HEIGHT_DEFAULT); + setBorderWidth(BORDER_WIDTH_DEFAULT); + setTextSize(TEXT_SIZE_DEFAULT); + setMarginTop(MARGIN_TOP_DEFAULT); + setMarginLeft(MARGIN_LEFT_DEFAULT); + setTextBarMargin(TEXT_BAR_MARGIN_DEFAULT); + isMetricUnit = LocaleUnitResolver.isMetricSystem(); + textColor = context.getResources().getColor(android.R.color.black); + primaryColor = context.getResources().getColor(android.R.color.black); + secondaryColor = context.getResources().getColor(android.R.color.white); + } + + /** + * Build a scale bar widget instance with current option settings. + * + * @return The built ScaleBarWidget instance. + */ + ScaleBarWidget build() { + ScaleBarWidget scaleBarWidget = new ScaleBarWidget(context); + scaleBarWidget.setBarHeight(barHeight); + scaleBarWidget.setBorderWidth(borderWidth); + scaleBarWidget.setMarginLeft(marginLeft); + scaleBarWidget.setMarginTop(marginTop); + scaleBarWidget.setTextBarMargin(textBarMargin); + scaleBarWidget.setMetricUnit(isMetricUnit); + scaleBarWidget.setRefreshDuration(refreshDuration); + scaleBarWidget.setPrimaryColor(primaryColor); + scaleBarWidget.setSecondaryColor(secondaryColor); + scaleBarWidget.setTextColor(textColor); + scaleBarWidget.setTextSize(textSize); + return scaleBarWidget; + } + + /** + * Set the duration between two adjacent refreshment, + * default value is {@link #REFRESH_DURATION_DEFAULT}. + * + * @param refreshDuration the refresh duration, in millisecond. + * @return this + */ + public ScaleBarOption setRefreshDuration(int refreshDuration) { + this.refreshDuration = refreshDuration; + return this; + } + + /** + * Set the text color on scale bar, + * default value is android.R.color.black. + * + * @param textColor the text color on scale bar. + * @return this. + */ + public ScaleBarOption setTextColor(@ColorInt int textColor) { + this.textColor = textColor; + return this; + } + + /** + * Set the primary color of the scale bar, will be used to draw odd index blocks, + * default value is android.R.color.black. + * + * @param primaryColor the primary color of the scale bar. + * @return this. + */ + public ScaleBarOption setPrimaryColor(@ColorInt int primaryColor) { + this.primaryColor = primaryColor; + return this; + } + + /** + * Set the secondary color of the scale bar, will be used to draw even index blocks, + * default value is android.R.color.white. + * + * @param secondaryColor the secondaryColor color of the scale bar. + * @return this. + */ + public ScaleBarOption setSecondaryColor(@ColorInt int secondaryColor) { + this.secondaryColor = secondaryColor; + return this; + } + + /** + * Set the margin between scale bar and the top of mapView, + * default value is {@link #MARGIN_TOP_DEFAULT}. + * + * @param marginTop the margin between scale bar and the top of mapView, in dp. + * @return this. + */ + public ScaleBarOption setMarginTop(float marginTop) { + this.marginTop = convertDpToPixel(marginTop); + return this; + } + + /** + * Set the height for blocks in scale bar, default value is {@link #BAR_HEIGHT_DEFAULT}. + * + * @param barHeight the height for blocks in scale bar, in dp. + * @return this. + */ + public ScaleBarOption setBarHeight(float barHeight) { + this.barHeight = convertDpToPixel(barHeight); + return this; + } + + /** + * Set the border width in scale bar, default value is {@link #BORDER_WIDTH_DEFAULT}. + * + * @param borderWidth the border width in scale bar, in dp. + * @return this. + */ + public ScaleBarOption setBorderWidth(float borderWidth) { + this.borderWidth = convertDpToPixel(borderWidth); + return this; + } + + /** + * Set the text size of scale bar, default size is {@link #TEXT_SIZE_DEFAULT}. + * + * @param textSize the text size of scale bar, in dp. + * @return this. + */ + public ScaleBarOption setTextSize(float textSize) { + this.textSize = convertDpToPixel(textSize); + return this; + } + + /** + * Set whether to use metric unit or not. The default value is depends on settings of device. + * + * @param metricUnit whether to use metric unit or not. + * @return this. + */ + public ScaleBarOption setMetricUnit(boolean metricUnit) { + isMetricUnit = metricUnit; + return this; + } + + /** + * Set the left margin between scale bar and mapView, + * default value is {@link #MARGIN_LEFT_DEFAULT}. + * + * @param marginLeft the left margin between scale bar and mapView, in dp. + * @return this. + */ + public ScaleBarOption setMarginLeft(float marginLeft) { + this.marginLeft = convertDpToPixel(marginLeft); + return this; + } + + /** + * Set the margin between text and blocks inside scale bar, + * default value is {@link #TEXT_BAR_MARGIN_DEFAULT}. + * + * @param textBarMargin the margin between text and blocks inside scale bar, in dp. + * @return this. + */ + public ScaleBarOption setTextBarMargin(float textBarMargin) { + this.textBarMargin = convertDpToPixel(textBarMargin); + return this; + } + + /** + * This method converts dp unit to equivalent pixels, depending on device density. + * + * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels + * @return A float value to represent px equivalent to dp depending on device density + */ + private float convertDpToPixel(float dp) { + return dp * ((float) context.getResources() + .getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); + } + + /** + * Helper class to determine the user measuring system. + *

+ * Currently supports differentiating between metric vs imperial system. + *

+ *

+ * Depends on {@link Locale#getDefault()} which returns the locale used at application startup. + *

+ */ + @VisibleForTesting + public static class LocaleUnitResolver { + + /** + * Returns true if the user is in a country using the metric system. + * + * @return true if user country is using metric, false if imperial + */ + public static boolean isMetricSystem() { + String countryCode = Locale.getDefault().getCountry().toUpperCase(); + switch (countryCode) { + case ImperialCountryCode.US: + case ImperialCountryCode.LIBERIA: + case ImperialCountryCode.MYANMAR: + return false; + default: + return true; + } + } + + /** + * Data class containing uppercase country codes for countries using the imperial system. + */ + static class ImperialCountryCode { + static final String US = "US"; + static final String MYANMAR = "MM"; + static final String LIBERIA = "LR"; + } + } + +} diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 89ad9a6bf..069d818c1 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -5,50 +5,43 @@ import android.graphics.Paint; import android.os.Handler; import android.os.Message; -import android.support.annotation.ColorRes; -import android.support.annotation.VisibleForTesting; +import android.support.annotation.ColorInt; import android.util.Pair; import android.view.View; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Locale; /** * The scale widget is a visual representation of the scale bar plugin. */ -@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) public class ScaleBarWidget extends View { private static int MSG_WHAT = 0; - private static int REFRESH_DURATION = 300; + private final Paint textPaint = new Paint(); + private final Paint barPaint = new Paint(); + private int refreshDuration; private int textColor; private int primaryColor; private int secondaryColor; private int mapViewWidth; - private int margin; - private int maxBarWidth; + private float marginLeft; + private float marginTop; + private float textBarMargin; + private float maxBarWidth; + private float barHeight; + private float borderWidth; + private float textSize; private double distancePerPixel; - private final Paint textPaint = new Paint(); - private final Paint barPaint = new Paint(); - private boolean isMetricSystem; + private boolean isMetricUnit; private ArrayList> scaleTable; private String unit; private RefreshHandler refreshHandler; - private Context context; - public ScaleBarWidget(Context context) { + ScaleBarWidget(Context context) { super(context); - this.context = context; textPaint.setAntiAlias(true); - textPaint.setTextSize(20); textPaint.setTextAlign(Paint.Align.CENTER); barPaint.setAntiAlias(true); - textColor = context.getResources().getColor(android.R.color.black); - primaryColor = context.getResources().getColor(android.R.color.black); - secondaryColor = context.getResources().getColor(android.R.color.white); - isMetricSystem = LocaleUnitResolver.isMetricSystem(); - scaleTable = isMetricSystem ? ScaleBarConstants.metricTable : ScaleBarConstants.imperialTable; - unit = isMetricSystem ? ScaleBarConstants.METER_UNIT : ScaleBarConstants.FEET_UNIT; refreshHandler = new RefreshHandler(this); } @@ -57,7 +50,6 @@ protected void onDraw(Canvas canvas) { if (distancePerPixel <= 0) { return; } - textPaint.setColor(textColor); double maxDistance = mapViewWidth * distancePerPixel / 2; Pair pair = scaleTable.get(0); for (int i = 1; i < scaleTable.size(); i++) { @@ -79,13 +71,18 @@ protected void onDraw(Canvas canvas) { //Drawing the surrounding borders barPaint.setStyle(Paint.Style.FILL_AND_STROKE); barPaint.setColor(secondaryColor); - int barHeight = 10; - int borderWidth = 2; - canvas.drawRect(margin - borderWidth * 2, margin - borderWidth * 2, - margin + unitBarWidth * pair.second + borderWidth * 2, margin + barHeight + borderWidth * 2, barPaint); + + canvas.drawRect(marginLeft - borderWidth * 2, + textBarMargin + textSize + marginTop - borderWidth * 2, + marginLeft + unitBarWidth * pair.second + borderWidth * 2, + textBarMargin + textSize + marginTop + barHeight + borderWidth * 2, + barPaint); barPaint.setColor(primaryColor); - canvas.drawRect(margin - borderWidth, margin - borderWidth, - margin + unitBarWidth * pair.second + borderWidth, margin + barHeight + borderWidth, barPaint); + canvas.drawRect(marginLeft - borderWidth, + textBarMargin + textSize + marginTop - borderWidth, + marginLeft + unitBarWidth * pair.second + borderWidth, + textBarMargin + textSize + marginTop + barHeight + borderWidth, + barPaint); //Drawing the fill barPaint.setStyle(Paint.Style.FILL); @@ -93,12 +90,20 @@ protected void onDraw(Canvas canvas) { for (; i < pair.second; i++) { barPaint.setColor(i % 2 == 0 ? primaryColor : secondaryColor); String text = i == 0 ? String.valueOf(unitDistance * i) : unitDistance * i + unit; - canvas.drawText(text, margin + unitBarWidth * i, margin - barHeight, textPaint); - canvas.drawRect(margin + unitBarWidth * i, margin, margin + unitBarWidth * (1 + i), - margin + barHeight, barPaint); + canvas.drawText(text, + marginLeft + unitBarWidth * i, + textSize + marginTop, + textPaint); + canvas.drawRect(marginLeft + unitBarWidth * i, + textBarMargin + textSize + marginTop, + marginLeft + unitBarWidth * (1 + i), + textBarMargin + textSize + marginTop + barHeight, + barPaint); } - canvas.drawText(unitDistance * i + unit, margin + unitBarWidth * i, margin - barHeight, textPaint); - + canvas.drawText(unitDistance * i + unit, + marginLeft + unitBarWidth * i, + textSize + marginTop, + textPaint); } /** @@ -107,56 +112,234 @@ protected void onDraw(Canvas canvas) { * @param metersPerPixel how many meters in each pixel. */ void setDistancePerPixel(double metersPerPixel) { - this.distancePerPixel = isMetricSystem ? metersPerPixel : metersPerPixel * ScaleBarConstants.FEET_PER_METER; + this.distancePerPixel = isMetricUnit ? metersPerPixel : metersPerPixel * ScaleBarConstants.FEET_PER_METER; if (!refreshHandler.hasMessages(MSG_WHAT)) { - refreshHandler.sendEmptyMessageDelayed(MSG_WHAT, REFRESH_DURATION); + refreshHandler.sendEmptyMessageDelayed(MSG_WHAT, refreshDuration); } } /** - * Set the width of current mapView. + * Get the current setting for refresh duration, in millisecond. * - * @param mapViewWidth mapView's wdith. + * @return refresh duration */ - void setMapViewWidth(int mapViewWidth) { - this.mapViewWidth = mapViewWidth; - margin = mapViewWidth / 20; - maxBarWidth = mapViewWidth / 2 - margin; + public int getRefreshDuration() { + return refreshDuration; + } + + /** + * Set the duration between two adjacent refreshment, in millisecond. + * + * @param refreshDuration the refresh duration. + */ + public void setRefreshDuration(int refreshDuration) { + this.refreshDuration = refreshDuration; + } + + /** + * Get the margin between text and blocks. + * + * @return margin between text and blocks, in pixel. + */ + public float getTextBarMargin() { + return textBarMargin; + } + + /** + * Set the margin between text and blocks inside scale bar. + * + * @param textBarMargin the margin between text and blocks inside scale bar, in pixel. + */ + public void setTextBarMargin(float textBarMargin) { + this.textBarMargin = textBarMargin; + } + + /** + * Get the left margin between scale bar and mapView. + * + * @return the left margin between scale bar and mapView, in pixel + */ + public float getMarginLeft() { + return marginLeft; + } + + /** + * Set the left margin between scale bar and mapView. + * + * @param marginLeft the left margin between scale bar and mapView, in pixel. + */ + public void setMarginLeft(float marginLeft) { + this.marginLeft = marginLeft; + maxBarWidth = mapViewWidth / 2f - marginLeft; + } + + /** + * Get the bar height for blocks. + * + * @return the height for blocks in scale bar, in pixel. + */ + public float getBarHeight() { + return barHeight; + } + + /** + * Set the height for blocks in scale bar. + * + * @param barHeight the height for blocks in scale bar, in pixel. + */ + public void setBarHeight(float barHeight) { + this.barHeight = barHeight; + } + + /** + * Get the margin between scale bar and the top of mapView, + * + * @return the margin between scale bar and the top of mapView, in pixel. + */ + public float getMarginTop() { + return marginTop; + } + + /** + * Set the margin between scale bar and the top of mapView。 + * + * @param marginTop the margin between scale bar and the top of mapView, in pixel. + */ + public void setMarginTop(float marginTop) { + this.marginTop = marginTop; + } + + /** + * Get the border width in scale bar. + * + * @return the border width in scale bar, in pixel + */ + public float getBorderWidth() { + return borderWidth; + } + + /** + * Set the border width in scale bar. + * + * @param borderWidth the border width in scale bar, in pixel. + */ + public void setBorderWidth(float borderWidth) { + this.borderWidth = borderWidth; + } + + /** + * Get the text size of scale bar. + * + * @return the text size of scale bar, in pixel. + */ + public float getTextSize() { + return textSize; + } + + /** + * Set the text size of scale bar. + * + * @param textSize the text size of scale bar, in pixel. + */ + public void setTextSize(float textSize) { + this.textSize = textSize; + textPaint.setTextSize(textSize); } /** - * Set colors for the scale bar. + * Get the current setting for metrix unit. * - * @param textColor The color for the texts above scale bar. - * @param primaryColor The color for odd number index bars. - * @param secondaryColor The color for even number index bars. + * @return true if using metrix unit, otherwise false. */ - void setColors(@ColorRes int textColor, @ColorRes int primaryColor, @ColorRes int secondaryColor) { - this.textColor = context.getResources().getColor(textColor); - this.primaryColor = context.getResources().getColor(primaryColor); - this.secondaryColor = context.getResources().getColor(secondaryColor); + public boolean isMetricUnit() { + return isMetricUnit; } - @VisibleForTesting + /** + * Set whether to use metric unit or not. + * + * @param metricUnit whether to use metric unit or not. + */ + public void setMetricUnit(boolean metricUnit) { + isMetricUnit = metricUnit; + scaleTable = isMetricUnit ? ScaleBarConstants.metricTable : ScaleBarConstants.imperialTable; + unit = isMetricUnit ? ScaleBarConstants.METER_UNIT : ScaleBarConstants.FEET_UNIT; + } + + /** + * Get the color for text. + * + * @return the color for text. + */ public int getTextColor() { return textColor; } - @VisibleForTesting + /** + * Set the text color on scale bar, + * + * @param textColor the text color on scale bar. + */ + public void setTextColor(@ColorInt int textColor) { + this.textColor = textColor; + textPaint.setColor(textColor); + } + + /** + * Get the primary color of the scale bar. + * + * @return the primary color of the scale bar. + */ public int getPrimaryColor() { return primaryColor; } - @VisibleForTesting + /** + * Set the primary color of the scale bar, will be used to draw odd index blocks, + * + * @param primaryColor the primary color of the scale bar, in pixel. + */ + public void setPrimaryColor(@ColorInt int primaryColor) { + this.primaryColor = primaryColor; + } + + /** + * Get the secondary color of the scale bar. + * + * @return the secondary color of the scale bar. + */ public int getSecondaryColor() { return secondaryColor; } - @VisibleForTesting + /** + * Set the secondary color of the scale bar, will be used to draw even index blocks, + * + * @param secondaryColor the secondaryColor color of the scale bar, in pixel. + */ + public void setSecondaryColor(@ColorInt int secondaryColor) { + this.secondaryColor = secondaryColor; + } + + /** + * Get the width of current mapView. + * + * @return the width of current mapView. + */ public int getMapViewWidth() { return mapViewWidth; } + /** + * Set the width of current mapView. + * + * @param mapViewWidth mapView's width in pixel. + */ + void setMapViewWidth(int mapViewWidth) { + this.mapViewWidth = mapViewWidth; + maxBarWidth = mapViewWidth / 2f - marginLeft; + } + /** * Handler class to limit the refresh frequent. */ @@ -175,41 +358,4 @@ public void handleMessage(Message msg) { } } - /** - * Helper class to determine the user measuring system. - *

- * Currently supports differentiating between metric vs imperial system. - *

- *

- * Depends on {@link Locale#getDefault()} which returns the locale used at application startup. - *

- */ - private static class LocaleUnitResolver { - - /** - * Returns true if the user is in a country using the metric system. - * - * @return true if user country is using metric, false if imperial - */ - static boolean isMetricSystem() { - String countryCode = Locale.getDefault().getCountry().toUpperCase(); - switch (countryCode) { - case ImperialCountryCode.US: - case ImperialCountryCode.LIBERIA: - case ImperialCountryCode.MYANMAR: - return false; - default: - return true; - } - } - - /** - * Data class containing uppercase country codes for countries using the imperial system. - */ - static class ImperialCountryCode { - static final String US = "US"; - static final String MYANMAR = "MM"; - static final String LIBERIA = "LR"; - } - } } diff --git a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java b/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java deleted file mode 100644 index d54e351b3..000000000 --- a/plugin-scalebar/src/test/java/com/mapbox/pluginscalebar/ScalebarTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.mapbox.pluginscalebar; - -import android.content.Context; -import android.content.res.Resources; -import android.view.View; - -import com.mapbox.mapboxsdk.maps.MapView; -import com.mapbox.mapboxsdk.maps.MapboxMap; -import com.mapbox.mapboxsdk.maps.Projection; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class ScalebarTest { - private static int MAPVIEW_WIDTH = 1080; - private ScaleBar scaleBar; - private ScaleBarWidget scaleBarWidget; - - @Before - public void setUp() { - Context context = mock(Context.class); - Resources resources = mock(Resources.class); - when(context.getResources()).thenReturn(resources); - when(resources.getColor(android.R.color.black)).thenReturn(0xff000000); - when(resources.getColor(android.R.color.white)).thenReturn(0xffffffff); - when(resources.getColor(0xff000000)).thenReturn(0xff000000); - when(resources.getColor(0xff000001)).thenReturn(0xff000001); - when(resources.getColor(0xff000002)).thenReturn(0xff000002); - MapView mapView = mock(MapView.class); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - scaleBarWidget = (ScaleBarWidget) invocation.getArguments()[0]; - return null; - } - }).when(mapView).addView(any(View.class)); - when(mapView.getContext()).thenReturn(context); - when(mapView.getWidth()).thenReturn(MAPVIEW_WIDTH); - MapboxMap mapboxMap = mock(MapboxMap.class); - Projection projection = mock(Projection.class); - when(mapboxMap.getProjection()).thenReturn(projection); - scaleBar = new ScaleBar(mapView, mapboxMap); - assertNotNull(scaleBar); - assertNotNull(scaleBarWidget); - } - - @Test - public void testEnable() { - assertTrue(scaleBar.isEnabled()); - scaleBar.setEnabled(false); - assertFalse(scaleBar.isEnabled()); - } - - @Test - public void testVariables() { - assertEquals(MAPVIEW_WIDTH, scaleBarWidget.getMapViewWidth()); - assertEquals(0xff000000, scaleBarWidget.getTextColor()); - assertEquals(0xff000000, scaleBarWidget.getPrimaryColor()); - assertEquals(0xffffffff, scaleBarWidget.getSecondaryColor()); - - scaleBar.setColors(0xff000000, 0xff000001, 0xff000002); - assertEquals(0xff000000, scaleBarWidget.getTextColor()); - assertEquals(0xff000001, scaleBarWidget.getPrimaryColor()); - assertEquals(0xff000002, scaleBarWidget.getSecondaryColor()); - } -} From 126b513966f07e6951605ffb4fae1c173db0583e Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 28 May 2019 11:09:44 +0800 Subject: [PATCH 14/19] Add interface for dimen parameters. --- .../plugins/scalebar/ScaleBarTest.java | 96 ++++++++--- .../activity/scalebar/ScalebarActivity.kt | 16 +- .../pluginscalebar/ScaleBarManager.java | 25 ++- .../mapbox/pluginscalebar/ScaleBarOption.java | 163 ++++++++++++------ .../mapbox/pluginscalebar/ScaleBarWidget.java | 20 +-- .../src/main/res/values/dimens.xml | 9 + 6 files changed, 218 insertions(+), 111 deletions(-) create mode 100644 plugin-scalebar/src/main/res/values/dimens.xml diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index 152f635a2..cfa1711ba 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -73,9 +73,9 @@ public void testScaleBarColor() { assertEquals(activity.getResources().getColor(android.R.color.white), scaleBarWidget.getSecondaryColor()); - int textColor = activity.getResources().getColor(R.color.colorAccent); - int colorPrimary = activity.getResources().getColor(R.color.colorPrimary); - int colorSecondary = activity.getResources().getColor(R.color.colorPrimaryDark); + int textColor = R.color.colorAccent; + int colorPrimary = R.color.colorPrimary; + int colorSecondary = R.color.colorPrimaryDark; ScaleBarOption option = new ScaleBarOption(activity); option.setTextColor(textColor); @@ -83,9 +83,9 @@ public void testScaleBarColor() { option.setSecondaryColor(colorSecondary); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(textColor, scaleBarWidget.getTextColor()); - assertEquals(colorPrimary, scaleBarWidget.getPrimaryColor()); - assertEquals(colorSecondary, scaleBarWidget.getSecondaryColor()); + assertEquals(activity.getResources().getColor(textColor), scaleBarWidget.getTextColor()); + assertEquals(activity.getResources().getColor(colorPrimary), scaleBarWidget.getPrimaryColor()); + assertEquals(activity.getResources().getColor(colorSecondary), scaleBarWidget.getSecondaryColor()); }); } @@ -105,19 +105,35 @@ public void testMargin() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(ScaleBarOption.MARGIN_LEFT_DEFAULT), scaleBarWidget.getMarginLeft(), 0); - assertEquals(convertDpToPixel(ScaleBarOption.MARGIN_TOP_DEFAULT), scaleBarWidget.getMarginTop(), 0); - assertEquals(convertDpToPixel(ScaleBarOption.TEXT_BAR_MARGIN_DEFAULT), scaleBarWidget.getTextBarMargin(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_margin_left)), + scaleBarWidget.getMarginLeft(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_margin_top)), + scaleBarWidget.getMarginTop(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_margin)), + scaleBarWidget.getTextBarMargin(), 0); ScaleBarOption option = new ScaleBarOption(activity); - option.setMarginLeft(100); - option.setMarginTop(50); - option.setTextBarMargin(30); + option.setMarginLeft(R.dimen.fab_margin); + option.setMarginTop(R.dimen.fab_margin); + option.setTextBarMargin(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(100), scaleBarWidget.getMarginLeft(), 0); - assertEquals(convertDpToPixel(50), scaleBarWidget.getMarginTop(), 0); - assertEquals(convertDpToPixel(30), scaleBarWidget.getTextBarMargin(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + scaleBarWidget.getMarginLeft(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + scaleBarWidget.getMarginTop(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + scaleBarWidget.getTextBarMargin(), 0); + + option = new ScaleBarOption(activity); + option.setMarginLeft(100f); + option.setMarginTop(50f); + option.setTextBarMargin(30f); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(100f, scaleBarWidget.getMarginLeft(), 0); + assertEquals(50f, scaleBarWidget.getMarginTop(), 0); + assertEquals(30f, scaleBarWidget.getTextBarMargin(), 0); }); } @@ -127,13 +143,21 @@ public void testBarHeight() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(ScaleBarOption.BAR_HEIGHT_DEFAULT), scaleBarWidget.getBarHeight(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_height)), + scaleBarWidget.getBarHeight(), 0); ScaleBarOption option = new ScaleBarOption(activity); - option.setBarHeight(100); + option.setBarHeight(R.dimen.fab_margin); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + scaleBarWidget.getBarHeight(), 0); + + option = new ScaleBarOption(activity); + option.setBarHeight(100f); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(100), scaleBarWidget.getBarHeight(), 0); + assertEquals(100f, scaleBarWidget.getBarHeight(), 0); }); } @@ -143,13 +167,21 @@ public void testTextSize() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(ScaleBarOption.TEXT_SIZE_DEFAULT), scaleBarWidget.getTextSize(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_size)), + scaleBarWidget.getTextSize(), 0); ScaleBarOption option = new ScaleBarOption(activity); - option.setTextSize(100); + option.setTextSize(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(100), scaleBarWidget.getTextSize(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + scaleBarWidget.getTextSize(), 0); + + option = new ScaleBarOption(activity); + option.setTextSize(100f); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(100f, scaleBarWidget.getTextSize(), 0); }); } @@ -159,30 +191,38 @@ public void testBorderWidth() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(ScaleBarOption.BORDER_WIDTH_DEFAULT), scaleBarWidget.getBorderWidth(), 0); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_border_width)), + scaleBarWidget.getBorderWidth(), 0); ScaleBarOption option = new ScaleBarOption(activity); - option.setBorderWidth(100); + option.setBorderWidth(R.dimen.fab_margin); + scaleBarWidget = scaleBarManager.create(option); + assertNotNull(scaleBarWidget); + assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + scaleBarWidget.getBorderWidth(), 0); + + option = new ScaleBarOption(activity); + option.setBorderWidth(100f); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(100), scaleBarWidget.getBorderWidth(), 0); + assertEquals(100f, scaleBarWidget.getBorderWidth(), 0); }); } @Test - public void testRefreshDuration() { + public void testRefreshInterval() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(ScaleBarOption.REFRESH_DURATION_DEFAULT, scaleBarWidget.getRefreshDuration(), 0); + assertEquals(ScaleBarOption.REFRESH_INTERVAL_DEFAULT, scaleBarWidget.getRefreshInterval(), 0); ScaleBarOption option = new ScaleBarOption(activity); - option.setRefreshDuration(1000); + option.setRefreshInterval(1000); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(1000, scaleBarWidget.getRefreshDuration(), 0); + assertEquals(1000, scaleBarWidget.getRefreshInterval(), 0); }); } diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 6c48a53fe..ff448f25c 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -28,15 +28,15 @@ class ScalebarActivity : AppCompatActivity() { val scaleBarManager = ScaleBarManager(mapView, mapboxMap) val scaleBarOption = ScaleBarOption(this) scaleBarOption - .setTextColor(this.resources.getColor(R.color.mapboxRed)) - .setTextSize(8f) - .setBarHeight(5f) - .setBorderWidth(2f) + .setTextColor(R.color.mapboxRed) + .setTextSize(20f) + .setBarHeight(15f) + .setBorderWidth(5f) .setMetricUnit(true) - .setRefreshDuration(100) - .setMarginTop(5f) - .setMarginLeft(6f) - .setTextBarMargin(5f) + .setRefreshInterval(15) + .setMarginTop(15f) + .setMarginLeft(16f) + .setTextBarMargin(15f) scaleBarManager.create(scaleBarOption) fabScaleWidget.setOnClickListener { diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java index 650558bf2..916c5cc98 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java @@ -13,12 +13,20 @@ * Plugin class that shows a scale bar on MapView and changes the scale corresponding to the MapView's scale. */ public class ScaleBarManager { - private MapboxMap mapboxMap; - private Projection projection; + private final MapView mapView; + private final MapboxMap mapboxMap; + private final Projection projection; private boolean enabled = true; private ScaleBarWidget scaleBarWidget; - private CameraMoveListener cameraMoveListener; - private MapView mapView; + + private final MapboxMap.OnCameraMoveListener cameraMoveListener = new MapboxMap.OnCameraMoveListener() { + @Override + public void onCameraMove() { + CameraPosition cameraPosition = mapboxMap.getCameraPosition(); + double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); + scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); + } + }; public ScaleBarManager(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { this.mapView = mapView; @@ -38,7 +46,6 @@ public ScaleBarWidget create(ScaleBarOption option) { } scaleBarWidget = option.build(); scaleBarWidget.setMapViewWidth(mapView.getWidth()); - cameraMoveListener = new CameraMoveListener(); mapboxMap.addOnCameraMoveListener(cameraMoveListener); mapView.addView(scaleBarWidget); CameraPosition cameraPosition = mapboxMap.getCameraPosition(); @@ -81,12 +88,4 @@ public void setEnabled(boolean enabled) { } } - private class CameraMoveListener implements MapboxMap.OnCameraMoveListener { - @Override - public void onCameraMove() { - CameraPosition cameraPosition = mapboxMap.getCameraPosition(); - double metersPerPixel = projection.getMetersPerPixelAtLatitude(cameraPosition.target.getLatitude()); - scaleBarWidget.setDistancePerPixel(projection.getMetersPerPixelAtLatitude(metersPerPixel)); - } - } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java index 734cd89e3..99a743075 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java @@ -1,7 +1,8 @@ package com.mapbox.pluginscalebar; import android.content.Context; -import android.support.annotation.ColorInt; +import android.support.annotation.ColorRes; +import android.support.annotation.DimenRes; import android.support.annotation.VisibleForTesting; import android.util.DisplayMetrics; @@ -11,15 +12,10 @@ * Builder class from which a scale bar is created. */ public class ScaleBarOption { - public static final int REFRESH_DURATION_DEFAULT = 100; - public static final int BAR_HEIGHT_DEFAULT = 4; - public static final int BORDER_WIDTH_DEFAULT = 1; - public static final int TEXT_SIZE_DEFAULT = 6; - public static final int MARGIN_TOP_DEFAULT = 8; - public static final int MARGIN_LEFT_DEFAULT = 10; - public static final int TEXT_BAR_MARGIN_DEFAULT = 2; + public static final int REFRESH_INTERVAL_DEFAULT = 15; + private final Context context; - private int refreshDuration; + private int refreshInterval; private int textColor; private int primaryColor; private int secondaryColor; @@ -33,17 +29,17 @@ public class ScaleBarOption { public ScaleBarOption(Context context) { this.context = context; - refreshDuration = REFRESH_DURATION_DEFAULT; - setBarHeight(BAR_HEIGHT_DEFAULT); - setBorderWidth(BORDER_WIDTH_DEFAULT); - setTextSize(TEXT_SIZE_DEFAULT); - setMarginTop(MARGIN_TOP_DEFAULT); - setMarginLeft(MARGIN_LEFT_DEFAULT); - setTextBarMargin(TEXT_BAR_MARGIN_DEFAULT); + refreshInterval = REFRESH_INTERVAL_DEFAULT; + setBarHeight(R.dimen.mapbox_scale_bar_height); + setBorderWidth(R.dimen.mapbox_scale_bar_border_width); + setTextSize(R.dimen.mapbox_scale_bar_text_size); + setMarginTop(R.dimen.mapbox_scale_bar_margin_top); + setMarginLeft(R.dimen.mapbox_scale_bar_margin_left); + setTextBarMargin(R.dimen.mapbox_scale_bar_text_margin); isMetricUnit = LocaleUnitResolver.isMetricSystem(); - textColor = context.getResources().getColor(android.R.color.black); - primaryColor = context.getResources().getColor(android.R.color.black); - secondaryColor = context.getResources().getColor(android.R.color.white); + setTextColor(android.R.color.black); + setPrimaryColor(android.R.color.black); + setSecondaryColor(android.R.color.white); } /** @@ -59,7 +55,7 @@ ScaleBarWidget build() { scaleBarWidget.setMarginTop(marginTop); scaleBarWidget.setTextBarMargin(textBarMargin); scaleBarWidget.setMetricUnit(isMetricUnit); - scaleBarWidget.setRefreshDuration(refreshDuration); + scaleBarWidget.setRefreshInterval(refreshInterval); scaleBarWidget.setPrimaryColor(primaryColor); scaleBarWidget.setSecondaryColor(secondaryColor); scaleBarWidget.setTextColor(textColor); @@ -68,14 +64,14 @@ ScaleBarWidget build() { } /** - * Set the duration between two adjacent refreshment, - * default value is {@link #REFRESH_DURATION_DEFAULT}. + * Set plugin's minimum refresh interval, + * default value is {@link #REFRESH_INTERVAL_DEFAULT}. * - * @param refreshDuration the refresh duration, in millisecond. + * @param refreshInterval the min refresh interval, in millisecond. * @return this */ - public ScaleBarOption setRefreshDuration(int refreshDuration) { - this.refreshDuration = refreshDuration; + public ScaleBarOption setRefreshInterval(int refreshInterval) { + this.refreshInterval = refreshInterval; return this; } @@ -86,8 +82,8 @@ public ScaleBarOption setRefreshDuration(int refreshDuration) { * @param textColor the text color on scale bar. * @return this. */ - public ScaleBarOption setTextColor(@ColorInt int textColor) { - this.textColor = textColor; + public ScaleBarOption setTextColor(@ColorRes int textColor) { + this.textColor = context.getResources().getColor(textColor); return this; } @@ -98,8 +94,8 @@ public ScaleBarOption setTextColor(@ColorInt int textColor) { * @param primaryColor the primary color of the scale bar. * @return this. */ - public ScaleBarOption setPrimaryColor(@ColorInt int primaryColor) { - this.primaryColor = primaryColor; + public ScaleBarOption setPrimaryColor(@ColorRes int primaryColor) { + this.primaryColor = context.getResources().getColor(primaryColor); return this; } @@ -110,53 +106,96 @@ public ScaleBarOption setPrimaryColor(@ColorInt int primaryColor) { * @param secondaryColor the secondaryColor color of the scale bar. * @return this. */ - public ScaleBarOption setSecondaryColor(@ColorInt int secondaryColor) { - this.secondaryColor = secondaryColor; + public ScaleBarOption setSecondaryColor(@ColorRes int secondaryColor) { + this.secondaryColor = context.getResources().getColor(secondaryColor); return this; } /** - * Set the margin between scale bar and the top of mapView, - * default value is {@link #MARGIN_TOP_DEFAULT}. + * Set the margin between scale bar and the top of mapView. * - * @param marginTop the margin between scale bar and the top of mapView, in dp. + * @param marginTop the margin between scale bar and the top of mapView, in pixel. * @return this. */ public ScaleBarOption setMarginTop(float marginTop) { - this.marginTop = convertDpToPixel(marginTop); + this.marginTop = marginTop; return this; } /** - * Set the height for blocks in scale bar, default value is {@link #BAR_HEIGHT_DEFAULT}. + * Set the margin between scale bar and the top of mapView. * - * @param barHeight the height for blocks in scale bar, in dp. + * @param marginTop the margin between scale bar and the top of mapView, in dp. + * @return this. + */ + public ScaleBarOption setMarginTop(@DimenRes int marginTop) { + this.marginTop = convertDpToPixel(context.getResources().getDimension(marginTop)); + return this; + } + + /** + * Set the height for blocks in scale bar. + * + * @param barHeight the height for blocks in scale bar, in pixel. * @return this. */ public ScaleBarOption setBarHeight(float barHeight) { - this.barHeight = convertDpToPixel(barHeight); + this.barHeight = barHeight; return this; } /** - * Set the border width in scale bar, default value is {@link #BORDER_WIDTH_DEFAULT}. + * Set the height for blocks in scale bar. * - * @param borderWidth the border width in scale bar, in dp. + * @param barHeight the height for blocks in scale bar, in dp. + * @return this. + */ + public ScaleBarOption setBarHeight(@DimenRes int barHeight) { + this.barHeight = convertDpToPixel(context.getResources().getDimension(barHeight)); + return this; + } + + /** + * Set the border width in scale bar. + * + * @param borderWidth the border width in scale bar, in pixel. * @return this. */ public ScaleBarOption setBorderWidth(float borderWidth) { - this.borderWidth = convertDpToPixel(borderWidth); + this.borderWidth = borderWidth; return this; } /** - * Set the text size of scale bar, default size is {@link #TEXT_SIZE_DEFAULT}. + * Set the border width in scale bar. * - * @param textSize the text size of scale bar, in dp. + * @param borderWidth the border width in scale bar, in dp. + * @return this. + */ + public ScaleBarOption setBorderWidth(@DimenRes int borderWidth) { + this.borderWidth = convertDpToPixel(context.getResources().getDimension(borderWidth)); + return this; + } + + /** + * Set the text size of scale bar. + * + * @param textSize the text size of scale bar, in pixel. * @return this. */ public ScaleBarOption setTextSize(float textSize) { - this.textSize = convertDpToPixel(textSize); + this.textSize = textSize; + return this; + } + + /** + * Set the text size of scale bar. + * + * @param textSize the text size of scale bar, in dp. + * @return this. + */ + public ScaleBarOption setTextSize(@DimenRes int textSize) { + this.textSize = convertDpToPixel(context.getResources().getDimension(textSize)); return this; } @@ -172,26 +211,46 @@ public ScaleBarOption setMetricUnit(boolean metricUnit) { } /** - * Set the left margin between scale bar and mapView, - * default value is {@link #MARGIN_LEFT_DEFAULT}. + * Set the left margin between scale bar and mapView. * - * @param marginLeft the left margin between scale bar and mapView, in dp. + * @param marginLeft the left margin between scale bar and mapView, in pixel. * @return this. */ public ScaleBarOption setMarginLeft(float marginLeft) { - this.marginLeft = convertDpToPixel(marginLeft); + this.marginLeft = marginLeft; return this; } /** - * Set the margin between text and blocks inside scale bar, - * default value is {@link #TEXT_BAR_MARGIN_DEFAULT}. + * Set the left margin between scale bar and mapView. * - * @param textBarMargin the margin between text and blocks inside scale bar, in dp. + * @param marginLeft the left margin between scale bar and mapView, in dp. + * @return this. + */ + public ScaleBarOption setMarginLeft(@DimenRes int marginLeft) { + this.marginLeft = convertDpToPixel(context.getResources().getDimension(marginLeft)); + return this; + } + + /** + * Set the margin between text and blocks inside scale bar. + * + * @param textBarMargin the margin between text and blocks inside scale bar, in pixel. * @return this. */ public ScaleBarOption setTextBarMargin(float textBarMargin) { - this.textBarMargin = convertDpToPixel(textBarMargin); + this.textBarMargin = textBarMargin; + return this; + } + + /** + * Set the margin between text and blocks inside scale bar. + * + * @param textBarMargin the margin between text and blocks inside scale bar, in dp. + * @return this. + */ + public ScaleBarOption setTextBarMargin(@DimenRes int textBarMargin) { + this.textBarMargin = convertDpToPixel(context.getResources().getDimension(textBarMargin)); return this; } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 069d818c1..9204620f4 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -19,7 +19,7 @@ public class ScaleBarWidget extends View { private static int MSG_WHAT = 0; private final Paint textPaint = new Paint(); private final Paint barPaint = new Paint(); - private int refreshDuration; + private int refreshInterval; private int textColor; private int primaryColor; private int secondaryColor; @@ -35,7 +35,7 @@ public class ScaleBarWidget extends View { private boolean isMetricUnit; private ArrayList> scaleTable; private String unit; - private RefreshHandler refreshHandler; + private final RefreshHandler refreshHandler; ScaleBarWidget(Context context) { super(context); @@ -114,26 +114,26 @@ protected void onDraw(Canvas canvas) { void setDistancePerPixel(double metersPerPixel) { this.distancePerPixel = isMetricUnit ? metersPerPixel : metersPerPixel * ScaleBarConstants.FEET_PER_METER; if (!refreshHandler.hasMessages(MSG_WHAT)) { - refreshHandler.sendEmptyMessageDelayed(MSG_WHAT, refreshDuration); + refreshHandler.sendEmptyMessageDelayed(MSG_WHAT, refreshInterval); } } /** - * Get the current setting for refresh duration, in millisecond. + * Get plugin's minimum refresh interval, in millisecond. * * @return refresh duration */ - public int getRefreshDuration() { - return refreshDuration; + public int getRefreshInterval() { + return refreshInterval; } /** - * Set the duration between two adjacent refreshment, in millisecond. + * Set plugin's minimum refresh interval, in millisecond. * - * @param refreshDuration the refresh duration. + * @param refreshInterval the refresh duration. */ - public void setRefreshDuration(int refreshDuration) { - this.refreshDuration = refreshDuration; + public void setRefreshInterval(int refreshInterval) { + this.refreshInterval = refreshInterval; } /** diff --git a/plugin-scalebar/src/main/res/values/dimens.xml b/plugin-scalebar/src/main/res/values/dimens.xml new file mode 100644 index 000000000..45825a998 --- /dev/null +++ b/plugin-scalebar/src/main/res/values/dimens.xml @@ -0,0 +1,9 @@ + + + 8dp + 10dp + 2dp + 6dp + 1dp + 4dp + From c8212cf6b502315e6e2a6e2473ddc491fc90f282 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 29 May 2019 10:02:24 +0800 Subject: [PATCH 15/19] fix review comments --- .../plugins/scalebar/ScaleBarTest.java | 49 +++++++++---------- .../activity/scalebar/ScalebarActivity.kt | 4 +- .../mapbox/pluginscalebar/ScaleBarOption.java | 31 ++++-------- ...aleBarManager.java => ScaleBarPlugin.java} | 4 +- .../src/main/res/values/dimens.xml | 2 +- 5 files changed, 37 insertions(+), 53 deletions(-) rename plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/{ScaleBarManager.java => ScaleBarPlugin.java} (96%) diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index cfa1711ba..29a9dfd45 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -3,15 +3,15 @@ import android.app.Activity; import android.support.test.runner.AndroidJUnit4; -import android.util.DisplayMetrics; +import android.support.v4.content.ContextCompat; import android.view.View; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.plugins.BaseActivityTest; import com.mapbox.mapboxsdk.plugins.testapp.R; import com.mapbox.mapboxsdk.plugins.testapp.activity.TestActivity; -import com.mapbox.pluginscalebar.ScaleBarManager; import com.mapbox.pluginscalebar.ScaleBarOption; +import com.mapbox.pluginscalebar.ScaleBarPlugin; import com.mapbox.pluginscalebar.ScaleBarWidget; import org.junit.Test; @@ -30,7 +30,7 @@ */ @RunWith(AndroidJUnit4.class) public class ScaleBarTest extends BaseActivityTest { - private ScaleBarManager scaleBarManager; + private ScaleBarPlugin scaleBarManager; private Activity activity; private ScaleBarWidget scaleBarWidget; @@ -42,7 +42,7 @@ protected Class getActivityClass() { private void setupScaleBar() { Timber.i("Retrieving layer"); invoke(mapboxMap, (uiController, mapboxMap) -> { - scaleBarManager = new ScaleBarManager(idlingResource.getMapView(), mapboxMap); + scaleBarManager = new ScaleBarPlugin(idlingResource.getMapView(), mapboxMap); activity = rule.getActivity(); scaleBarWidget = scaleBarManager.create(new ScaleBarOption(activity)); assertNotNull(scaleBarManager); @@ -68,9 +68,9 @@ public void testScaleBarColor() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(activity.getResources().getColor(android.R.color.black), scaleBarWidget.getTextColor()); - assertEquals(activity.getResources().getColor(android.R.color.black), scaleBarWidget.getPrimaryColor()); - assertEquals(activity.getResources().getColor(android.R.color.white), scaleBarWidget.getSecondaryColor()); + assertEquals(ContextCompat.getColor(activity, android.R.color.black), scaleBarWidget.getTextColor()); + assertEquals(ContextCompat.getColor(activity, android.R.color.black), scaleBarWidget.getPrimaryColor()); + assertEquals(ContextCompat.getColor(activity, android.R.color.white), scaleBarWidget.getSecondaryColor()); int textColor = R.color.colorAccent; @@ -83,9 +83,9 @@ public void testScaleBarColor() { option.setSecondaryColor(colorSecondary); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(activity.getResources().getColor(textColor), scaleBarWidget.getTextColor()); - assertEquals(activity.getResources().getColor(colorPrimary), scaleBarWidget.getPrimaryColor()); - assertEquals(activity.getResources().getColor(colorSecondary), scaleBarWidget.getSecondaryColor()); + assertEquals(ContextCompat.getColor(activity, textColor), scaleBarWidget.getTextColor()); + assertEquals(ContextCompat.getColor(activity, colorPrimary), scaleBarWidget.getPrimaryColor()); + assertEquals(ContextCompat.getColor(activity, colorSecondary), scaleBarWidget.getSecondaryColor()); }); } @@ -105,11 +105,11 @@ public void testMargin() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_margin_left)), + assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_margin_left), scaleBarWidget.getMarginLeft(), 0); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_margin_top)), + assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_margin_top), scaleBarWidget.getMarginTop(), 0); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_margin), scaleBarWidget.getTextBarMargin(), 0); ScaleBarOption option = new ScaleBarOption(activity); @@ -118,11 +118,11 @@ public void testMargin() { option.setTextBarMargin(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getMarginLeft(), 0); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getMarginTop(), 0); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getTextBarMargin(), 0); option = new ScaleBarOption(activity); @@ -143,14 +143,14 @@ public void testBarHeight() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_height)), + assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_height), scaleBarWidget.getBarHeight(), 0); ScaleBarOption option = new ScaleBarOption(activity); option.setBarHeight(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getBarHeight(), 0); option = new ScaleBarOption(activity); @@ -167,14 +167,14 @@ public void testTextSize() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_size)), + assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_size), scaleBarWidget.getTextSize(), 0); ScaleBarOption option = new ScaleBarOption(activity); option.setTextSize(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getTextSize(), 0); option = new ScaleBarOption(activity); @@ -191,14 +191,14 @@ public void testBorderWidth() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_border_width)), + assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_border_width), scaleBarWidget.getBorderWidth(), 0); ScaleBarOption option = new ScaleBarOption(activity); option.setBorderWidth(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); - assertEquals(convertDpToPixel(activity.getResources().getDimension(R.dimen.fab_margin)), + assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getBorderWidth(), 0); option = new ScaleBarOption(activity); @@ -247,9 +247,4 @@ public void testMetrics() { assertFalse(scaleBarWidget.isMetricUnit()); }); } - - - private float convertDpToPixel(float dp) { - return dp * ((float) activity.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); - } } diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index ff448f25c..247866b9f 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -5,8 +5,8 @@ import android.support.v7.app.AppCompatActivity import com.mapbox.mapboxsdk.maps.MapboxMap import com.mapbox.mapboxsdk.maps.Style import com.mapbox.mapboxsdk.plugins.testapp.R -import com.mapbox.pluginscalebar.ScaleBarManager import com.mapbox.pluginscalebar.ScaleBarOption +import com.mapbox.pluginscalebar.ScaleBarPlugin import kotlinx.android.synthetic.main.activity_scalebar.* /** @@ -25,7 +25,7 @@ class ScalebarActivity : AppCompatActivity() { } private fun addScalebar(mapboxMap: MapboxMap) { - val scaleBarManager = ScaleBarManager(mapView, mapboxMap) + val scaleBarManager = ScaleBarPlugin(mapView, mapboxMap) val scaleBarOption = ScaleBarOption(this) scaleBarOption .setTextColor(R.color.mapboxRed) diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java index 99a743075..928157cc2 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java @@ -4,7 +4,7 @@ import android.support.annotation.ColorRes; import android.support.annotation.DimenRes; import android.support.annotation.VisibleForTesting; -import android.util.DisplayMetrics; +import android.support.v4.content.ContextCompat; import java.util.Locale; @@ -83,7 +83,7 @@ public ScaleBarOption setRefreshInterval(int refreshInterval) { * @return this. */ public ScaleBarOption setTextColor(@ColorRes int textColor) { - this.textColor = context.getResources().getColor(textColor); + this.textColor = ContextCompat.getColor(context, textColor); return this; } @@ -95,7 +95,7 @@ public ScaleBarOption setTextColor(@ColorRes int textColor) { * @return this. */ public ScaleBarOption setPrimaryColor(@ColorRes int primaryColor) { - this.primaryColor = context.getResources().getColor(primaryColor); + this.primaryColor = ContextCompat.getColor(context, primaryColor); return this; } @@ -107,7 +107,7 @@ public ScaleBarOption setPrimaryColor(@ColorRes int primaryColor) { * @return this. */ public ScaleBarOption setSecondaryColor(@ColorRes int secondaryColor) { - this.secondaryColor = context.getResources().getColor(secondaryColor); + this.secondaryColor = ContextCompat.getColor(context, secondaryColor); return this; } @@ -129,7 +129,7 @@ public ScaleBarOption setMarginTop(float marginTop) { * @return this. */ public ScaleBarOption setMarginTop(@DimenRes int marginTop) { - this.marginTop = convertDpToPixel(context.getResources().getDimension(marginTop)); + this.marginTop = context.getResources().getDimension(marginTop); return this; } @@ -151,7 +151,7 @@ public ScaleBarOption setBarHeight(float barHeight) { * @return this. */ public ScaleBarOption setBarHeight(@DimenRes int barHeight) { - this.barHeight = convertDpToPixel(context.getResources().getDimension(barHeight)); + this.barHeight = context.getResources().getDimension(barHeight); return this; } @@ -173,7 +173,7 @@ public ScaleBarOption setBorderWidth(float borderWidth) { * @return this. */ public ScaleBarOption setBorderWidth(@DimenRes int borderWidth) { - this.borderWidth = convertDpToPixel(context.getResources().getDimension(borderWidth)); + this.borderWidth = context.getResources().getDimension(borderWidth); return this; } @@ -195,7 +195,7 @@ public ScaleBarOption setTextSize(float textSize) { * @return this. */ public ScaleBarOption setTextSize(@DimenRes int textSize) { - this.textSize = convertDpToPixel(context.getResources().getDimension(textSize)); + this.textSize = context.getResources().getDimension(textSize); return this; } @@ -228,7 +228,7 @@ public ScaleBarOption setMarginLeft(float marginLeft) { * @return this. */ public ScaleBarOption setMarginLeft(@DimenRes int marginLeft) { - this.marginLeft = convertDpToPixel(context.getResources().getDimension(marginLeft)); + this.marginLeft = context.getResources().getDimension(marginLeft); return this; } @@ -250,21 +250,10 @@ public ScaleBarOption setTextBarMargin(float textBarMargin) { * @return this. */ public ScaleBarOption setTextBarMargin(@DimenRes int textBarMargin) { - this.textBarMargin = convertDpToPixel(context.getResources().getDimension(textBarMargin)); + this.textBarMargin = context.getResources().getDimension(textBarMargin); return this; } - /** - * This method converts dp unit to equivalent pixels, depending on device density. - * - * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels - * @return A float value to represent px equivalent to dp depending on device density - */ - private float convertDpToPixel(float dp) { - return dp * ((float) context.getResources() - .getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); - } - /** * Helper class to determine the user measuring system. *

diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java similarity index 96% rename from plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java rename to plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java index 916c5cc98..858ae9ed8 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarManager.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java @@ -12,7 +12,7 @@ /** * Plugin class that shows a scale bar on MapView and changes the scale corresponding to the MapView's scale. */ -public class ScaleBarManager { +public class ScaleBarPlugin { private final MapView mapView; private final MapboxMap mapboxMap; private final Projection projection; @@ -28,7 +28,7 @@ public void onCameraMove() { } }; - public ScaleBarManager(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { + public ScaleBarPlugin(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { this.mapView = mapView; this.mapboxMap = mapboxMap; this.projection = mapboxMap.getProjection(); diff --git a/plugin-scalebar/src/main/res/values/dimens.xml b/plugin-scalebar/src/main/res/values/dimens.xml index 45825a998..5f56acb7c 100644 --- a/plugin-scalebar/src/main/res/values/dimens.xml +++ b/plugin-scalebar/src/main/res/values/dimens.xml @@ -3,7 +3,7 @@ 8dp 10dp 2dp - 6dp + 8dp 1dp 4dp From 7469cab88b6365d9a35febff7efdc4e9fe235f14 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Wed, 29 May 2019 12:24:34 +0800 Subject: [PATCH 16/19] Update plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java Co-Authored-By: Langston Smith --- .../src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java index 928157cc2..66e09ec73 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java @@ -11,7 +11,7 @@ /** * Builder class from which a scale bar is created. */ -public class ScaleBarOption { +public class ScaleBarOptions { public static final int REFRESH_INTERVAL_DEFAULT = 15; private final Context context; From acfc038670ed7dbbebe4046909d4804945135bd3 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Wed, 29 May 2019 12:24:41 +0800 Subject: [PATCH 17/19] Update app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt Co-Authored-By: Langston Smith --- .../plugins/testapp/activity/scalebar/ScalebarActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 247866b9f..766a2adac 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -25,7 +25,7 @@ class ScalebarActivity : AppCompatActivity() { } private fun addScalebar(mapboxMap: MapboxMap) { - val scaleBarManager = ScaleBarPlugin(mapView, mapboxMap) + val scaleBarPlugin = ScaleBarPlugin(mapView, mapboxMap) val scaleBarOption = ScaleBarOption(this) scaleBarOption .setTextColor(R.color.mapboxRed) From 869cbcdbd295bdb22a5b67be31ddbfa14effaf8f Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 29 May 2019 13:15:25 +0800 Subject: [PATCH 18/19] rename ScaleBarOptions --- .../plugins/scalebar/ScaleBarTest.java | 32 ++++++++--------- .../activity/scalebar/ScalebarActivity.kt | 10 +++--- ...aleBarOption.java => ScaleBarOptions.java} | 36 +++++++++---------- .../mapbox/pluginscalebar/ScaleBarPlugin.java | 2 +- 4 files changed, 40 insertions(+), 40 deletions(-) rename plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/{ScaleBarOption.java => ScaleBarOptions.java} (86%) diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index 29a9dfd45..8cefe68f1 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -10,7 +10,7 @@ import com.mapbox.mapboxsdk.plugins.BaseActivityTest; import com.mapbox.mapboxsdk.plugins.testapp.R; import com.mapbox.mapboxsdk.plugins.testapp.activity.TestActivity; -import com.mapbox.pluginscalebar.ScaleBarOption; +import com.mapbox.pluginscalebar.ScaleBarOptions; import com.mapbox.pluginscalebar.ScaleBarPlugin; import com.mapbox.pluginscalebar.ScaleBarWidget; @@ -44,7 +44,7 @@ private void setupScaleBar() { invoke(mapboxMap, (uiController, mapboxMap) -> { scaleBarManager = new ScaleBarPlugin(idlingResource.getMapView(), mapboxMap); activity = rule.getActivity(); - scaleBarWidget = scaleBarManager.create(new ScaleBarOption(activity)); + scaleBarWidget = scaleBarManager.create(new ScaleBarOptions(activity)); assertNotNull(scaleBarManager); assertNotNull(scaleBarWidget); }); @@ -77,7 +77,7 @@ public void testScaleBarColor() { int colorPrimary = R.color.colorPrimary; int colorSecondary = R.color.colorPrimaryDark; - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setTextColor(textColor); option.setPrimaryColor(colorPrimary); option.setSecondaryColor(colorSecondary); @@ -112,7 +112,7 @@ public void testMargin() { assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_margin), scaleBarWidget.getTextBarMargin(), 0); - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setMarginLeft(R.dimen.fab_margin); option.setMarginTop(R.dimen.fab_margin); option.setTextBarMargin(R.dimen.fab_margin); @@ -125,7 +125,7 @@ public void testMargin() { assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getTextBarMargin(), 0); - option = new ScaleBarOption(activity); + option = new ScaleBarOptions(activity); option.setMarginLeft(100f); option.setMarginTop(50f); option.setTextBarMargin(30f); @@ -146,14 +146,14 @@ public void testBarHeight() { assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_height), scaleBarWidget.getBarHeight(), 0); - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setBarHeight(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getBarHeight(), 0); - option = new ScaleBarOption(activity); + option = new ScaleBarOptions(activity); option.setBarHeight(100f); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); @@ -170,14 +170,14 @@ public void testTextSize() { assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_text_size), scaleBarWidget.getTextSize(), 0); - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setTextSize(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getTextSize(), 0); - option = new ScaleBarOption(activity); + option = new ScaleBarOptions(activity); option.setTextSize(100f); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); @@ -194,14 +194,14 @@ public void testBorderWidth() { assertEquals(activity.getResources().getDimension(R.dimen.mapbox_scale_bar_border_width), scaleBarWidget.getBorderWidth(), 0); - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setBorderWidth(R.dimen.fab_margin); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getBorderWidth(), 0); - option = new ScaleBarOption(activity); + option = new ScaleBarOptions(activity); option.setBorderWidth(100f); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); @@ -216,9 +216,9 @@ public void testRefreshInterval() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(ScaleBarOption.REFRESH_INTERVAL_DEFAULT, scaleBarWidget.getRefreshInterval(), 0); + assertEquals(ScaleBarOptions.REFRESH_INTERVAL_DEFAULT, scaleBarWidget.getRefreshInterval(), 0); - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setRefreshInterval(1000); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); @@ -232,15 +232,15 @@ public void testMetrics() { validateTestSetup(); setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { - assertEquals(ScaleBarOption.LocaleUnitResolver.isMetricSystem(), scaleBarWidget.isMetricUnit()); + assertEquals(ScaleBarOptions.LocaleUnitResolver.isMetricSystem(), scaleBarWidget.isMetricUnit()); - ScaleBarOption option = new ScaleBarOption(activity); + ScaleBarOptions option = new ScaleBarOptions(activity); option.setMetricUnit(true); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); assertTrue(scaleBarWidget.isMetricUnit()); - option = new ScaleBarOption(activity); + option = new ScaleBarOptions(activity); option.setMetricUnit(false); scaleBarWidget = scaleBarManager.create(option); assertNotNull(scaleBarWidget); diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 766a2adac..abf08b374 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -5,7 +5,7 @@ import android.support.v7.app.AppCompatActivity import com.mapbox.mapboxsdk.maps.MapboxMap import com.mapbox.mapboxsdk.maps.Style import com.mapbox.mapboxsdk.plugins.testapp.R -import com.mapbox.pluginscalebar.ScaleBarOption +import com.mapbox.pluginscalebar.ScaleBarOptions import com.mapbox.pluginscalebar.ScaleBarPlugin import kotlinx.android.synthetic.main.activity_scalebar.* @@ -26,8 +26,8 @@ class ScalebarActivity : AppCompatActivity() { private fun addScalebar(mapboxMap: MapboxMap) { val scaleBarPlugin = ScaleBarPlugin(mapView, mapboxMap) - val scaleBarOption = ScaleBarOption(this) - scaleBarOption + val scaleBarOptions = ScaleBarOptions(this) + scaleBarOptions .setTextColor(R.color.mapboxRed) .setTextSize(20f) .setBarHeight(15f) @@ -38,9 +38,9 @@ class ScalebarActivity : AppCompatActivity() { .setMarginLeft(16f) .setTextBarMargin(15f) - scaleBarManager.create(scaleBarOption) + scaleBarPlugin.create(scaleBarOptions) fabScaleWidget.setOnClickListener { - scaleBarManager.isEnabled = !scaleBarManager.isEnabled + scaleBarPlugin.isEnabled = !scaleBarPlugin.isEnabled } } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java similarity index 86% rename from plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java rename to plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java index 66e09ec73..dd370fa78 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOption.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java @@ -27,7 +27,7 @@ public class ScaleBarOptions { private float textSize; private boolean isMetricUnit; - public ScaleBarOption(Context context) { + public ScaleBarOptions(Context context) { this.context = context; refreshInterval = REFRESH_INTERVAL_DEFAULT; setBarHeight(R.dimen.mapbox_scale_bar_height); @@ -70,7 +70,7 @@ ScaleBarWidget build() { * @param refreshInterval the min refresh interval, in millisecond. * @return this */ - public ScaleBarOption setRefreshInterval(int refreshInterval) { + public ScaleBarOptions setRefreshInterval(int refreshInterval) { this.refreshInterval = refreshInterval; return this; } @@ -82,7 +82,7 @@ public ScaleBarOption setRefreshInterval(int refreshInterval) { * @param textColor the text color on scale bar. * @return this. */ - public ScaleBarOption setTextColor(@ColorRes int textColor) { + public ScaleBarOptions setTextColor(@ColorRes int textColor) { this.textColor = ContextCompat.getColor(context, textColor); return this; } @@ -94,7 +94,7 @@ public ScaleBarOption setTextColor(@ColorRes int textColor) { * @param primaryColor the primary color of the scale bar. * @return this. */ - public ScaleBarOption setPrimaryColor(@ColorRes int primaryColor) { + public ScaleBarOptions setPrimaryColor(@ColorRes int primaryColor) { this.primaryColor = ContextCompat.getColor(context, primaryColor); return this; } @@ -106,7 +106,7 @@ public ScaleBarOption setPrimaryColor(@ColorRes int primaryColor) { * @param secondaryColor the secondaryColor color of the scale bar. * @return this. */ - public ScaleBarOption setSecondaryColor(@ColorRes int secondaryColor) { + public ScaleBarOptions setSecondaryColor(@ColorRes int secondaryColor) { this.secondaryColor = ContextCompat.getColor(context, secondaryColor); return this; } @@ -117,7 +117,7 @@ public ScaleBarOption setSecondaryColor(@ColorRes int secondaryColor) { * @param marginTop the margin between scale bar and the top of mapView, in pixel. * @return this. */ - public ScaleBarOption setMarginTop(float marginTop) { + public ScaleBarOptions setMarginTop(float marginTop) { this.marginTop = marginTop; return this; } @@ -128,7 +128,7 @@ public ScaleBarOption setMarginTop(float marginTop) { * @param marginTop the margin between scale bar and the top of mapView, in dp. * @return this. */ - public ScaleBarOption setMarginTop(@DimenRes int marginTop) { + public ScaleBarOptions setMarginTop(@DimenRes int marginTop) { this.marginTop = context.getResources().getDimension(marginTop); return this; } @@ -139,7 +139,7 @@ public ScaleBarOption setMarginTop(@DimenRes int marginTop) { * @param barHeight the height for blocks in scale bar, in pixel. * @return this. */ - public ScaleBarOption setBarHeight(float barHeight) { + public ScaleBarOptions setBarHeight(float barHeight) { this.barHeight = barHeight; return this; } @@ -150,7 +150,7 @@ public ScaleBarOption setBarHeight(float barHeight) { * @param barHeight the height for blocks in scale bar, in dp. * @return this. */ - public ScaleBarOption setBarHeight(@DimenRes int barHeight) { + public ScaleBarOptions setBarHeight(@DimenRes int barHeight) { this.barHeight = context.getResources().getDimension(barHeight); return this; } @@ -161,7 +161,7 @@ public ScaleBarOption setBarHeight(@DimenRes int barHeight) { * @param borderWidth the border width in scale bar, in pixel. * @return this. */ - public ScaleBarOption setBorderWidth(float borderWidth) { + public ScaleBarOptions setBorderWidth(float borderWidth) { this.borderWidth = borderWidth; return this; } @@ -172,7 +172,7 @@ public ScaleBarOption setBorderWidth(float borderWidth) { * @param borderWidth the border width in scale bar, in dp. * @return this. */ - public ScaleBarOption setBorderWidth(@DimenRes int borderWidth) { + public ScaleBarOptions setBorderWidth(@DimenRes int borderWidth) { this.borderWidth = context.getResources().getDimension(borderWidth); return this; } @@ -183,7 +183,7 @@ public ScaleBarOption setBorderWidth(@DimenRes int borderWidth) { * @param textSize the text size of scale bar, in pixel. * @return this. */ - public ScaleBarOption setTextSize(float textSize) { + public ScaleBarOptions setTextSize(float textSize) { this.textSize = textSize; return this; } @@ -194,7 +194,7 @@ public ScaleBarOption setTextSize(float textSize) { * @param textSize the text size of scale bar, in dp. * @return this. */ - public ScaleBarOption setTextSize(@DimenRes int textSize) { + public ScaleBarOptions setTextSize(@DimenRes int textSize) { this.textSize = context.getResources().getDimension(textSize); return this; } @@ -205,7 +205,7 @@ public ScaleBarOption setTextSize(@DimenRes int textSize) { * @param metricUnit whether to use metric unit or not. * @return this. */ - public ScaleBarOption setMetricUnit(boolean metricUnit) { + public ScaleBarOptions setMetricUnit(boolean metricUnit) { isMetricUnit = metricUnit; return this; } @@ -216,7 +216,7 @@ public ScaleBarOption setMetricUnit(boolean metricUnit) { * @param marginLeft the left margin between scale bar and mapView, in pixel. * @return this. */ - public ScaleBarOption setMarginLeft(float marginLeft) { + public ScaleBarOptions setMarginLeft(float marginLeft) { this.marginLeft = marginLeft; return this; } @@ -227,7 +227,7 @@ public ScaleBarOption setMarginLeft(float marginLeft) { * @param marginLeft the left margin between scale bar and mapView, in dp. * @return this. */ - public ScaleBarOption setMarginLeft(@DimenRes int marginLeft) { + public ScaleBarOptions setMarginLeft(@DimenRes int marginLeft) { this.marginLeft = context.getResources().getDimension(marginLeft); return this; } @@ -238,7 +238,7 @@ public ScaleBarOption setMarginLeft(@DimenRes int marginLeft) { * @param textBarMargin the margin between text and blocks inside scale bar, in pixel. * @return this. */ - public ScaleBarOption setTextBarMargin(float textBarMargin) { + public ScaleBarOptions setTextBarMargin(float textBarMargin) { this.textBarMargin = textBarMargin; return this; } @@ -249,7 +249,7 @@ public ScaleBarOption setTextBarMargin(float textBarMargin) { * @param textBarMargin the margin between text and blocks inside scale bar, in dp. * @return this. */ - public ScaleBarOption setTextBarMargin(@DimenRes int textBarMargin) { + public ScaleBarOptions setTextBarMargin(@DimenRes int textBarMargin) { this.textBarMargin = context.getResources().getDimension(textBarMargin); return this; } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java index 858ae9ed8..271736147 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java @@ -40,7 +40,7 @@ public ScaleBarPlugin(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { * @param option The scale bar widget options that used to build scale bar widget. * @return The created ScaleBarWidget instance. */ - public ScaleBarWidget create(ScaleBarOption option) { + public ScaleBarWidget create(ScaleBarOptions option) { if (scaleBarWidget != null) { mapView.removeView(scaleBarWidget); } From 15fb84bacc1e72ecfca404b7343442279e83edc6 Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 29 May 2019 16:43:45 +0800 Subject: [PATCH 19/19] fix review comments --- .../plugins/scalebar/ScaleBarTest.java | 38 +++++++++---------- plugin-scalebar/build.gradle | 1 - .../pluginscalebar/ScaleBarOptions.java | 3 +- .../mapbox/pluginscalebar/ScaleBarPlugin.java | 7 ++-- .../mapbox/pluginscalebar/ScaleBarWidget.java | 3 +- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index 8cefe68f1..17464e5e6 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -30,7 +30,7 @@ */ @RunWith(AndroidJUnit4.class) public class ScaleBarTest extends BaseActivityTest { - private ScaleBarPlugin scaleBarManager; + private ScaleBarPlugin scaleBarPlugin; private Activity activity; private ScaleBarWidget scaleBarWidget; @@ -42,10 +42,10 @@ protected Class getActivityClass() { private void setupScaleBar() { Timber.i("Retrieving layer"); invoke(mapboxMap, (uiController, mapboxMap) -> { - scaleBarManager = new ScaleBarPlugin(idlingResource.getMapView(), mapboxMap); + scaleBarPlugin = new ScaleBarPlugin(idlingResource.getMapView(), mapboxMap); activity = rule.getActivity(); - scaleBarWidget = scaleBarManager.create(new ScaleBarOptions(activity)); - assertNotNull(scaleBarManager); + scaleBarWidget = scaleBarPlugin.create(new ScaleBarOptions(activity)); + assertNotNull(scaleBarPlugin); assertNotNull(scaleBarWidget); }); } @@ -56,10 +56,10 @@ public void testScaleBarEnable() { setupScaleBar(); invoke(mapboxMap, (uiController, mapboxMap) -> { assertEquals(View.VISIBLE, scaleBarWidget.getVisibility()); - assertTrue(scaleBarManager.isEnabled()); - scaleBarManager.setEnabled(false); + assertTrue(scaleBarPlugin.isEnabled()); + scaleBarPlugin.setEnabled(false); assertEquals(View.GONE, scaleBarWidget.getVisibility()); - assertFalse(scaleBarManager.isEnabled()); + assertFalse(scaleBarPlugin.isEnabled()); }); } @@ -81,7 +81,7 @@ public void testScaleBarColor() { option.setTextColor(textColor); option.setPrimaryColor(colorPrimary); option.setSecondaryColor(colorSecondary); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(ContextCompat.getColor(activity, textColor), scaleBarWidget.getTextColor()); assertEquals(ContextCompat.getColor(activity, colorPrimary), scaleBarWidget.getPrimaryColor()); @@ -116,7 +116,7 @@ public void testMargin() { option.setMarginLeft(R.dimen.fab_margin); option.setMarginTop(R.dimen.fab_margin); option.setTextBarMargin(R.dimen.fab_margin); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getMarginLeft(), 0); @@ -129,7 +129,7 @@ public void testMargin() { option.setMarginLeft(100f); option.setMarginTop(50f); option.setTextBarMargin(30f); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(100f, scaleBarWidget.getMarginLeft(), 0); assertEquals(50f, scaleBarWidget.getMarginTop(), 0); @@ -148,14 +148,14 @@ public void testBarHeight() { ScaleBarOptions option = new ScaleBarOptions(activity); option.setBarHeight(R.dimen.fab_margin); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getBarHeight(), 0); option = new ScaleBarOptions(activity); option.setBarHeight(100f); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(100f, scaleBarWidget.getBarHeight(), 0); @@ -172,14 +172,14 @@ public void testTextSize() { ScaleBarOptions option = new ScaleBarOptions(activity); option.setTextSize(R.dimen.fab_margin); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getTextSize(), 0); option = new ScaleBarOptions(activity); option.setTextSize(100f); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(100f, scaleBarWidget.getTextSize(), 0); @@ -196,14 +196,14 @@ public void testBorderWidth() { ScaleBarOptions option = new ScaleBarOptions(activity); option.setBorderWidth(R.dimen.fab_margin); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(activity.getResources().getDimension(R.dimen.fab_margin), scaleBarWidget.getBorderWidth(), 0); option = new ScaleBarOptions(activity); option.setBorderWidth(100f); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(100f, scaleBarWidget.getBorderWidth(), 0); @@ -220,7 +220,7 @@ public void testRefreshInterval() { ScaleBarOptions option = new ScaleBarOptions(activity); option.setRefreshInterval(1000); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(1000, scaleBarWidget.getRefreshInterval(), 0); @@ -236,13 +236,13 @@ public void testMetrics() { ScaleBarOptions option = new ScaleBarOptions(activity); option.setMetricUnit(true); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertTrue(scaleBarWidget.isMetricUnit()); option = new ScaleBarOptions(activity); option.setMetricUnit(false); - scaleBarWidget = scaleBarManager.create(option); + scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertFalse(scaleBarWidget.isMetricUnit()); }); diff --git a/plugin-scalebar/build.gradle b/plugin-scalebar/build.gradle index 42a13944c..a28c8586e 100644 --- a/plugin-scalebar/build.gradle +++ b/plugin-scalebar/build.gradle @@ -23,7 +23,6 @@ android { } dependencies { - implementation dependenciesList.supportAppcompatV7 implementation dependenciesList.mapboxMapSdk javadocDeps dependenciesList.mapboxMapSdk testImplementation dependenciesList.junit diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java index dd370fa78..c4a70c9a2 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java @@ -3,6 +3,7 @@ import android.content.Context; import android.support.annotation.ColorRes; import android.support.annotation.DimenRes; +import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import android.support.v4.content.ContextCompat; @@ -27,7 +28,7 @@ public class ScaleBarOptions { private float textSize; private boolean isMetricUnit; - public ScaleBarOptions(Context context) { + public ScaleBarOptions(@NonNull Context context) { this.context = context; refreshInterval = REFRESH_INTERVAL_DEFAULT; setBarHeight(R.dimen.mapbox_scale_bar_height); diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java index 271736147..3af4ff3a0 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarPlugin.java @@ -40,7 +40,7 @@ public ScaleBarPlugin(@NonNull MapView mapView, @NonNull MapboxMap mapboxMap) { * @param option The scale bar widget options that used to build scale bar widget. * @return The created ScaleBarWidget instance. */ - public ScaleBarWidget create(ScaleBarOptions option) { + public ScaleBarWidget create(@NonNull ScaleBarOptions option) { if (scaleBarWidget != null) { mapView.removeView(scaleBarWidget); } @@ -66,9 +66,10 @@ public boolean isEnabled() { /** * Toggles the scale plugin state. *

- * If the scale plugin wasn't enabled, a {@link com.mapbox.mapboxsdk.maps.MapboxMap.OnScaleListener} + * If the scale plugin wasn't enabled, a {@link com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveListener} * will be added to the {@link MapView} to listen to scale change events to update the state of this plugin. If the - * plugin was enabled the {@link com.mapbox.mapboxsdk.maps.MapboxMap.OnScaleListener} will be removed from the map. + * plugin was enabled the {@link com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveListener} + * will be removed from the map. *

*/ @UiThread diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 9204620f4..b8d350b76 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -6,6 +6,7 @@ import android.os.Handler; import android.os.Message; import android.support.annotation.ColorInt; +import android.support.annotation.NonNull; import android.util.Pair; import android.view.View; @@ -37,7 +38,7 @@ public class ScaleBarWidget extends View { private String unit; private final RefreshHandler refreshHandler; - ScaleBarWidget(Context context) { + ScaleBarWidget(@NonNull Context context) { super(context); textPaint.setAntiAlias(true); textPaint.setTextAlign(Paint.Align.CENTER);