/**
* Copyright (C) 2013 Romain Guefveneu.
*
* This file is part of naonedbus.
*
* Naonedbus 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.
*
* Naonedbus 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.naonedbus.activity.impl;
import java.util.Locale;
import net.naonedbus.R;
import net.naonedbus.activity.map.overlay.BiclooItemizedOverlay;
import net.naonedbus.activity.map.overlay.item.BasicOverlayItem;
import net.naonedbus.bean.Bicloo;
import net.naonedbus.manager.impl.FavoriBiclooManager;
import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.format.DateUtils;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockMapActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class BiclooDetailActivity extends SherlockMapActivity {
public static final String PARAM_BICLOO = "bicloo";
protected static final String NAVIGATION_INTENT = "google.navigation:q=%f,%f";
protected static final String SMS_NAVIGATION_URL = "maps.google.com/?q=%f,%f";
private FavoriBiclooManager mFavoriBiclooManager;
protected TextView mTitle;
protected TextView mAdresse;
protected TextView mPaiement;
protected TextView mBicloosDisponibles;
protected TextView mPlacesDisponibles;
protected TextView mItemDate;
protected TextView mMessage;
protected MapView mMapView;
protected MapController mMapController;
private Bicloo mBicloo;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bicloo_detail);
mFavoriBiclooManager = FavoriBiclooManager.getInstance();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mTitle = (TextView) findViewById(R.id.itemTitle);
mAdresse = (TextView) findViewById(R.id.itemAddress);
mPaiement = (TextView) findViewById(R.id.stationPaiement);
mBicloosDisponibles = (TextView) findViewById(R.id.bicloosDisponibles);
mPlacesDisponibles = (TextView) findViewById(R.id.placesDisponibles);
mItemDate = (TextView) findViewById(R.id.itemDate);
mMessage = (TextView) findViewById(R.id.message);
mMapView = (MapView) findViewById(R.id.map_view);
mMapView.setBuiltInZoomControls(true);
mMapController = mMapView.getController();
mMapController.setZoom(17);
mBicloo = (Bicloo) getIntent().getParcelableExtra(PARAM_BICLOO);
if (mBicloo != null) {
loadParking(mBicloo);
} else {
throw new IllegalArgumentException("Un bicloo doit être renseigné.");
}
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
final MenuInflater menuInflater = getSupportMenuInflater();
menuInflater.inflate(R.menu.activity_bicloo_detail, menu);
final MenuItem menuFavori = menu.findItem(R.id.menu_favori);
final int icon = isFavori() ? R.drawable.ic_star : R.drawable.ic_star_outline;
menuFavori.setIcon(icon);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
final MenuItem menuFavori = menu.findItem(R.id.menu_favori);
final int icon = isFavori() ? R.drawable.ic_star : R.drawable.ic_star_outline;
menuFavori.setIcon(icon);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.menu_navigation:
startNavigation(mBicloo);
break;
case R.id.menu_share:
shareComment(mBicloo);
break;
case R.id.menu_favori:
onStarClick();
break;
}
return super.onOptionsItemSelected(item);
}
private void loadParking(final Bicloo bicloo) {
mTitle.setText(bicloo.getName());
mAdresse.setText(bicloo.getAddress());
mBicloosDisponibles.setText(String.valueOf(bicloo.getAvailableBike()));
mPlacesDisponibles.setText(String.valueOf(bicloo.getAvailableBikeStands()));
mPaiement.setText(bicloo.isBanking() ? R.string.bicloo_paiement_disponible
: R.string.bicloo_paiement_indisponible);
mItemDate.setText(DateUtils.getRelativeTimeSpanString(bicloo.getLastUpdate(), System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS).toString());
if (bicloo.getLocation() != null) {
mMapController.animateTo(getGeoPoint(bicloo));
final BiclooItemizedOverlay itemizedOverlay = new BiclooItemizedOverlay(getResources());
final BasicOverlayItem biclooOverlayItem = new BasicOverlayItem(getGeoPoint(bicloo), bicloo.getName(), null);
itemizedOverlay.addOverlay(biclooOverlayItem);
itemizedOverlay.setFocus(biclooOverlayItem);
mMapView.getOverlays().add(itemizedOverlay);
mMapView.postInvalidate();
} else {
mMapView.setVisibility(View.GONE);
mMessage.setVisibility(View.VISIBLE);
mAdresse.setVisibility(View.GONE);
}
}
/**
* Démarrer Google Navigation vers le bicloo.
*/
private void startNavigation(final Bicloo bicloo) {
final Uri uri = Uri.parse(String.format(Locale.ENGLISH, NAVIGATION_INTENT, bicloo.getLocation().getLatitude(),
bicloo.getLocation().getLongitude()));
final Intent i = new Intent(Intent.ACTION_VIEW, uri);
try {
startActivity(i);
} catch (final ActivityNotFoundException e) {
Toast.makeText(getApplicationContext(), R.string.msg_error_navigation, Toast.LENGTH_LONG).show();
}
}
/**
* Proposer de partager l'information
*/
private void shareComment(final Bicloo bicloo) {
final Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, getBiclooInformation(bicloo));
startActivity(Intent.createChooser(shareIntent, getString(R.string.action_share)));
}
@SuppressLint("NewApi")
private void onStarClick() {
if (isFavori()) {
removeFromFavoris();
Toast.makeText(this, R.string.toast_favori_retire, Toast.LENGTH_SHORT).show();
} else {
addToFavoris();
Toast.makeText(this, R.string.toast_favori_ajout, Toast.LENGTH_SHORT).show();
}
invalidateOptionsMenu();
}
private String getBiclooInformation(final Bicloo bicloo) {
final int availableBikes = bicloo.getAvailableBike();
final int availableStands = bicloo.getAvailableBikeStands();
final String bikes = getResources().getQuantityString(R.plurals.bicloo_velos_disponibles, availableBikes,
availableBikes);
final String stands = getResources().getQuantityString(R.plurals.bicloo_places_disponibles, availableStands,
availableStands);
final String description = getResources().getQuantityString(R.plurals.bicloo, availableBikes + availableStands,
bikes, stands);
final double latitude = bicloo.getLocation().getLatitude();
final double longitude = bicloo.getLocation().getLongitude();
final StringBuilder builder = new StringBuilder();
builder.append(bicloo.getName()).append("\n").append(description).append("\n").append(bicloo.getAddress())
.append("\n")
.append(String.format(Locale.ENGLISH, ParkingDetailActivity.SMS_NAVIGATION_URL, latitude, longitude));
return builder.toString();
}
private boolean isFavori() {
final Bicloo bicloo = mFavoriBiclooManager.getSingle(getContentResolver(), mBicloo.getId());
return (bicloo != null);
}
private void addToFavoris() {
mFavoriBiclooManager.add(getContentResolver(), mBicloo);
}
private void removeFromFavoris() {
mFavoriBiclooManager.remove(getContentResolver(), mBicloo.getId());
}
private GeoPoint getGeoPoint(final Bicloo bicloo) {
return new GeoPoint((int) (bicloo.getLocation().getLatitude() * 1E6), (int) (bicloo.getLocation()
.getLongitude() * 1E6));
}
}