/*
* #%L
* Wheelmap - App
* %%
* Copyright (C) 2011 - 2012 Michal Harakal - Michael Kroez - Sozialhelden e.V.
* %%
* Wheelmap App based on the Wheelmap Service by Sozialhelden e.V.
*
* 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.
* #L%
*/
package org.wheelmap.android.fragment;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.location.Location;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.ShareActionProvider;
import android.text.Html;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Interpolator;
import android.view.animation.Transformation;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.nineoldandroids.animation.ObjectAnimator;
import org.mapsforge.android.maps.GeoPoint;
import org.mapsforge.android.maps.MapController;
import org.mapsforge.android.maps.MapView;
import org.osmdroid.api.IMapController;
import org.osmdroid.events.MapListener;
import org.osmdroid.events.ScrollEvent;
import org.osmdroid.events.ZoomEvent;
import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase;
import org.osmdroid.tileprovider.tilesource.XYTileSource;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
import org.wheelmap.android.activity.MapActivity;
import org.wheelmap.android.activity.profile.ProfileActivity;
import org.wheelmap.android.adapter.HorizontalImageAdapter;
import org.wheelmap.android.adapter.HorizontalView;
import org.wheelmap.android.adapter.Item;
import org.wheelmap.android.app.WheelmapApp;
import org.wheelmap.android.async.UploadPhotoTask;
import org.wheelmap.android.manager.MyLocationManager;
import org.wheelmap.android.manager.SupportManager;
import org.wheelmap.android.manager.SupportManager.NodeType;
import org.wheelmap.android.manager.SupportManager.WheelchairAttributes;
import org.wheelmap.android.model.Extra;
import org.wheelmap.android.model.POIHelper;
import org.wheelmap.android.model.Request;
import org.wheelmap.android.model.WheelchairFilterState;
import org.wheelmap.android.model.Wheelmap.POIs;
import org.wheelmap.android.modules.UserCredentials;
import org.wheelmap.android.online.BuildConfig;
import org.wheelmap.android.online.R;
import org.wheelmap.android.osmdroid.MyLocationNewOverlayFixed;
import org.wheelmap.android.osmdroid.OnTapListener;
import org.wheelmap.android.osmdroid.POIsCursorOsmdroidOverlay;
import org.wheelmap.android.service.RestService;
import org.wheelmap.android.service.RestServiceHelper;
import org.wheelmap.android.tango.TangoMeasureActivity;
import org.wheelmap.android.tango.TangoUtils;
import org.wheelmap.android.utils.DetachableResultReceiver;
import org.wheelmap.android.utils.DetachableResultReceiver.Receiver;
import org.wheelmap.android.utils.FileUtil;
import org.wheelmap.android.utils.MyLocationProvider;
import org.wheelmap.android.utils.PressSelector;
import org.wheelmap.android.utils.SmoothInterpolator;
import org.wheelmap.android.utils.UtilsMisc;
import org.wheelmap.android.utils.ViewTool;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import de.akquinet.android.androlog.Log;
import de.greenrobot.event.EventBus;
public class POIDetailFragment extends Fragment implements
OnTapListener, LoaderCallbacks<Cursor>, Receiver, OnClickListener, MapListener {
public final static String TAG = POIDetailFragment.class.getSimpleName();
private final static int LOADER_CONTENT = 0;
private static final Interpolator SMOOTH_INTERPOLATOR = new SmoothInterpolator();
private final static long FADE_IN_ANIMATION_DURATION = 500;
private final static int FOCUS_TO_NOTHING = 0;
private final static int FOCUS_TO_ADRESS = 1;
private final static int FOCUS_TO_COMMENT = 2;
private static final int REQUEST_CODE_LOGIN = 42;
private IMapController mMapController;
private static String baseUrl = "http://a.tiles.mapbox.com/v3/%s/";
private static String tileUrl;
private OnlineTileSourceBase mMapBoxTileSource;
private static final float SPAN_ENLARGEMENT_FAKTOR = 1.3f;
private org.osmdroid.views.MapView mMapView;
private int mVerticalDelta;
private final static int VERTICAL_DELTA = 20;
private double mCrrLatitude;
private double mCrrLongitude;
private boolean mHeightFull = true;
private boolean isCentered;
private ImageButton mBtnExpand;
private ImageButton mBtnLocate;
private RelativeLayout layoutMapDetail;
boolean mapFocus = false;
int mHeightLayout = -1;
private POIsCursorOsmdroidOverlay mPoisItemizedOverlay;
private MyLocationNewOverlay mCurrLocationOverlay;
private MyLocationProvider mMyLocationProvider = new MyLocationProvider();
ImageView img_logo;
private Intent pictureActionIntent = null;
long wmID;
Cursor mCursor;
View content;
private TextView nameText;
private TextView categoryText;
private TextView phoneText;
private TextView addressText;
private TextView addressTitle;
private TextView photoTitle;
private LinearLayout photoLayout;
private TextView commentText;
private TextView noCommentText;
private TextView noAdressText;
private TextView noPhotosText;
private TextView commentTitle;
private TextView webText;
private LinearLayout titlebarBackbutton;
private ImageButton buttonTangoMeasure;
private ImageButton buttonPhoto;
private ImageButton buttonEdit;
private ImageButton buttonRoute;
private ImageButton buttonShare;
private TextView nothing;
private ImageView stateIcon;
private TextView accessStateText;
private TextView toiletStateText;
private ViewGroup accessStateLayout;
private ViewGroup toiletStateLayout;
private Button mMapButton;
private Map<WheelchairFilterState, WheelchairAttributes> mWSAttributes;
private Map<WheelchairFilterState, SupportManager.WheelchairToiletAttributes> mWheelchairToiletAttributes;
private WheelchairFilterState mWheelchairAccessFilterState;
private WheelchairFilterState mWheelchairToiletFilterState;
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.wheelchair_access_state_layout:
if (mListener != null) {
mListener.onEditWheelchairState(mWheelchairAccessFilterState);
return;
}
break;
case R.id.wheelchair_toilet_state_layout:
if (mListener != null) {
mListener.onEditWheelchairToiletState(mWheelchairToiletFilterState);
return;
}
break;
default:
}
}
@Override
public boolean onScroll(ScrollEvent event) {
isCentered = false;
return false;
}
@Override
public boolean onZoom(ZoomEvent event) {
isCentered = false;
return false;
}
public interface OnPOIDetailListener {
void onEdit(long poiId, int focus);
void onEditWheelchairState(WheelchairFilterState wState);
void onEditWheelchairToiletState(WheelchairFilterState wState);
void onShowLargeMapAt(GeoPoint point);
void dismissDetailView();
}
private OnPOIDetailListener mListener;
private MapView mapView;
private MapController mapController;
private long poiId;
private ContentValues poiValues;
private final static int ACTION_PROVIDER_DIRECTIONS = 0;
private final static int ACTION_PROVIDER_SHARE = 1;
private ShareActionProvider mShareActionProvider;
private ShareActionProvider mDirectionsActionProvider;
private Menu currentMenu;
private boolean mShowMenu;
private List listImages;
private HorizontalImageAdapter imageAdapter;
private HorizontalView listView;
private AlertDialog dialog;
private ProgressDialog progress;
LinearLayout layoutComment;
LinearLayout layoutAdress;
LinearLayout layoutPhoto;
SensorManager mSensorManager;
Sensor mSensor;
private File new_photo_file;
@SuppressLint("UseSparseArrays")
private final static Map<Integer, Intent> intentSaved = new HashMap<Integer, Intent>();
public static POIDetailFragment newInstance(long id) {
if (id == Extra.ID_UNKNOWN) {
return null;
}
Bundle bundle = new Bundle();
bundle.putLong(Extra.POI_ID, id);
bundle.putBoolean(Extra.SHOW_MAP, true);
POIDetailFragment f = new POIDetailFragment();
f.setArguments(bundle);
return f;
}
public static POIDetailFragment newInstance() {
POIDetailFragment f = new POIDetailFragment();
Bundle bundle = new Bundle();
f.setArguments(bundle);
return f;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnPOIDetailListener) {
mListener = (OnPOIDetailListener) activity;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mWSAttributes = SupportManager.wsAttributes;
mWheelchairToiletAttributes = SupportManager.wheelchairToiletAttributes;
poiId = getArguments().getLong(Extra.POI_ID, Extra.ID_UNKNOWN);
if (!UtilsMisc.isTablet(getActivity().getApplication())) {
tileUrl = String.format(Locale.US, baseUrl, BuildConfig.MAPBOX_API_KEY);
mMapBoxTileSource = new XYTileSource("Mapbox", 3, 21, 256, ".png", new String[]{tileUrl});
EventBus bus = EventBus.getDefault();
mMyLocationProvider.register();
mVerticalDelta = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, (float) VERTICAL_DELTA,
getResources().getDisplayMetrics());
MyLocationManager.LocationEvent event = (MyLocationManager.LocationEvent) bus
.getStickyEvent(MyLocationManager.LocationEvent.class);
Location location = event.location;
mMyLocationProvider.updateLocation(location);
mSensorManager = (SensorManager) getActivity().getSystemService(
Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
}
public void initViews(View v) {
nameText = (TextView) v.findViewById(R.id.titlebar_title);
categoryText = (TextView) v.findViewById(R.id.titlebar_subtitle);
addressTitle = (TextView) v.findViewById(R.id.addr_title);
addressText = (TextView) v.findViewById(R.id.addr);
commentTitle = (TextView) v.findViewById(R.id.comment_title);
commentText = (TextView) v.findViewById(R.id.comment);
accessStateText = (TextView) v.findViewById(R.id.access_state_text);
accessStateLayout = (ViewGroup) v.findViewById(R.id.wheelchair_access_state_layout);
toiletStateText = (TextView) v.findViewById(R.id.toilet_state_text);
toiletStateLayout = (ViewGroup) v.findViewById(R.id.wheelchair_toilet_state_layout);
webText = (TextView) v.findViewById(R.id.web);
phoneText = (TextView) v.findViewById(R.id.phone);
titlebarBackbutton = (LinearLayout) v.findViewById(R.id.titlebar_backbutton);
buttonTangoMeasure = (ImageButton) v.findViewById(R.id.detail_tango_measurement);
buttonPhoto = (ImageButton) v.findViewById(R.id.detail_foto);
buttonEdit = (ImageButton) v.findViewById(R.id.detail_edit);
buttonRoute = (ImageButton) v.findViewById(R.id.detail_route);
buttonShare = (ImageButton) v.findViewById(R.id.detail_share);
nothing = (TextView) v.findViewById(R.id.nothing);
noCommentText = (TextView) v.findViewById(R.id.nocomment);
noAdressText = (TextView) v.findViewById(R.id.noadress);
noPhotosText = (TextView) v.findViewById(R.id.nophotos);
photoTitle = (TextView) v.findViewById(R.id.photo_text);
photoLayout = (LinearLayout) v.findViewById(R.id.photo_layout);
listView = (HorizontalView) v.findViewById(R.id.gallery);
layoutAdress = (LinearLayout) v.findViewById(R.id.layout_detail_adress);
layoutComment = (LinearLayout) v.findViewById(R.id.layout_detail_comment);
layoutPhoto = (LinearLayout) v.findViewById(R.id.photo_layout);
if (!UtilsMisc.isTablet(getActivity().getApplication())) {
layoutMapDetail = (RelativeLayout) v.findViewById(R.id.layout_map_detail);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = null;
if (!UtilsMisc.isTablet(getActivity().getApplicationContext())) {
v = inflater.inflate(R.layout.fragment_detail, container, false);
}
if (UtilsMisc.isTablet(getActivity().getApplicationContext())) {
v = inflater.inflate(R.layout.fragment_detail_tablet, container, false);
}
initViews(v);
ScrollView scrollView = (ScrollView) v.findViewById(R.id.scrollView);
scrollView.requestDisallowInterceptTouchEvent(true);
View closeButton = v.findViewById(R.id.titlebar_backbutton);
closeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListener.dismissDetailView();
}
});
mShowMenu = false;
closeButton.setVisibility(View.GONE);
if (!UtilsMisc.isTablet(getActivity().getApplicationContext())) {
closeButton.setVisibility(View.GONE);
}
buttonTangoMeasure.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startTangoMeasurement();
}
});
buttonPhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startPickPhotoDialog();
}
});
buttonEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onEdit(poiId, FOCUS_TO_NOTHING);
}
}
});
buttonRoute.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(Intent.createChooser(intentSaved.get(ACTION_PROVIDER_DIRECTIONS),
getString(R.string.menu_directions)));
return;
}
});
buttonShare.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(Intent.createChooser(intentSaved.get(ACTION_PROVIDER_SHARE),
getString(R.string.menu_share)));
return;
}
});
layoutComment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onEdit(poiId, FOCUS_TO_COMMENT);
}
}
});
layoutAdress.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onEdit(poiId, FOCUS_TO_ADRESS);
}
}
});
layoutPhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startPickPhotoDialog();
}
});
if (!UtilsMisc.isTablet(getActivity().getApplication())) {
mMapView = (org.osmdroid.views.MapView) v.findViewById(R.id.map_detail);
mBtnExpand = (ImageButton) v.findViewById(R.id.map_btn_expand);
mBtnLocate = (ImageButton) v.findViewById(R.id.center_poi);
mMapView.setTileSource(mMapBoxTileSource);
mMapView.setBuiltInZoomControls(false);
mMapView.setMultiTouchControls(true);
setHardwareAccelerationOff();
mMapView.setMapListener(this);
mPoisItemizedOverlay = new POIsCursorOsmdroidOverlay(getActivity(), this);
mMapView.getOverlays().add(mPoisItemizedOverlay);
MyLocationNewOverlayFixed a = new MyLocationNewOverlayFixed(mMyLocationProvider,
mMapView);
a.disableFollowLocation();
a.enableMyLocation();
mMapView.getOverlays().add(a);
mMapController = mMapView.getController();
mMapController.setZoom(18);
//mMapController.setCenter(new org.osmdroid.mapsforge.wrapper.GeoPoint(new GeoPoint(mCrrLatitude, mCrrLongitude)));
mBtnExpand.setOnTouchListener(new PressSelector());
mBtnExpand.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mapFocus) {
mBtnExpand.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_detail_expand));
mapFocus = false;
HeightAnimation heightAnim = new HeightAnimation(layoutMapDetail, layoutMapDetail.getHeight(), mHeightLayout);
heightAnim.setDuration(1000);
layoutMapDetail.startAnimation(heightAnim);
} else if (!mapFocus) {
mBtnExpand.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_detail_collapse));
mapFocus = true;
if (mHeightLayout <= 0) {
mHeightLayout = layoutMapDetail.getHeight();
}
HeightAnimation heightAnim = new HeightAnimation(layoutMapDetail, mHeightLayout, content.getHeight());
heightAnim.setDuration(1000);
layoutMapDetail.startAnimation(heightAnim);
}
}
});
mBtnLocate.setOnTouchListener(new PressSelector());
mBtnLocate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
org.osmdroid.util.GeoPoint geoPoint = new org.osmdroid.util.GeoPoint(mCrrLatitude,
mCrrLongitude);
if (mMapView != null) {
centerMap(geoPoint, true, true);
}
}
});
v.findViewById(R.id.map_btn_locate).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mMapView != null && mMyLocationProvider.getLastKnownLocation() != null) {
Location location = mMyLocationProvider.getLastKnownLocation();
org.osmdroid.util.GeoPoint geoPoint = new org.osmdroid.util.GeoPoint(location.getLatitude(),
location.getLongitude());
centerMap(geoPoint, true, true);
}
}
});
}
content = v;
return v;
}
private void setupUI() {
if (this.getActivity() != null) {
imageAdapter = new HorizontalImageAdapter(this.getActivity(), listImages);
listView.setAdapter(imageAdapter);
listView.setOnItemClickListener(imageAdapter);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setHardwareAccelerationOff() {
// Turn off hardware acceleration here, or in manifest
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mMapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
}
private void getImagesList() {
listImages = null;
try {
WheelmapApp app = (WheelmapApp) this.getActivity().getApplication();
listImages = app.getListImages();
} catch (Exception e) {
e.printStackTrace();
}
if (listImages != null) {
try {
if (listImages.isEmpty()) {
noPhotosText.setVisibility(View.VISIBLE);
listView.setVisibility(View.GONE);
} else {
noPhotosText.setVisibility(View.GONE);
listView.setVisibility(View.VISIBLE);
}
} catch (Exception ex) {
Log.d(ex.getMessage());
}
}
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
accessStateLayout.setOnClickListener(this);
if (poiId == Extra.ID_UNKNOWN) {
accessStateLayout.setVisibility(View.INVISIBLE);
}
toiletStateLayout.setOnClickListener(this);
if (poiId == Extra.ID_UNKNOWN) {
toiletStateLayout.setVisibility(View.INVISIBLE);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_CONTENT, null, this);
super.onActivityCreated(savedInstanceState);
if (mMapView != null) {
((MapActivity) getActivity()).registerMapView(mMapView);
executeConfig(savedInstanceState);
}
}
private void executeConfig(Bundle savedInstanceState) {
if (((MapActivity) getActivity()).loadPreferences(mMapView)) {
Log.d(TAG, "executeConfig: initialized from preferences");
return;
}
}
@Override
public void onStart() {
super.onStart();
float startValue = 0.0f;
float endValue = 1.0f;
ObjectAnimator anim = ObjectAnimator.ofFloat(getView(),
"alpha", startValue, endValue);
anim.setInterpolator(SMOOTH_INTERPOLATOR);
anim.setDuration(FADE_IN_ANIMATION_DURATION);
anim.start();
}
@Override
public void onStop() {
super.onStop();
mMyLocationProvider.unregister();
}
@Override
public void onDestroyView() {
super.onDestroyView();
//WheelmapApp.getSupportManager().cleanReferences();
if (mMapView != null) {
((MapActivity) getActivity()).unregisterMapView(mMapView);
}
ViewTool.nullViewDrawables(getView());
mapView = null;
mapController = null;
System.gc();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//don't add options in tablet-mode
if (!getArguments().containsKey(Extra.SHOW_MAP)) {
return;
}
Log.d(TAG, "onCreateOptionsMenu");
inflater.inflate(R.menu.ab_detail_fragment, menu);
createShareActionProvider(menu);
currentMenu = menu;
menu.setGroupVisible(R.id.menugroup_detailview, mShowMenu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
Log.d(TAG, "onPrepareOptionsMenu");
}
private void createShareActionProvider(Menu menu) {
MenuItem menuItemShare = menu.findItem(R.id.menu_share);
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItemShare);
mShareActionProvider
.setShareHistoryFileName("ab_provider_share_history.xml");
setIntentOnActionProvider(ACTION_PROVIDER_SHARE, mShareActionProvider);
MenuItem menuItemDirection = menu.findItem(R.id.menu_directions);
mDirectionsActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItemDirection);
mDirectionsActionProvider
.setShareHistoryFileName("ab_provider_directions_history.xml");
setIntentOnActionProvider(ACTION_PROVIDER_DIRECTIONS,
mDirectionsActionProvider);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
default:
return super.onOptionsItemSelected(item);
}
}
public long getPoiId() {
return poiId;
}
@Override
public void onTap(OverlayItem item, ContentValues values) {
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arguments) {
if (poiId == Extra.ID_UNKNOWN) {
poiId = 0;
}
Uri uri = ContentUris.withAppendedId(POIs.CONTENT_URI_COPY, poiId);
return new CursorLoader(getActivity(), uri, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
Log.d(TAG, "onLoadFinished: poiid = " + poiId);
if (cursor == null) {
return;
}
mCursor = cursor;
mCursor.moveToFirst();
load(cursor);
try {
wmID = Long.valueOf(POIHelper.getWMId(cursor));
getPhotos(wmID);
} catch (Exception e) {
}
if (!UtilsMisc.isTablet(getActivity().getApplication())) {
createPOIForDetailMap();
mMapView.postInvalidate();
}
}
public void createPOIForDetailMap() {
if (mCursor != null && mCursor.getCount() > 0) {
mCursor.moveToFirst();
ArrayList<OverlayItem> overlayItemArray = new ArrayList<OverlayItem>();
OverlayItem item = POIsCursorOsmdroidOverlay.getFromCursor(getActivity(), mCursor);
overlayItemArray.add(item);
// remove all previous overlays
for (int i = mMapView.getOverlays().size() - 1; i >= 0; i--) {
Overlay overlay = mMapView.getOverlays().get(i);
if (overlay instanceof ItemizedIconOverlay) {
mMapView.getOverlays().remove(i);
}
}
ItemizedIconOverlay<OverlayItem> myItemizedIconOverlay = new ItemizedIconOverlay<>(overlayItemArray, null, getActivity());
mMapView.getOverlays().add(myItemizedIconOverlay);
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
}
public void load(Cursor c) {
mCursor = c;
if (c == null || c.getCount() < 1 || getPoiId() == -1) {
titlebarBackbutton.setVisibility(View.GONE);
addressTitle.setVisibility(View.GONE);
addressText.setVisibility(View.GONE);
commentText.setVisibility(View.GONE);
commentTitle.setVisibility(View.GONE);
buttonTangoMeasure.setVisibility(View.GONE);
buttonPhoto.setVisibility(View.GONE);
buttonEdit.setVisibility(View.GONE);
buttonRoute.setVisibility(View.GONE);
buttonShare.setVisibility(View.GONE);
nameText.setVisibility(View.GONE);
categoryText.setVisibility(View.GONE);
accessStateText.setVisibility(View.GONE);
accessStateLayout.setVisibility(View.GONE);
toiletStateText.setVisibility(View.GONE);
toiletStateLayout.setVisibility(View.GONE);
webText.setVisibility(View.GONE);
phoneText.setVisibility(View.GONE);
photoTitle.setVisibility(View.GONE);
photoLayout.setVisibility(View.GONE);
noCommentText.setVisibility(View.GONE);
noAdressText.setVisibility(View.GONE);
noPhotosText.setVisibility(View.GONE);
nothing.setVisibility(View.VISIBLE);
return;
} else {
c.moveToFirst();
if (getActivity() != null && getActivity().getApplication() != null)
if (!UtilsMisc.isTablet(getActivity().getApplication())) {
mCrrLongitude = POIHelper.getLongitude(c);
mCrrLatitude = POIHelper.getLatitude(c);
org.osmdroid.util.GeoPoint geoPoint = new org.osmdroid.util.GeoPoint(mCrrLatitude,
mCrrLongitude);
if (mMapView != null) {
centerMap(geoPoint, true);
}
}
titlebarBackbutton.setVisibility(View.VISIBLE);
addressTitle.setVisibility(View.VISIBLE);
addressText.setVisibility(View.VISIBLE);
commentText.setVisibility(View.VISIBLE);
commentTitle.setVisibility(View.VISIBLE);
if (TangoUtils.isTangoSupported()) {
buttonTangoMeasure.setVisibility(View.VISIBLE);
} else {
buttonTangoMeasure.setVisibility(View.GONE);
}
buttonPhoto.setVisibility(View.VISIBLE);
buttonEdit.setVisibility(View.VISIBLE);
buttonRoute.setVisibility(View.VISIBLE);
buttonShare.setVisibility(View.VISIBLE);
nameText.setVisibility(View.VISIBLE);
categoryText.setVisibility(View.VISIBLE);
accessStateText.setVisibility(View.VISIBLE);
accessStateLayout.setVisibility(View.VISIBLE);
toiletStateText.setVisibility(View.VISIBLE);
toiletStateLayout.setVisibility(View.VISIBLE);
webText.setVisibility(View.VISIBLE);
phoneText.setVisibility(View.VISIBLE);
photoTitle.setVisibility(View.VISIBLE);
photoLayout.setVisibility(View.VISIBLE);
nothing.setVisibility(View.GONE);
poiId = POIHelper.getId(c);
String wmIdString = POIHelper.getWMId(c);
WheelchairFilterState accessState = POIHelper.getWheelchair(c);
WheelchairFilterState toiletState = POIHelper.getWheelchairToilet(c);
if (accessState == WheelchairFilterState.NO_PREFERENCE) {
accessState = WheelchairFilterState.UNKNOWN;
}
if (toiletState == WheelchairFilterState.NO_PREFERENCE) {
toiletState = WheelchairFilterState.TOILET_UNKNOWN;
}
String name = POIHelper.getName(c);
String comment = POIHelper.getComment(c);
String website = POIHelper.getWebsite(c);
String phone = POIHelper.getPhone(c);
String street = POIHelper.getStreet(c);
String houseNum = POIHelper.getHouseNumber(c);
String postCode = POIHelper.getPostcode(c);
String city = POIHelper.getCity(c);
String address = "";
if (street != null) {
address += street + " ";
}
if (houseNum != null) {
address += houseNum + " ";
}
if (postCode != null) {
address += "\n";
address += postCode + " ";
}
if (city != null) {
address += city + " ";
}
int checkIfAdress = 3;
if (address == "") {
addressText.setVisibility(View.GONE);
checkIfAdress--;
} else {
addressText.setVisibility(View.VISIBLE);
addressText.setText(address);
}
if (phone != null) {
phoneText.setVisibility(View.VISIBLE);
phoneText.setText(phone);
} else {
phoneText.setVisibility(View.GONE);
checkIfAdress--;
}
if (website != null) {
webText.setVisibility(View.VISIBLE);
webText.setClickable(true);
String text = "<a href=" + website + ">" + website + "</a>";
webText.setText(Html.fromHtml(text));
webText.setMovementMethod(LinkMovementMethod.getInstance());
} else {
webText.setVisibility(View.GONE);
checkIfAdress--;
}
if (checkIfAdress == 0)
noAdressText.setVisibility(View.VISIBLE);
else
noAdressText.setVisibility(View.GONE);
if (comment == null) {
commentText.setVisibility(View.GONE);
noCommentText.setVisibility(View.VISIBLE);
} else {
commentText.setVisibility(View.VISIBLE);
noCommentText.setVisibility(View.GONE);
}
final double latitude = POIHelper.getLatitude(c);
final double longitude = POIHelper.getLongitude(c);
int nodeTypeId = POIHelper.getNodeTypeId(c);
int categoryId = POIHelper.getCategoryId(c);
SupportManager sm = WheelmapApp.getSupportManager();
NodeType nodeType = sm.lookupNodeType(nodeTypeId);
accessStateLayout.setVisibility(View.VISIBLE);
setWheelchairAccessState(accessState);
toiletStateLayout.setVisibility(View.VISIBLE);
setWheelchairToiletState(toiletState);
if (name != null && name.length() > 0) {
nameText.setText(name);
} else {
nameText.setText(nodeType.localizedName);
}
String category = sm.lookupCategory(categoryId).localizedName;
categoryText.setText(category);
commentText.setText(comment);
fillDirectionsActionProvider(latitude, longitude, street, houseNum,
postCode, city);
fillShareActionProvider(wmIdString, name, nodeType.localizedName,
comment, address);
mShowMenu = true;
getActivity().invalidateOptionsMenu();
poiValues = new ContentValues();
DatabaseUtils.cursorRowToContentValues(c, poiValues);
}
}
private void setWheelchairAccessState(WheelchairFilterState newState) {
mWheelchairAccessFilterState = newState;
try {
if (mWheelchairAccessFilterState.getId() == WheelchairFilterState.UNKNOWN.getId())
accessStateText.setBackgroundResource(R.drawable.detail_button_grey);
else if (mWheelchairAccessFilterState.getId() == WheelchairFilterState.YES.getId())
accessStateText.setBackgroundResource(R.drawable.detail_button_green);
else if (mWheelchairAccessFilterState.getId() == WheelchairFilterState.LIMITED.getId())
accessStateText.setBackgroundResource(R.drawable.detail_button_orange);
else if (mWheelchairAccessFilterState.getId() == WheelchairFilterState.NO.getId())
accessStateText.setBackgroundResource(R.drawable.detail_button_red);
else if (mWheelchairAccessFilterState.getId() == WheelchairFilterState.NO_PREFERENCE.getId())
accessStateText.setBackgroundResource(R.drawable.detail_button_grey);
else
accessStateText.setBackgroundResource(R.drawable.detail_button_grey);
} catch (OutOfMemoryError e) {
System.gc();
}
accessStateText.setText(mWSAttributes.get(newState).titleStringId);
}
private void setWheelchairToiletState(WheelchairFilterState newState) {
mWheelchairToiletFilterState = newState;
try {
if (mWheelchairToiletFilterState.getId() == WheelchairFilterState.TOILET_UNKNOWN.getId())
toiletStateText.setBackgroundResource(R.drawable.detail_button_grey);
else if (mWheelchairToiletFilterState.getId() == WheelchairFilterState.TOILET_YES.getId())
toiletStateText.setBackgroundResource(R.drawable.detail_button_green);
else if (mWheelchairToiletFilterState.getId() == WheelchairFilterState.TOILET_NO.getId())
toiletStateText.setBackgroundResource(R.drawable.detail_button_red);
else if (mWheelchairToiletFilterState.getId() == WheelchairFilterState.NO_PREFERENCE.getId())
toiletStateText.setBackgroundResource(R.drawable.detail_button_grey);
else
toiletStateText.setBackgroundResource(R.drawable.detail_button_grey);
} catch (OutOfMemoryError e) {
System.gc();
}
toiletStateText.setText(mWheelchairToiletAttributes.get(newState).titleStringId);
}
private Intent createExternIntent(String action) {
Intent intent = new Intent(action);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
return intent;
}
private void fillDirectionsActionProvider(double lat, double lon,
String street, String houseNum, String postCode, String city) {
Uri geoURI;
String latitude = Double.toString(lat);
String longitude = Double.toString(lon);
if (!TextUtils.isEmpty(street) && !TextUtils.isEmpty(houseNum)
&& !TextUtils.isEmpty(postCode) && !TextUtils.isEmpty(city)) {
StringBuilder sb = new StringBuilder();
sb.append(street).append("+").append(houseNum).append("+")
.append(postCode).append("+").append(city);
geoURI = Uri.parse("geo:" + latitude + "," + longitude + "?q="
+ sb.toString().replace(" ", "+"));
} else {
StringBuilder sb = new StringBuilder();
sb.append(latitude).append("+").append(longitude);
geoURI = Uri.parse("geo:" + latitude + "," + longitude + "?q="
+ sb.toString().replace(" ", "+"));
}
Log.d(TAG, "geoURI = " + geoURI);
Intent intent = createExternIntent(Intent.ACTION_VIEW);
intent.setData(geoURI);
setIntentOrStore(ACTION_PROVIDER_DIRECTIONS, intent,
mDirectionsActionProvider);
}
private void fillShareActionProvider(String wmId, String name, String type,
String comment, String address) {
StringBuilder sb = new StringBuilder();
if (!TextUtils.isEmpty(name)) {
sb.append(name);
} else {
sb.append(type);
}
if (sb.length() > 0) {
sb.append(" - ");
}
sb.append("http://wheelmap.org/nodes/" + wmId);
sb.append("\n");
sb.append("#MapMyDay");
Intent intent = createExternIntent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, sb.toString());
setIntentOrStore(ACTION_PROVIDER_SHARE, intent, mShareActionProvider);
}
private void setIntentOrStore(int apKey, Intent intent,
ShareActionProvider provider) {
intentSaved.put(apKey, intent);
if (provider != null) {
provider.setShareIntent(intent);
}
}
private void setIntentOnActionProvider(int apKey,
ShareActionProvider provider) {
if (intentSaved.containsKey(apKey)) {
provider.setShareIntent(intentSaved.get(apKey));
}
}
public void showDetail(long id) {
Log.d(TAG, "show id: " + id);
poiId = id;
if (getLoaderManager() != null) {
getLoaderManager().restartLoader(LOADER_CONTENT, null, this);
}
}
public void reloadData() {
if (getLoaderManager() != null) {
getLoaderManager().restartLoader(LOADER_CONTENT, null, this);
}
}
public void getPhotos(long wm_id) {
if (imageAdapter != null) {
imageAdapter.clear();
}
DetachableResultReceiver r = new DetachableResultReceiver(new Handler());
r.setReceiver(this);
RestServiceHelper.retrievePhotosById(getActivity(), wm_id, r);
}
/**
* {@inheritDoc}
*/
public void onReceiveResult(int resultCode, Bundle resultData) {
Log.d(TAG, "onReceiveResult resultCode = " + resultCode);
switch (resultCode) {
case RestService.STATUS_RUNNING: {
break;
}
case RestService.STATUS_FINISHED: {
getImagesList();
setupUI();
break;
}
case RestService.STATUS_ERROR: {
break;
}
}
}
private void startTangoMeasurement() {
// user must be logged in
UserCredentials credentials = new UserCredentials(getActivity());
if (!credentials.isLoggedIn()) {
Intent intent = new Intent(getActivity(), ProfileActivity.class);
startActivityForResult(intent, REQUEST_CODE_LOGIN);
return;
}
Intent intent = TangoMeasureActivity.newIntent(getContext(), wmID);
startActivity(intent);
}
private void startPickPhotoDialog() {
// user must be logged in
UserCredentials credentials = new UserCredentials(getActivity());
if (!credentials.isLoggedIn()) {
Intent intent = new Intent(getActivity(), ProfileActivity.class);
startActivityForResult(intent, REQUEST_CODE_LOGIN);
return;
}
final Item[] items = {new Item(getString(R.string.photo_upload_picker_gallery), android.R.drawable.ic_menu_gallery), new Item(getString(R.string.photo_upload_picker_take_new), android.R.drawable.ic_menu_camera)};
final ListAdapter adapter = new ArrayAdapter<Item>(this.getActivity(), android.R.layout.select_dialog_item, android.R.id.text1, items) {
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
TextView tv = (TextView) v.findViewById(android.R.id.text1);
tv.setCompoundDrawablesWithIntrinsicBounds(items[position].icon, 0, 0, 0);
int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
tv.setCompoundDrawablePadding(dp5);
return v;
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
builder.setTitle(R.string.photo_upload_picker_title);
builder.setCancelable(true);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
startGetPhotoFromGalleryIntent();
} else if (which == 1) {
Intent intent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
new_photo_file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png");
Uri pictureURI = Uri.fromFile(new_photo_file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureURI);
startActivityForResult(intent,
Request.REQUESTCODE_PHOTO_FROM_CAMERA);
}
}
});
dialog = builder.create();
dialog.show();
}
public void startGetPhotoFromGalleryIntent() {
if (Build.VERSION.SDK_INT < 19) {
Intent intent = new Intent();
intent.setType("image/jpeg");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,
Request.REQUESTCODE_PHOTO);
} else {
final String ACTION_OPEN_DOCUMENT = "android.intent.action.OPEN_DOCUMENT";
Intent intent = new Intent(ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/jpeg");
startActivityForResult(intent, Request.GALLERY_KITKAT_INTENT_CALLED);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == Request.REQUESTCODE_PHOTO
|| requestCode == Request.GALLERY_KITKAT_INTENT_CALLED) {
handlePhotoIntentResult(requestCode, resultCode, data);
return;
}
if (requestCode == Request.REQUESTCODE_PHOTO_FROM_CAMERA) {
if (new_photo_file != null) {
uploadPhoto(new_photo_file);
new_photo_file = null;
}
}
}
@SuppressLint("NewApi")
private void handlePhotoIntentResult(int requestCode, int resultCode, Intent data) {
File photoFile = null;
if (data != null && data.getData() == null) {
if (data.getExtras().get("data") != null) {
try {
Bitmap image = (Bitmap) data.getExtras().get("data");
photoFile = UtilsMisc.createImageFile(getActivity());
FileOutputStream fOut = new FileOutputStream(photoFile);
image.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
} catch (Exception e) {
}
}
} else if (data != null && data.getData() != null) {
Uri photo = data.getData();
String path = FileUtil.getPath(getActivity(), photo);
if (path != null) {
photoFile = new File(path);
} else {
try {
photoFile = new File(UtilsMisc.getFilePathFromContentUri(photo,
getActivity().getContentResolver()));
} catch (Exception e) {
}
}
}
if (photoFile != null) {
uploadPhoto(photoFile);
} else {
//TODO but should never happen
}
}
File photoFile;
public void uploadPhoto(File photoFile) {
this.photoFile = photoFile;
if (photoFile != null) {
if (progress == null) {
progress = new ProgressDialog(getActivity());
progress.setMessage(getString(R.string.photo_upload_progress_title));
progress.show();
} else {
if (progress.isShowing()) {
return;
}
progress.show();
}
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
Log.d(TAG, "photo to upload: " + photoFile + "");
UploadPhotoTask upload = new UploadPhotoTask(mCursor, this, getActivity().getApplication(), progress, wmID);
upload.execute(photoFile);
photoFile = null;
}
}
@Override
public void onResume() {
super.onResume();
if (!UtilsMisc.isTablet(getActivity().getApplication())) {
mSensorManager.registerListener(mMyLocationProvider, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
public void onDestroy() {
if (progress != null) {
progress.dismiss();
progress = null;
}
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
super.onDestroy();
}
private void centerMap(org.osmdroid.util.GeoPoint geoPoint, boolean force) {
Log.d(TAG, "CenterMap");
centerMap(geoPoint, force, false);
}
private void centerMap(org.osmdroid.util.GeoPoint geoPoint, boolean force, boolean animated) {
Log.d(TAG, "centerMap: force = " + force + " isCentered = "
+ isCentered + " geoPoint = " + geoPoint);
if (force) {
if (animated) {
mMapController.animateTo(geoPoint);
} else {
mMapController.setCenter(geoPoint);
}
isCentered = true;
}
}
}
/**
* an animation for resizing the view.
*/
class HeightAnimation extends Animation {
protected final int originalHeight;
protected final View view;
protected float perValue;
public HeightAnimation(View view, int fromHeight, int toHeight) {
this.view = view;
this.originalHeight = fromHeight;
this.perValue = (toHeight - fromHeight);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
view.getLayoutParams().height = (int) (originalHeight + perValue * interpolatedTime);
view.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
}