///***
// * Copyright (c) 2010 readyState Software Ltd
// *
// * Licensed under the Apache License, Version 2.0 (the "License"); you may
// * not use this file except in compliance with the License. You may obtain
// * a copy of the License at
// * http://www.apache.org/licenses/LICENSE-2.0
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// *
// */
//
//package com.openvehicles.OVMS.ui.utils;
//
//
//
//import java.lang.reflect.Method;
//import java.util.List;
//
//import android.graphics.drawable.Drawable;
//import android.util.Log;
//import android.view.MotionEvent;
//import android.view.View;
//import android.view.View.OnTouchListener;
//import android.view.ViewGroup.LayoutParams;
//
//import com.google.android.maps.GeoPoint;
//import com.google.android.maps.ItemizedOverlay;
//import com.google.android.maps.MapController;
//import com.google.android.maps.MapView;
//import com.google.android.maps.Overlay;
//import com.google.android.maps.OverlayItem;
//import com.openvehicles.OVMS.R;
//
///**
// * An abstract extension of ItemizedOverlay for displaying an information balloon
// * upon screen-tap of each marker overlay.
// *
// * @author Jeff Gilfelt
// */
//public abstract class BalloonItemizedOverlay<Item extends OverlayItem> extends ItemizedOverlay<Item> {
//
// private MapView mapView;
// private BalloonOverlayView<Item> balloonView;
// private View clickRegion;
// private int viewOffset;
// final MapController mc;
//
// /**
// * Create a new BalloonItemizedOverlay
// *
// * @param defaultMarker - A bounded Drawable to be drawn on the map for each item in the overlay.
// * @param mapView - The view upon which the overlay items are to be drawn.
// */
// public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) {
// super(defaultMarker);
// this.mapView = mapView;
// viewOffset = 0;
// mc = mapView.getController();
// }
//
// /**
// * Set the horizontal distance between the marker and the bottom of the information
// * balloon. The default is 0 which works well for center bounded markers. If your
// * marker is center-bottom bounded, call this before adding overlay items to ensure
// * the balloon hovers exactly above the marker.
// *
// * @param pixels - The padding between the center point and the bottom of the
// * information balloon.
// */
// public void setBalloonBottomOffset(int pixels) {
// viewOffset = pixels;
// }
// public int getBalloonBottomOffset() {
// return viewOffset;
// }
//
// /**
// * Override this method to handle a "tap" on a balloon. By default, does nothing
// * and returns false.
// *
// * @param index - The index of the item whose balloon is tapped.
// * @return true if you handled the tap, otherwise false.
// */
// protected boolean onBalloonTap(int index) {
// return false;
// }
//
// /* (non-Javadoc)
// * @see com.google.android.maps.ItemizedOverlay#onTap(int)
// */
// @Override
// protected final boolean onTap(int index) {
//
// boolean isRecycled;
// final int thisIndex;
// GeoPoint point;
//
// thisIndex = index;
// point = createItem(index).getPoint();
//
// if (balloonView == null) {
// balloonView = createBalloonOverlayView();
// clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout);
// isRecycled = false;
// } else {
// isRecycled = true;
// }
//
// balloonView.setVisibility(View.GONE);
//
// List<Overlay> mapOverlays = mapView.getOverlays();
// if (mapOverlays.size() > 1) {
// hideOtherBalloons(mapOverlays);
// }
//
// balloonView.setData(createItem(index));
//
// MapView.LayoutParams params = new MapView.LayoutParams(
// LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,
// MapView.LayoutParams.BOTTOM_CENTER);
// params.mode = MapView.LayoutParams.MODE_MAP;
//
// setBalloonTouchListener(thisIndex);
//
// balloonView.setVisibility(View.VISIBLE);
//
// if (isRecycled) {
// balloonView.setLayoutParams(params);
// } else {
// mapView.addView(balloonView, params);
// }
//
// mc.animateTo(point);
//
// return true;
// }
//
// /**
// * Creates the balloon view. Override to create a sub-classed view that
// * can populate additional sub-views.
// */
// protected BalloonOverlayView<Item> createBalloonOverlayView() {
// return new BalloonOverlayView<Item>(getMapView().getContext(), getBalloonBottomOffset());
// }
//
// /**
// * Expose map view to subclasses.
// * Helps with creation of balloon views.
// */
// protected MapView getMapView() {
// return mapView;
// }
//
// /**
// * Sets the visibility of this overlay's balloon view to GONE.
// */
// protected void hideBalloon() {
// if (balloonView != null) {
// balloonView.setVisibility(View.GONE);
// }
// }
//
// /**
// * Hides the balloon view for any other BalloonItemizedOverlay instances
// * that might be present on the MapView.
// *
// * @param overlays - list of overlays (including this) on the MapView.
// */
// private void hideOtherBalloons(List<Overlay> overlays) {
//
// for (Overlay overlay : overlays) {
// if (overlay instanceof BalloonItemizedOverlay<?> && overlay != this) {
// ((BalloonItemizedOverlay<?>) overlay).hideBalloon();
// }
// }
//
// }
//
// /**
// * Sets the onTouchListener for the balloon being displayed, calling the
// * overridden onBalloonTap if implemented.
// *
// * @param thisIndex - The index of the item whose balloon is tapped.
// */
// private void setBalloonTouchListener(final int thisIndex) {
//
// try {
// @SuppressWarnings("unused")
// Method m = this.getClass().getDeclaredMethod("onBalloonTap", int.class);
//
// clickRegion.setOnTouchListener(new OnTouchListener() {
// public boolean onTouch(View v, MotionEvent event) {
//
// View l = ((View) v.getParent()).findViewById(R.id.balloon_main_layout);
// Drawable d = l.getBackground();
//
// if (event.getAction() == MotionEvent.ACTION_DOWN) {
// int[] states = {android.R.attr.state_pressed};
// if (d.setState(states)) {
// d.invalidateSelf();
// }
// return true;
// } else if (event.getAction() == MotionEvent.ACTION_UP) {
// int newStates[] = {};
// if (d.setState(newStates)) {
// d.invalidateSelf();
// }
// // call overridden method
// onBalloonTap(thisIndex);
// return true;
// } else {
// return false;
// }
//
// }
// });
//
// } catch (SecurityException e) {
// Log.e("BalloonItemizedOverlay", "setBalloonTouchListener reflection SecurityException");
// return;
// } catch (NoSuchMethodException e) {
// // method not overridden - do nothing
// return;
// }
//
// }
//
//}