diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java index bfc1711af..64f21205b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java @@ -124,7 +124,7 @@ public class MyLocationView extends View { } private void init(Context context) { - if(isInEditMode()){ + if (isInEditMode()) { return; } @@ -168,7 +168,6 @@ public class MyLocationView extends View { foregroundDrawable = defaultDrawable; foregroundBearingDrawable = bearingDrawable; - setForegroundDrawableTint(foregroundTintColor); invalidateBounds(); } @@ -199,7 +198,6 @@ public class MyLocationView extends View { backgroundOffsetTop = top; backgroundOffsetRight = right; backgroundOffsetBottom = bottom; - setShadowDrawableTint(backgroundTintColor); invalidateBounds(); } @@ -389,8 +387,8 @@ public class MyLocationView extends View { } @Override - public void onRestoreInstanceState(Parcelable state){ - if (state instanceof Bundle){ + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof Bundle) { Bundle bundle = (Bundle) state; tilt = bundle.getFloat("tilt"); state = bundle.getParcelable("superState"); @@ -496,11 +494,11 @@ public class MyLocationView extends View { } public float getCenterX() { - return getX() + getMeasuredWidth() / 2; + return (getX() + contentPadding[0] - contentPadding[2] + getMeasuredWidth()) / 2; } public float getCenterY() { - return getY() + getMeasuredHeight() / 2; + return (getY() + contentPadding[1] - contentPadding[3] + getMeasuredHeight()) / 2; } public void setContentPadding(int[] padding) { @@ -564,19 +562,19 @@ public class MyLocationView extends View { return; } - if( event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR ){ + if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { // calculate the rotation matrix - SensorManager.getRotationMatrixFromVector(matrix, event.values ); - SensorManager.getOrientation(matrix, orientation ); + SensorManager.getRotationMatrixFromVector(matrix, event.values); + SensorManager.getOrientation(matrix, orientation); - float magneticHeading = (float) Math.toDegrees(SensorManager.getOrientation(matrix, orientation )[0]); + float magneticHeading = (float) Math.toDegrees(SensorManager.getOrientation(matrix, orientation)[0]); currentDegree = (int) (magneticHeading); // Change the user location view orientation to reflect the device orientation setCompass(currentDegree); - if(myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW){ + if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { rotateCamera(); } @@ -584,14 +582,15 @@ public class MyLocationView extends View { } } - private void rotateCamera(){ + private void rotateCamera() { CameraPosition.Builder builder = new CameraPosition.Builder(); builder.bearing(currentDegree); mapboxMap.easeCamera(CameraUpdateFactory.newCameraPosition(builder.build()), COMPASS_UPDATE_RATE_MS, false /*linear interpolator*/); } @Override - public void onAccuracyChanged(Sensor sensor, int accuracy) {} + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 1a46671ad..d582719af 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -1,12 +1,12 @@ - + - - - - - + + + + + - - + + + android:value="@string/category_infowindow" /> + android:value="@string/category_infowindow" /> + android:value="@string/category_infowindow" /> + android:value="@string/category_annotation" /> + android:value="@string/category_annotation" /> + android:value="@string/category_annotation" /> + android:value="@string/category_annotation" /> + android:value="@string/category_camera" /> + android:value="@string/category_camera" /> + android:value="@string/category_camera" /> + android:value="@string/category_fragment" /> + android:value="@string/category_fragment" /> + android:value="@string/category_camera" /> + android:value="@string/category_camera" /> + android:value="@string/category_custom_layer" /> + android:value="@string/category_userlocation" /> + android:value="@string/category_userlocation" /> + android:value="@string/category_userlocation" /> + android:value="@string/category_userlocation" /> + android:value="@string/category_annotation" /> + android:value="@string/category_annotation" /> + android:value="@string/category_directions" /> + android:value="@string/category_geocoding" /> + android:value="@string/category_camera" /> + android:value="@string/category_maplayout" /> + android:value="@string/category_maplayout" /> + android:value="@string/category_offline" /> + android:value="@string/category_imagegenerator" /> + android:value="@string/category_maplayout" /> + android:value="@string/category_annotation" /> + android:value="@string/category_annotation" /> + android:value="@string/category_navigation" /> + android:value="@string/category_fragment" /> + android:value="@string/category_fragment" /> + android:value="@string/category_style" /> + android:value="@string/category_imagegenerator" /> + android:value="@string/category_maplayout" /> @@ -359,25 +359,32 @@ android:name="@string/category" android:value="@string/category_features" /> - + + + - - + + + android:value="https://cloudfront-staging.tilestream.net" /> + android:value="sk.eyJ1IjoiYmxlZWdlIiwiYSI6InNpcml1c2x5In0.KyT-boMyC_xZYTYojTc8zg" /> - + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java index 69e9cf048..de5af8f17 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java @@ -208,6 +208,7 @@ public class FeatureOverviewActivity extends AppCompatActivity { { add(resources.getString(R.string.activity_double_map)); add(getString(R.string.activity_location_picker)); + add(getString(R.string.activity_car_driving)); } }; diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/navigation/CarDrivingActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/navigation/CarDrivingActivity.java new file mode 100644 index 000000000..5f2f5b042 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/navigation/CarDrivingActivity.java @@ -0,0 +1,187 @@ +package com.mapbox.mapboxsdk.testapp.activity.navigation; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.location.Location; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.UiThread; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.res.ResourcesCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; + + +import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; +import com.mapbox.mapboxsdk.constants.MyBearingTracking; +import com.mapbox.mapboxsdk.constants.MyLocationTracking; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.mapbox.mapboxsdk.maps.TrackingSettings; +import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; +import com.mapbox.mapboxsdk.testapp.R; + +public class CarDrivingActivity extends AppCompatActivity implements MapboxMap.OnMyLocationChangeListener { + + private static final int PERMISSIONS_LOCATION = 0; + + private MapView mMapView; + private MapboxMap mapboxMap; + private Location location; + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_car_driving); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + final ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + } + + mMapView = (MapView) findViewById(R.id.mapView); + mMapView.onCreate(savedInstanceState); + mMapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(@NonNull MapboxMap mapboxMap) { + CarDrivingActivity.this.mapboxMap = mapboxMap; + + // view settings + MyLocationViewSettings settings = mapboxMap.getMyLocationViewSettings(); + settings.setPadding(0, getWindow().getDecorView().getMeasuredHeight() / 3, 0, 0); + + // get car + Drawable car = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_taxi_top_small, getTheme()); + settings.setForegroundTintColor(Color.TRANSPARENT); + settings.setForegroundDrawable(car, car); + + // remove accuracy circle + settings.setAccuracyAlpha(0); + + // disable dismissal when a gesture occurs + TrackingSettings trackingSettings = mapboxMap.getTrackingSettings(); + trackingSettings.setDismissLocationTrackingOnGesture(false); + trackingSettings.setDismissBearingTrackingOnGesture(false); + + mapboxMap.setOnMyLocationChangeListener(CarDrivingActivity.this); + + if (savedInstanceState == null) { + toggleGps(true); + } + } + }); + } + + @UiThread + public void toggleGps(boolean enableGps) { + if (enableGps) { + if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || + (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_LOCATION); + } else { + enableLocation(true); + } + } else { + enableLocation(false); + } + } + + private void enableLocation(boolean enabled) { + if (enabled) { + mapboxMap.setMyLocationEnabled(true); + Location location = mapboxMap.getMyLocation(); + if (location != null) { + setInitialPosition(new LatLng(location)); + } + } else { + mapboxMap.setMyLocationEnabled(false); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + switch (requestCode) { + case PERMISSIONS_LOCATION: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + enableLocation(true); + } + } + } + } + + private void setInitialPosition(LatLng latLng) { + mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition( + new CameraPosition.Builder().target(latLng).zoom(15).tilt(20f).build())); + mapboxMap.setMyLocationEnabled(true); + + TrackingSettings trackingSettings = mapboxMap.getTrackingSettings(); + trackingSettings.setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW); + trackingSettings.setMyBearingTrackingMode(MyBearingTracking.GPS); + } + + @Override + public void onMyLocationChange(@Nullable Location location) { + if (location != null) { + if (this.location == null) { + // initial location to reposition map + setInitialPosition(new LatLng(location)); + } + this.location = location; + } + } + + @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 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); + } + } + +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_taxi_top_small.png b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_taxi_top_small.png new file mode 100644 index 000000000..e04c19916 Binary files /dev/null and b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_taxi_top_small.png differ diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_car_driving.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_car_driving.xml new file mode 100644 index 000000000..c61055ee4 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_car_driving.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index 4436e4020..d8f2edd85 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ Location Picker + Driving animation Double Map Activity @@ -106,6 +107,7 @@ Query rendered feature properties on click Count all rendered features in box Hightligh buildings in box + MyLocationView follow map update example Concurrent Open InfoWindows Deselect Markers On Tap diff --git a/platform/android/scripts/generate-test-code.js b/platform/android/scripts/generate-test-code.js index 016e1c53f..07efd9daa 100644 --- a/platform/android/scripts/generate-test-code.js +++ b/platform/android/scripts/generate-test-code.js @@ -14,7 +14,7 @@ global.camelize = function (str) { } -const excludeActivities = ["MyLocationTrackingModeActivity","MyLocationToggleActivity","MyLocationTintActivity","MyLocationDrawableActivity","DoubleMapActivity", "LocationPickerActivity","GeoJsonClusteringActivity","RuntimeStyleTestActivity", "AnimatedMarkerActivity", "ViewPagerActivity","MapFragmentActivity","SupportMapFragmentActivity","SnapshotActivity","NavigationDrawerActivity"]; +const excludeActivities = ["CarDrivingActivity","MyLocationTrackingModeActivity","MyLocationToggleActivity","MyLocationTintActivity","MyLocationDrawableActivity","DoubleMapActivity", "LocationPickerActivity","GeoJsonClusteringActivity","RuntimeStyleTestActivity", "AnimatedMarkerActivity", "ViewPagerActivity","MapFragmentActivity","SupportMapFragmentActivity","SnapshotActivity","NavigationDrawerActivity"]; const appBasePath = 'platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity'; const testBasePath = 'platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/activity/gen'; const subPackages = fs.readdirSync(appBasePath);