diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java index 534122e27..841f45d3f 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindow.java @@ -1,12 +1,15 @@ package com.mapbox.mapboxsdk.annotations; import android.content.Context; +import android.content.res.Resources; import android.graphics.PointF; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; + +import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.views.MapView; @@ -28,10 +31,7 @@ public final class InfoWindow { public InfoWindow(int layoutResId, MapView mapView) { mMapView = mapView; mIsVisible = false; - Context context = mapView.getContext(); - LayoutInflater inflater = - (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mView = inflater.inflate(layoutResId, (ViewGroup) mapView, false); + mView = LayoutInflater.from(mapView.getContext()).inflate(layoutResId, mapView, false); if (mTitleId == 0) { setResIds(mapView.getContext()); @@ -52,10 +52,6 @@ public final class InfoWindow { public InfoWindow(View view, MapView mapView) { mMapView = mapView; mIsVisible = false; - ViewGroup parent = (ViewGroup) mapView.getParent(); - Context context = mapView.getContext(); - LayoutInflater inflater = - (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mView = view; // default behavior: close it when clicking on the tooltip: @@ -83,13 +79,67 @@ public final class InfoWindow { MapView.LayoutParams lp = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT); mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + // Calculate default Android x,y coordinate PointF coords = mMapView.toScreenLocation(position); - double y = mMapView.getTopOffsetPixelsForAnnotationSymbol(object.getSprite()); + float x = coords.x - (mView.getMeasuredWidth() / 2); + float y = (float) mMapView.getTopOffsetPixelsForAnnotationSymbol(object.getSprite()); y = y * mMapView.getScreenDensity(); + y += coords.y - mView.getMeasuredHeight(); - lp.leftMargin = (int) coords.x - (mView.getMeasuredWidth() / 2); - // Add y because it's a negative value - lp.topMargin = (int) coords.y - mView.getMeasuredHeight() + (int) y; +// if getTopOffsetPixelsForAnnotationSymbol lands +// float x = coords.x - (mView.getMeasuredWidth() / 2) + offsetX; +// float y = coords.y - mView.getMeasuredHeight() + offsetY; + + // get right/left popup window + float right = x + mView.getMeasuredWidth(); + float left = x; + + // get right/left map view + float mapRight = mMapView.getRight(); + float mapLeft = mMapView.getLeft(); + + if (mView instanceof InfoWindowView) { + // only apply repositioning/margin for InfoWindowView + Resources resources = mMapView.getContext().getResources(); + float margin = resources.getDimension(R.dimen.infowindow_margin); + float tipViewOffset = resources.getDimension(R.dimen.infowindow_tipview_width) / 2; + float tipViewMarginLeft = mView.getMeasuredWidth() / 2 - tipViewOffset; + + // fit screen on right + if (right > mMapView.getRight()) { + x -= right - mapRight; + tipViewMarginLeft += right - mapRight + tipViewOffset; + right = x + mView.getMeasuredWidth(); + } + + // fit screen left + if (left < mMapView.getLeft()) { + x += mapLeft - left; + tipViewMarginLeft -= mapLeft - left + tipViewOffset; + left = x; + } + + // Add margin right + if (mapRight - right < margin) { + x -= margin - (mapRight - right); + tipViewMarginLeft += margin - (mapRight - right) - tipViewOffset; + left = x; + } + + // Add margin left + if (left - mapLeft < margin) { + x += margin - (left - mapLeft); + tipViewMarginLeft -= (margin - (left - mapLeft)) - tipViewOffset; + } + + // Adjust tipView + InfoWindowView infoWindowView = (InfoWindowView) mView; + infoWindowView.setTipViewMarginLeft((int) tipViewMarginLeft); + } + + // set anchor popupwindowview + mView.setX(x); + mView.setY(y); close(); //if it was already opened mMapView.addView(mView, lp); diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindowView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindowView.java new file mode 100644 index 000000000..47a0f6532 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/InfoWindowView.java @@ -0,0 +1,36 @@ +package com.mapbox.mapboxsdk.annotations; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.RelativeLayout; + +import com.mapbox.mapboxsdk.R; + +public class InfoWindowView extends RelativeLayout{ + + private InfoWindowTipView mTipView; + + public InfoWindowView(Context context) { + this(context, null); + } + + public InfoWindowView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public InfoWindowView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initialize(context); + } + + private void initialize(Context context){ + LayoutInflater.from(context).inflate(R.layout.infowindow_content, this); + mTipView = (InfoWindowTipView) findViewById(R.id.infowindow_tipview); + } + + public void setTipViewMarginLeft(int marginLeft){ + RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mTipView.getLayoutParams(); + layoutParams.leftMargin = marginLeft; + } +} diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java index d32b097d5..69eac63fb 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java @@ -202,7 +202,7 @@ public class Marker extends Annotation { */ private InfoWindow getInfoWindow() { if (infoWindow == null) { - infoWindow = new InfoWindow(R.layout.infowindow, mapView); + infoWindow = new InfoWindow(R.layout.infowindow_view, mapView); } return infoWindow; } diff --git a/android/java/MapboxGLAndroidSDK/src/main/res-public/values/public.xml b/android/java/MapboxGLAndroidSDK/src/main/res-public/values/public.xml index 125b8712c..64412f3b0 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res-public/values/public.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res-public/values/public.xml @@ -2,4 +2,5 @@ + diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow.xml b/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow_content.xml similarity index 85% rename from android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow.xml rename to android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow_content.xml index e106b8ddb..eed2f0c2c 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow_content.xml @@ -1,12 +1,12 @@ - - + android:id="@+id/infowindow_tipview" + android:layout_below="@+id/infowindow_content" + android:layout_width="@dimen/infowindow_tipview_width" + android:layout_height="8dp"/> - + diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow_view.xml b/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow_view.xml new file mode 100644 index 000000000..731abefd4 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/layout/infowindow_view.xml @@ -0,0 +1,4 @@ + + diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/dimens.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/dimens.xml new file mode 100644 index 000000000..088122006 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 8dp + \ No newline at end of file diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivityTest.java b/android/java/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivityTest.java index 37b886ba6..d707d07c6 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivityTest.java +++ b/android/java/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivityTest.java @@ -34,7 +34,7 @@ public class InfoWindowAdapterActivityTest extends BaseTest { @Test public void testSanity() { - onView(withId(R.id.secondMapView)) + onView(withId(R.id.mapView)) .check(matches(isDisplayed())); } diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index f76ffe266..c68e9c4e0 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -29,12 +29,17 @@ android:name=".InfoWindowAdapterActivity" android:label="@string/activity_infowindow_adapter" /> + + - + + + + + + + + diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_infowindow_adapter.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_infowindow_adapter.xml index 7dde0e61e..52c1c9717 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_infowindow_adapter.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_infowindow_adapter.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent"> diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml index c90555d10..40573d5d3 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml @@ -73,11 +73,6 @@ - - + + + + + diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index 139aa5f11..b1b32e438 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ InfoWindow Adapter Map Fragment Activity Press For Marker Activity + InfoWindow Activity Main Activity Controls Main Activity Styles @@ -21,6 +22,7 @@ InfoWindow Adapter MapFragment Press For Marker + InfoWindow FPS: