package net.osmand.plus.routepointsnavigation;
import java.util.ArrayList;
import java.util.List;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.view.ActionMode;
import android.view.*;
import android.widget.*;
import net.osmand.CallbackWithObject;
import net.osmand.data.LatLon;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.OsmandListActivity;
import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.routepointsnavigation.RoutePointsPlugin.RoutePoint;
import net.osmand.plus.routepointsnavigation.RoutePointsPlugin.SelectedRouteGpxFile;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.DisplayMetrics;
import android.util.TypedValue;
/**
* Created by Bars on 13.06.2014.
*
*/
public class RoutePointsActivity extends OsmandListActivity {
private static final int NAVIGATE_DIALOG_ID = 4;
private static final int OK_ID = 5;
protected static final int MARK_AS_CURRENT_ID = 6;
protected static final int AS_VISITED_ID = 7;
protected static final int POI_ON_MAP_ID = 8;
private RoutePointsPlugin plugin;
private OsmandApplication app;
private RoutePoint selectedItem;
private PointItemAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.app = (OsmandApplication) getApplication();
plugin = OsmandPlugin.getEnabledPlugin(RoutePointsPlugin.class);
super.onCreate(savedInstanceState);
setSupportProgressBarIndeterminateVisibility(false);
getSupportActionBar().setTitle(R.string.route_points_activity);
super.setContentView(R.layout.route_steps_main);
if (plugin.getCurrentRoute() == null) {
selectGPX();
} else {
prepareView();
}
}
private void selectGPX() {
GpxUiHelper.selectGPXFile(this, false, false, new CallbackWithObject<GPXUtilities.GPXFile[]>() {
@Override
public boolean processResult(GPXUtilities.GPXFile[] result) {
final GPXFile gpx = result[0];
app.getSelectedGpxHelper().clearAllGpxFileToShow();
app.getSelectedGpxHelper().selectGpxFile(gpx, true, true);
plugin.setCurrentRoute(gpx);
SelectedRouteGpxFile sgpx = plugin.getCurrentRoute();
if (!sgpx.getCurrentPoints().isEmpty() &&
!sgpx.getCurrentPoints().get(0).isNextNavigate){
sgpx.navigateToNextPoint();
}
prepareView();
return false;
}
});
}
@Override
protected void onResume() {
super.onResume();
if(plugin.getCurrentRoute() != null) {
plugin.getCurrentRoute().updateCurrentTargetPoint();
}
}
private void prepareView() {
TextView gpxName = (TextView) findViewById(R.id.gpx_name);
TextView visited = (TextView) findViewById(R.id.points_count);
String visitedString = "(" + plugin.getVisitedAllString() + ")";
visited.setText(visitedString);
SelectedRouteGpxFile route = plugin.getCurrentRoute();
String fileName;
if(route != null) {
fileName = getString(R.string.rp_current_route) + " " + route.getName();
} else {
fileName = getString(R.string.rp_current_route_not_available);
}
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
float screenWight = displaymetrics.widthPixels - visited.getPaint().measureText(visitedString) - 15;
Paint textPaint = gpxName.getPaint();
String name = fileName;
int i = fileName.length()-1;
for(;;){
float textSize = textPaint.measureText(name);
if (textSize < screenWight){
break;
}
name = fileName.substring(0, i);
i--;
}
SpannableString content = new SpannableString(name);
content.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
selectGPX();
}
}, 0, content.length(), 0);
gpxName.setText(content);
gpxName.setMovementMethod(LinkMovementMethod.getInstance());
adapter = new PointItemAdapter(this, R.layout.route_point_info,
route == null ? new ArrayList<RoutePoint>() :
route.getCurrentPoints());
ListView listView = getListView();
listView.setAdapter(adapter);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
RoutePoint rp = adapter.getItem(position);
getSupportActionBar().startActionMode(getPointActionModeCallback(rp));
adapter.notifyDataSetChanged();
}
private class PointItemAdapter extends ArrayAdapter<RoutePoint> {
public PointItemAdapter(Context context, int textViewResourceId, List<RoutePoint> pointsList) {
super(context, textViewResourceId, pointsList);
}
private class ViewHolder {
ImageView image;
TextView name;
TextView dateOrDistance;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.route_point_info, null);
holder = new ViewHolder();
holder.dateOrDistance = (TextView) convertView.findViewById(R.id.date_or_distance);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.image = (ImageView) convertView.findViewById(R.id.point_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
RoutePoint point = getItem(position);
holder.name.setText(point.getName());
if (selectedItem == point) {
convertView.setBackgroundColor(getResources().getColor(R.color.row_selection_color));
} else {
convertView.setBackgroundColor(Color.TRANSPARENT);
}
if (point.isVisited()) {
holder.image.setImageResource(R.drawable.ic_action_done);
if (point.isDelivered()){
holder.name.setTextColor(getResources().getColor(R.color.osmbug_closed));
} else {
holder.name.setTextColor(getResources().getColor(R.color.color_invalid));
}
holder.dateOrDistance.setTextColor(getResources().getColor(R.color.color_unknown));
holder.dateOrDistance.setText(point.getTime());
holder.dateOrDistance.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
} else {
if (point.isNextNavigate()) {
holder.image.setImageResource(R.drawable.ic_action_signpost_dark);
} else {
holder.image.setImageResource(R.drawable.ic_action_marker_dark);
}
if(position > 0) {
holder.dateOrDistance.setText(point.getDistance(getItem(position - 1)));
} else {
holder.dateOrDistance.setText("");
}
holder.name.setTextColor(getResources().getColor(R.color.color_update));
holder.dateOrDistance.setTextColor(getResources().getColor(R.color.color_distance));
holder.dateOrDistance.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
}
return convertView;
}
}
private void saveGPXAsync() {
new AsyncTask<SelectedRouteGpxFile, Void, Void>() {
protected void onPreExecute() {
//getSherlock().setProgressBarIndeterminateVisibility(true);
}
@Override
protected Void doInBackground(SelectedRouteGpxFile... params) {
if(plugin.getCurrentRoute() != null) {
plugin.getCurrentRoute().saveFile();
}
return null;
}
protected void onPostExecute(Void result) {
//getSherlock().setProgressBarIndeterminateVisibility(false);
}
}.execute(plugin.getCurrentRoute());
}
private ActionMode.Callback getPointActionModeCallback(final RoutePoint rp) {
return new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
selectedItem = rp;
createMenuItem(menu, MARK_AS_CURRENT_ID, R.string.mark_as_current, R.drawable.ic_action_signpost_dark,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
createMenuItem(menu, AS_VISITED_ID, !rp.isVisited() ?
R.string.mark_as_visited : R.string.mark_as_not_visited, R.drawable.ic_action_done,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
createMenuItem(menu, POI_ON_MAP_ID, R.string.shared_string_show_on_map, R.drawable.ic_show_on_map,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
if (menuItem.getItemId() == MARK_AS_CURRENT_ID) {
plugin.getCurrentRoute().navigateToPoint(rp);
saveGPXAsync();
prepareView();
} else if (menuItem.getItemId() == POI_ON_MAP_ID) {
LatLon point = rp.getPoint();
app.getSettings().setMapLocationToShow(point.getLatitude(), point.getLongitude(),
app.getSettings().getMapZoomToShow());
finish();
} else if (menuItem.getItemId() == AS_VISITED_ID) {
// inverts selection state of item
if (!rp.isVisited()){
rp.setDelivered(true);
} else if (rp.isDelivered()){
rp.setDelivered(false);
}
plugin.getCurrentRoute().markPoint(rp, !rp.isVisited());
saveGPXAsync();
prepareView();
}
actionMode.finish();
return true;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
selectedItem = null;
adapter.notifyDataSetChanged();
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
createMenuItem(menu, OK_ID, R.string.shared_string_ok,
R.drawable.ic_show_on_map ,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
createMenuItem(menu, NAVIGATE_DIALOG_ID, R.string.navigate_dialog,
R.drawable.ic_action_gdirections_dark,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == OK_ID) {
finish();
return true;
} else if (item.getItemId() == NAVIGATE_DIALOG_ID){
app.getSettings().navigateDialog();
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}