From a638b8ed382d4fa3a5d9c79fab950d371c476468 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Mon, 26 Oct 2015 11:52:34 +0100 Subject: [PATCH] [android] #2758 - add my location tracking mode --- .../constants/MyLocationTracking.java | 51 ++++++ .../com/mapbox/mapboxsdk/views/MapView.java | 62 ++++++- .../mapboxsdk/views/UserLocationView.java | 52 ++++-- .../MyLocationTrackingModeActivityTest.java | 33 ++++ .../src/main/AndroidManifest.xml | 6 +- .../mapboxsdk/testapp/MainActivity.java | 4 + .../MyLocationTrackingModeActivity.java | 169 ++++++++++++++++++ .../drawable-hdpi/ic_gps_fixed_white_24dp.png | Bin 0 -> 546 bytes .../drawable-mdpi/ic_gps_fixed_white_24dp.png | Bin 0 -> 350 bytes .../ic_gps_fixed_white_24dp.png | Bin 0 -> 687 bytes .../ic_gps_fixed_white_24dp.png | Bin 0 -> 1012 bytes .../ic_gps_fixed_white_24dp.png | Bin 0 -> 1379 bytes .../layout/activity_my_location_tracking.xml | 29 +++ .../src/main/res/menu/menu_drawer.xml | 20 +-- .../src/main/res/values/strings.xml | 13 +- 15 files changed, 402 insertions(+), 37 deletions(-) create mode 100644 android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MyLocationTracking.java create mode 100644 android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivityTest.java create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivity.java create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_gps_fixed_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_gps_fixed_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_gps_fixed_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_gps_fixed_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_gps_fixed_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_tracking.xml diff --git a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MyLocationTracking.java b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MyLocationTracking.java new file mode 100644 index 000000000..1616a6235 --- /dev/null +++ b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MyLocationTracking.java @@ -0,0 +1,51 @@ +package com.mapbox.mapboxsdk.constants; + +import android.support.annotation.IntDef; + +import com.mapbox.mapboxsdk.views.MapView; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * MyLocationTracking exposes different types location tracking modes. + * + * @see MapView#setMyLocationTrackingMode(int) + * @see com.mapbox.mapboxsdk.views.UserLocationView#setMyLocationTrackingMode(int) + */ +public class MyLocationTracking { + + /** + * Indicates the parameter accepts one of the values from {@link MyLocationTracking}. + */ + @IntDef({TRACKING_NONE, TRACKING_FOLLOW, /**TRACKING_FOLLOW_BEARING_GPS, TRACKING_FOLLOW_BEARING_COMPASS, TRACKING_FOLLOW_BEARING**/}) + @Retention(RetentionPolicy.SOURCE) + public @interface Mode { + } + + /** + * Not tracking user + */ + public static final int TRACKING_NONE = 0x00000000; + + /** + * Tracking the location of the user + */ + public static final int TRACKING_FOLLOW = 0x00000004; + +// /** +// * Tracking the location of the user with bearing from GPS +// */ +// public static final int TRACKING_FOLLOW_BEARING_GPS = 0x00000008; +// +// /** +// * Tracking the location of the user with bearing from compass +// */ +// public static final int TRACKING_FOLLOW_BEARING_COMPASS = 0x00000012; +// +// /** +// * Tracking the location fot the user with bearing from GPS and compass +// */ +// public static final int TRACKING_FOLLOW_BEARING = 0x00000016; + +} \ No newline at end of file diff --git a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java index e3c3599b6..4c3bfcbed 100644 --- a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java +++ b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java @@ -64,6 +64,7 @@ import com.mapbox.mapboxsdk.annotations.Polyline; import com.mapbox.mapboxsdk.annotations.PolylineOptions; import com.mapbox.mapboxsdk.annotations.Sprite; import com.mapbox.mapboxsdk.annotations.SpriteFactory; +import com.mapbox.mapboxsdk.constants.MyLocationTracking; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.exceptions.InvalidAccessTokenException; import com.mapbox.mapboxsdk.exceptions.SpriteBitmapChangedException; @@ -121,6 +122,7 @@ public final class MapView extends FrameLayout { private static final String STATE_STYLE_CLASSES = "styleClasses"; private static final String STATE_DEFAULT_TRANSITION_DURATION = "defaultTransitionDuration"; private static final String STATE_MY_LOCATION_ENABLED = "myLocationEnabled"; + private static final String STATE_MY_LOCATION_TRACKING_MODE = "myLocationTracking"; private static final String STATE_COMPASS_ENABLED = "compassEnabled"; private static final String STATE_COMPASS_GRAVITY = "compassGravity"; private static final String STATE_COMPASS_MARGIN_LEFT = "compassMarginLeft"; @@ -801,6 +803,9 @@ public final class MapView extends FrameLayout { , savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_TOP) , savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_RIGHT) , savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_BOTTOM)); + + //noinspection ResourceType + setMyLocationTrackingMode(savedInstanceState.getInt(STATE_MY_LOCATION_TRACKING_MODE, MyLocationTracking.TRACKING_NONE)); } // Force a check for an access token @@ -852,6 +857,7 @@ public final class MapView extends FrameLayout { outState.putStringArrayList(STATE_STYLE_CLASSES, new ArrayList<>(getStyleClasses())); outState.putLong(STATE_DEFAULT_TRANSITION_DURATION, mNativeMapView.getDefaultTransitionDuration()); outState.putBoolean(STATE_MY_LOCATION_ENABLED, isMyLocationEnabled()); + outState.putInt(STATE_MY_LOCATION_TRACKING_MODE, mUserLocationView.getMyLocationTrackingMode()); // Compass LayoutParams compassParams = (LayoutParams) mCompassView.getLayoutParams(); @@ -2493,8 +2499,13 @@ public final class MapView extends FrameLayout { mNativeMapView.cancelTransitions(); // Scale the map - mNativeMapView.scaleBy(detector.getScaleFactor(), detector.getFocusX() / mScreenDensity, detector.getFocusY() / mScreenDensity); - + if (mUserLocationView.getMyLocationTrackingMode() == MyLocationTracking.TRACKING_NONE) { + // around gesture + mNativeMapView.scaleBy(detector.getScaleFactor(), detector.getFocusX() / mScreenDensity, detector.getFocusY() / mScreenDensity); + } else { + // around center map + mNativeMapView.scaleBy(detector.getScaleFactor(), (getWidth() / 2) / mScreenDensity, (getHeight() / 2) / mScreenDensity); + } return true; } } @@ -2559,11 +2570,18 @@ public final class MapView extends FrameLayout { // Cancel any animation mNativeMapView.cancelTransitions(); - // Rotate the map + // Get rotate value double bearing = mNativeMapView.getBearing(); bearing += detector.getRotationDegreesDelta(); - mNativeMapView.setBearing(bearing, detector.getFocusX() / mScreenDensity, detector.getFocusY() / mScreenDensity); + // Rotate the map + if (mUserLocationView.getMyLocationTrackingMode() == MyLocationTracking.TRACKING_NONE) { + // around gesture + mNativeMapView.setBearing(bearing, detector.getFocusX() / mScreenDensity, detector.getFocusY() / mScreenDensity); + } else { + // around center map + mNativeMapView.setBearing(bearing, (getWidth() / 2) / mScreenDensity, (getHeight() / 2) / mScreenDensity); + } return true; } } @@ -3116,6 +3134,42 @@ public final class MapView extends FrameLayout { mUserLocationView.setOnMyLocationChangeListener(listener); } + /** + * Set the current my location tracking mode. + * Tracking my location disbales gestures, automatically moves the viewport + * and shows the direction the user is heading. + * See {@link MyLocationTracking} for different values. + * + * @param userLocationTrackingMode to be used. + * @see MyLocationTracking + */ + @UiThread + public void setMyLocationTrackingMode(@MyLocationTracking.Mode int userLocationTrackingMode) { + mUserLocationView.setMyLocationTrackingMode(userLocationTrackingMode); + + // Enable/disable gestures based on tracking mode + if (userLocationTrackingMode == MyLocationTracking.TRACKING_NONE) { + mScrollEnabled = true; + mRotateEnabled = true; + } else { + mScrollEnabled = false; + mRotateEnabled = (userLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW); + } + } + + /** + * Returns the current user location tracking mode. + * See {@link MyLocationTracking} for possible return values. + * + * @return the current user location tracking mode. + * @see MyLocationTracking + */ + @UiThread + @MyLocationTracking.Mode + public int getMyLocationTrackingMode() { + return mUserLocationView.getMyLocationTrackingMode(); + } + // // Compass // diff --git a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java index 7453f4e28..06ef550a7 100644 --- a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java +++ b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java @@ -5,7 +5,6 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; @@ -21,17 +20,16 @@ import android.view.View; import android.view.ViewGroup; import com.mapbox.mapboxsdk.R; +import com.mapbox.mapboxsdk.constants.MyLocationTracking; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapzen.android.lost.api.LocationListener; import com.mapzen.android.lost.api.LocationRequest; import com.mapzen.android.lost.api.LocationServices; import com.mapzen.android.lost.api.LostApiClient; -import java.lang.ref.WeakReference; - final class UserLocationView extends View { - private WeakReference mMapView; + private MapView mMapView; private static final int BLUE_COLOR = 0x39ACCBFF; @@ -79,6 +77,9 @@ final class UserLocationView extends View { MapView.OnMyLocationChangeListener mOnMyLocationChangeListener; + @MyLocationTracking.Mode + private int mMyLocationTrackingMode; + public UserLocationView(MapView mapView, Context context) { super(context); initialize(mapView, context); @@ -95,7 +96,7 @@ final class UserLocationView extends View { } private void initialize(MapView mapView, Context context) { - mMapView = new WeakReference(mapView); + mMapView = mapView; // View configuration setEnabled(false); @@ -208,6 +209,20 @@ final class UserLocationView extends View { } } + public void setMyLocationTrackingMode(@MyLocationTracking.Mode int myLocationTrackingMode) { + mMyLocationTrackingMode = myLocationTrackingMode; + + if (myLocationTrackingMode != MyLocationTracking.TRACKING_NONE && mUserLocation != null) { + // center map directly if we have a location fix + mMapView.setCenterCoordinate(new LatLng(mUserLocation.getLatitude(), mUserLocation.getLongitude())); + } + } + + @MyLocationTracking.Mode + public int getMyLocationTrackingMode() { + return mMyLocationTrackingMode; + } + @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); @@ -221,7 +236,7 @@ final class UserLocationView extends View { // compute new marker position // TODO add JNI method that takes existing pointf - mMarkerScreenPoint = mMapView.get().toScreenLocation(mMarkerCoordinate); + mMarkerScreenPoint = mMapView.toScreenLocation(mMarkerCoordinate); mMarkerScreenMatrix.reset(); mMarkerScreenMatrix.setTranslate( mMarkerScreenPoint.x, @@ -230,14 +245,14 @@ final class UserLocationView extends View { // rotate so arrow in points to bearing if (mShowDirection) { mMarkerScreenMatrix.preRotate(mMarkerDirection + - (float) mMapView.get().getDirection()); + (float) mMapView.getDirection()); } // adjust accuracy circle if (mShowAccuracy) { mAccuracyPath.reset(); mAccuracyPath.addCircle(0.0f, 0.0f, - (float) (mMarkerAccuracy / mMapView.get().getMetersPerPixelAtLatitude( + (float) (mMarkerAccuracy / mMapView.getMetersPerPixelAtLatitude( mMarkerCoordinate.getLatitude())), Path.Direction.CW); @@ -344,12 +359,19 @@ final class UserLocationView extends View { previousCoordinate = new LatLng(mUserLocation); } - mMarkerCoordinateAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); - mMarkerCoordinateAnimator.setDuration(1000); - mMarkerCoordinateAnimator.addUpdateListener(new MarkerCoordinateAnimatorListener( - previousCoordinate, new LatLng(location) - )); - mMarkerCoordinateAnimator.start(); + if(mMyLocationTrackingMode== MyLocationTracking.TRACKING_NONE) { + // moving marker above map + mMarkerCoordinateAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); + mMarkerCoordinateAnimator.setDuration(1000); + mMarkerCoordinateAnimator.addUpdateListener(new MarkerCoordinateAnimatorListener( + previousCoordinate, new LatLng(location) + )); + mMarkerCoordinateAnimator.start(); + }else{ + // moving map under the tracker + mMarkerCoordinate = new LatLng(location); + mMapView.setCenterCoordinate(mMarkerCoordinate, true); + } mShowDirection = location.hasBearing(); if (mShowDirection) { @@ -388,7 +410,7 @@ final class UserLocationView extends View { } void updateOnNextFrame() { - mMapView.get().update(); + mMapView.update(); } public void pause() { diff --git a/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivityTest.java b/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivityTest.java new file mode 100644 index 000000000..b21cd070a --- /dev/null +++ b/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivityTest.java @@ -0,0 +1,33 @@ +package com.mapbox.mapboxsdk.testapp; + +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests on User LocationTrackingModeActivity + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class MyLocationTrackingModeActivityTest extends BaseTest { + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>(MyLocationTrackingModeActivity.class); + + private MyLocationTrackingModeActivity mActivity = null; + + @Before + public void setActivity() { + mActivity = mActivityRule.getActivity(); + } + + @Test + public void testSanity() { + checkViewIsDisplayed(R.id.mapView); + } +} \ No newline at end of file diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 846a19ed8..d4bf05256 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -36,7 +36,7 @@ - + @@ -49,6 +49,10 @@ android:name=".PressForMarkerActivity" android:label="@string/activity_press_for_marker" /> + + diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java index 6e9f99a9c..006c11d47 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java +++ b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java @@ -339,6 +339,10 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(getApplicationContext(), VisibleCoordinateBoundsActivity.class)); return true; + case R.id.action_user_tracking_mode: + startActivity(new Intent(getApplicationContext(), MyLocationTrackingModeActivity.class)); + return true; + default: return changeMapStyle(menuItem.getItemId()); } diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivity.java b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivity.java new file mode 100644 index 000000000..366db4b8f --- /dev/null +++ b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MyLocationTrackingModeActivity.java @@ -0,0 +1,169 @@ +package com.mapbox.mapboxsdk.testapp; + +import android.location.Location; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Spinner; + +import com.mapbox.mapboxsdk.constants.MyLocationTracking; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.utils.ApiAccess; +import com.mapbox.mapboxsdk.views.MapView; + +public class MyLocationTrackingModeActivity extends AppCompatActivity implements MapView.OnMyLocationChangeListener, AdapterView.OnItemSelectedListener { + + private MapView mMapView; + private Spinner mSpinner; + private Location mLocation; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_location_tracking); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayShowTitleEnabled(false); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + } + + ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.user_tracking_mode, android.R.layout.simple_spinner_item); + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mSpinner = (Spinner) findViewById(R.id.spinner); + mSpinner.setAdapter(spinnerAdapter); + mSpinner.setOnItemSelectedListener(this); + mSpinner.setEnabled(false); + + mMapView = (MapView) findViewById(R.id.mapView); + mMapView.setAccessToken(ApiAccess.getToken(this)); + mMapView.onCreate(savedInstanceState); + mMapView.setOnMyLocationChangeListener(this); + mMapView.setMyLocationEnabled(true); + } + + @Override + public void onMyLocationChange(@Nullable Location location) { + if (location != null) { + if (mLocation == null) { + // initial location to reposition map + mMapView.setCenterCoordinate(new LatLng(location.getLatitude(), location.getLongitude())); + mSpinner.setEnabled(true); + } + mLocation = location; + showSnackBar(); + } + } + + private void showSnackBar() { + String desc = "Loc Chg: "; + boolean noInfo = true; + if (mLocation.hasSpeed()) { + desc += String.format("Spd = %.1f km/h ", mLocation.getSpeed() * 3.6f); + noInfo = false; + } + if (mLocation.hasAltitude()) { + desc += String.format("Alt = %.0f m ", mLocation.getAltitude()); + noInfo = false; + } + if (noInfo) { + desc += "No extra info"; + } + Snackbar.make(findViewById(android.R.id.content), desc, Snackbar.LENGTH_SHORT).show(); + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + switch (position) { + case 0: + mMapView.setMyLocationTrackingMode(MyLocationTracking.TRACKING_NONE); + break; + + case 1: + mMapView.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW); + break; + +// case 2: +// mMapView.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW_BEARING_GPS); +// break; +// +// case 3: +// mMapView.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW_BEARING_COMPASS); +// break; +// +// case 4: +// mMapView.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW_BEARING); +// break; + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + + @Override + protected void onStart() { + super.onStart(); + mMapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mMapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mMapView.onPause(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mMapView.onSaveInstanceState(outState); + } + + @Override + protected void onStop() { + super.onStop(); + mMapView.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mMapView.onDestroy(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mMapView.onLowMemory(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + +} \ No newline at end of file diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_gps_fixed_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_gps_fixed_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..745db489be6ad7efd37d8adb82999954a2a0574c GIT binary patch literal 546 zcmV+-0^R+IP)6vy!>N1}qhz<7BH3lSoMwqhYZhqp!>35e0=G#1l|)j_5aL@Px^>@*2Rd=ibK z81p$z*lfm~iz$ZT{8shfYw?BkUzfcz|C!9l%bSsDZ5iz>5Ay#L(6Bit;KZzN1$f18K~DIxQsDL)HNvUNrRTaQ z(x3~l9fd!L^=LHs3g9dS8dk$+s8lv!VpO)_9aG1Pzv8GQd$lEdoUe=8jIot z9E8AIDHVhN5FBePnK0jgLI|u%={5dKLHSmow>F^N7}P4Yl9cXRq}H%mP!8W~Qd$oF z3dnt}+K>;_L$CBFR>?ys|9GSP1F42Q2Rl(i#wZ@5ZLkMU)1AEto}=)7tBPK|y0a`B z&d0rg`DQ~~0ayCk4DAglHXGWEDWBj-Ukl7Xpk|`gV%r2<8%<)y-2m3xt=fG+Rl(T5 zAbVZ_KRa3e8)|^Mdxr{k9jd4UYSufwjwY2gQ_;kCF327W&b*8D?$o@VZm#S>(~iNh koPj^-HImWoL#uoH4L`+AbSP*|CjbBd07*qoM6N<$g7`7{Bme*a literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_gps_fixed_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_gps_fixed_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c563cc9f7f416c5d877dd9bc336421c76f0d77 GIT binary patch literal 350 zcmV-k0iphhP)o5F%8?4(H_dnxq%Qyb}~aDd}9xyNb>mzvH~ zSjR9mwRQ@xnyM5!-ef|pox+QzDus?Wsky^i3KyErQrN&SP5RhRp=+e}*K!JnI7*XU zJep6T>s+OBW;umL&)Cj1HyCJThL%%YWtOfn1{Ts_(J4lj@}4bYJUOtgqhrINXN+v- wV^&<7b!91^vE$g##L$uLe2pUCp~%np4=Q+%K$TBvZvX%Q07*qoM6N<$f;{4*-2eap literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_gps_fixed_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_gps_fixed_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ffab865d9585ebbc77c392f282e2316ff9f7271a GIT binary patch literal 687 zcmV;g0#N;lP)5_dO{AfRR*eT+@b9gN#p1y~2!aQ%;zc~_NpA}JJya4TNWADLCzuWFR`;6~QoL%q#f;ygiJlyjth)6$c9C1aR3Wu!H z`y7H+mMCH4f<;=NBADYBaa5UooS>b3T-hVptRT%L7!;?hGfo#iK4~V{pn$?ana*Ye zX=>E@!ybJNs|Lt%FIv^%Dro0Y4Eu~1kx?;~5(y`P=>1pT;Kd}xF?BL7f;sW{Hav&4 z3B^pDpw(>5YW(a?Ql?SgX^9prnWY^G-5DXv4R;TzkzqJ=_lsHXg=j&^?CjvO=Ln+6 zl5Dtg#VA3)8QvFoe33>J0*XNtdh7?gU=7W;z||Z!0=vdcW5q5wLbD#|y&V-;i%m2K zcEJ^zad9n66uY8w5>1(~fG}O6;hj5yCaHQQJHu_g0vV`BZ{h1i%cqL zCd9Q2QEZFKDeEGe9HQ9}*M?EpP<#@VTWIoj!77>pp3_F%3DljTS+)y$&CCYG)g%QP zaT+*ahRnZ;9=pKf0!LV*0h`m)N&oVu)Uzz`+z~lu9{sKIN V8gkk7uaf`(002ovPDHLkV1fY7Hg5m` literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_gps_fixed_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_gps_fixed_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..387ecdfbcbd66f8ded9af6951c0c2fe6e6482f55 GIT binary patch literal 1012 zcmVh-k6B>5Z+iNmzXE@|-8<9D1JTB)#bJdM=;y4IiGI^ZfXp z4gW)3$Tqkh&Obmm(7FlK4HP4b&p4CFCK<$1Qn+T7zBSu-x z*V?*igzL6}Vk{z@(q0`4+Le??Sg;M0MX0ewGk2=kSSGF1Zl#W}!!D4IFrhjB6SnSX zs;3b0c7etbE@>8e6I)HqdK*J1*aezIIH;VxNEo9^{SZRg9LOZ2l#~eLo>D)6iB+JK z@`Lk)F{jk`xCK(5I1R$6EA`2B7D)ZeUU&X4>*S;^+D~e`Wq(LHdx0>{+bw(h8{=i= z>^7R%`j>P&Zj3&{ea-p1*t)H$et>Y=F3_%39iV)?E`sK5M~TLi!^s= zYF5^5J~8xB{zUjI+-J~PWFwfy^)kvm=BQI=jw0tt8^@kQHXJTcl9veY*y;SCn5BmB z-2OvR{~})@(v*9;n#c1uAewJGzr6OLPV4OFkqc*IL5LAgU zm$J+vd(UB)mflr@Ru~~}9cClvs1fv?Yt!=_+pOT_1^ zKs6(T;Te_lQD7IJ09lSF^wLH>m6Q=9Mj4gVbC8QXB?rh-G=yECnKY6#w`gPq3OOs- z!)?+?W@!wwK%02CpX4NEs64ZpE>hwd{57ls&BC8Q#c_&JK2yR;riBW>gi&CZaN=*V z9%Yyc289c$!FGWvKH)Y)J1SrfF^gM@3Y!I%F@oC%YEc%lg)!WQiQ6l11-E~wKv~KL z-r#n@R)KoH;r{c#M_J4o+!b3G>BMQA;$Q_%;dCpn*PQ+IF-(dK873K~kA0M)JaZSPV?hcOF^=v(&&Spe z+~6zVHqCW5dj1lo(Y>e8yg&<1$331Gy<`DdhVv{%A*Tzcz2*fTqf1hZ60?byt*Na9BV`7D%^L3hxsz`eZh zKgGPnuTkXR!XUbvCIt%kf=+%{>cvD4N=OsBNs|I~=(3cGH_j|3GU8>lk~wsn{TFCO z_XH*62B!K@LY|{*@n4_^U9ULU_=>41aboc@x-u!0(oCTli^=N z(T{j>-$tbjM-WZIQ9ID}2OmmY6kp({F*QX=cteR+bWc%2u4C$2n1i`GbUAVD zWg{6(q^TB;xXQ+Gx`5B<_Mn8E$HZCWr4(HfCB@Gq({1GGl)v$71bO=W4!VA`0*BD0 zS&b4>Ljpf0sPger-)2@|Eje^uC^5A@DopSrO3Z0=8PjPM#UpenN>E~I7$qMgRH4L_ z@(JAolxcwjIGscxXDK~o09l%|9!p2vI5h^D+#N$V?YXp3LmyMZW9u5#o{NcJ(Y*^Y zxvMyV(;&(-%W38+LnKI(CczL_X`%$>nfo{$MFlBPN&=@pP$A_{oW_DKa3~JrG)o;S zglr=X(h$>a;llYX_Ug?1r*zv!|4rcP!_Y6w>ah4YHOkU61Xc^JPXyl z#qAu*R)ILraT{X`%0hl(0=FSz_6jH}N#Qn2r-eID8n-0tZEv?}U>0z@LnX>ERon;M zX4nzNhNnhy!t!aC!S>Zsx`lb|9J|BXa`u~00Y1`AIV#VTb6VUwn58AmO@EEdBFQjF z6Dv{3Sw%B<$s(Cyci7u58%P1N9M8B+J3FbOoH%jHsbVJ`T;?z409le9^Re-@f?>ii z#QOQ#dK~8hIc&;tj@bNe{{ER4*fPr2h1h<-gbv0DYK(&vF5CwY#T?^3rrvRs;)VYN zrI5WmB#R#z9?(ePV)_VZHNSI{NxUTKr;W13`We=DY^H@X^yAde8CuvJeFzs7hzi(E lR3Iu46 + + + + + + + + + + + \ No newline at end of file diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml b/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml index 5167182a4..94357dc09 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml +++ b/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml @@ -59,20 +59,6 @@ - - - + + diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index e47c4643a..b52662824 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -10,14 +10,13 @@ Add Bulk Markers Activity InfoWindow Activity Visible Coordinate Bounds + User tracking mode Main Activity Controls Main Activity Styles Individual Tests Toggle GPS location - Disable tracking - Use follow tracking mode - Use bearing tracking mode tracking + User location tracking Toggle compass Toggle debug mode Toggle point annotations @@ -50,4 +49,12 @@ 10000 + + Disable tracking + Follow tracking mode + + + + +