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: