/**
* Copyright (C) 2013 - 2015 the enviroCar community
*
* This file is part of the enviroCar app.
*
* The enviroCar app is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The enviroCar app is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with the enviroCar app. If not, see http://www.gnu.org/licenses/.
*/
package org.envirocar.app.view.dashboard;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import com.mapbox.mapboxsdk.overlay.PathOverlay;
import com.mapbox.mapboxsdk.overlay.UserLocationOverlay;
import com.mapbox.mapboxsdk.views.MapView;
import com.squareup.otto.Subscribe;
import org.envirocar.app.R;
import org.envirocar.app.events.TrackPathOverlayEvent;
import org.envirocar.app.view.utils.MapUtils;
import org.envirocar.core.injection.BaseInjectorFragment;
import org.envirocar.core.logging.Logger;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.OnTouch;
import rx.Scheduler;
import rx.android.schedulers.AndroidSchedulers;
/**
* @author dewall
*/
public class DashboardTrackMapFragment extends BaseInjectorFragment {
private static final Logger LOG = Logger.getLogger(DashboardTrackMapFragment.class);
@InjectView(R.id.fragment_dashboard_frag_map_mapview)
protected MapView mMapView;
@InjectView(R.id.fragment_dashboard_frag_map_follow_fab)
protected FloatingActionButton mFollowFab;
private PathOverlay mPathOverlay;
private final Scheduler.Worker mMainThreadWorker = AndroidSchedulers.mainThread()
.createWorker();
private boolean mIsFollowingLocation;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
LOG.info("onCreateView()");
setHasOptionsMenu(true);
// First inflate the general dashboard view.
View contentView = inflater.inflate(R.layout.fragment_dashboard_frag_map, container, false);
// Inject all dashboard-related views.
ButterKnife.inject(this, contentView);
// Init the map view
mMapView.setTileSource(MapUtils.getOSMTileLayer());
mMapView.setUserLocationEnabled(true);
mMapView.setUserLocationTrackingMode(UserLocationOverlay.TrackingMode.FOLLOW_BEARING);
mMapView.setUserLocationRequiredZoom(18);
mIsFollowingLocation = true;
mFollowFab.setVisibility(View.INVISIBLE);
// mMapView.setOnTouchListener(new View.OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// mMapView.getUserLocationOverlay().disableFollowLocation();
// mFollowFab.setVisibility(View.VISIBLE);
// return false;
// }
// });
// If the mPathOverlay has already been set, then add the overlay to the mapview.
if (mPathOverlay != null)
mMapView.getOverlays().add(mPathOverlay);
return contentView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// inflate the map menu for the dashboard when this fragment is visible.
inflater.inflate(R.menu.menu_dashboard_map, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@OnTouch(R.id.fragment_dashboard_frag_map_mapview)
protected boolean onTouchMapView() {
if (mIsFollowingLocation) {
// Disable the follow location mode.
UserLocationOverlay userLocationOverlay = mMapView.getUserLocationOverlay();
userLocationOverlay.disableFollowLocation();
mIsFollowingLocation = false;
// show the floating action button that can enable the follow location mode.
showFollowFAB();
}
return false;
}
@OnClick(R.id.fragment_dashboard_frag_map_follow_fab)
protected void onClickFollowFab() {
if (!mIsFollowingLocation) {
UserLocationOverlay userLocationOverlay = mMapView.getUserLocationOverlay();
userLocationOverlay.enableFollowLocation();
userLocationOverlay.goToMyPosition(true); // animated is not working... don't know why
mIsFollowingLocation = true;
hideFollowFAB();
}
}
/**
* Shows the floating action button for toggling the follow location ability.
*/
private void showFollowFAB() {
// load the translate animation.
Animation slideLeft = AnimationUtils.loadAnimation(getActivity(),
R.anim.translate_slide_in_right);
// and start it on the fab.
mFollowFab.startAnimation(slideLeft);
mFollowFab.setVisibility(View.VISIBLE);
}
/**
*
*/
private void hideFollowFAB() {
// load the translate animation.
Animation slideRight = AnimationUtils.loadAnimation(getActivity(),
R.anim.translate_slide_out_right);
// set a listener that makes the button invisible when the animation has finished.
slideRight.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// nothing to do..
}
@Override
public void onAnimationEnd(Animation animation) {
mFollowFab.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
// nothing to do..
}
});
// and start it on the fab.
mFollowFab.startAnimation(slideRight);
}
@Subscribe
public void onReceivePathOverlayEvent(TrackPathOverlayEvent event) {
mMainThreadWorker.schedule(() -> {
mPathOverlay = event.mTrackOverlay;
if (mMapView != null)
mMapView.addOverlay(mPathOverlay);
});
}
}