package net.osmand.core.samples.android.sample1.search;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.core.samples.android.sample1.R;
import net.osmand.core.samples.android.sample1.SampleApplication;
import net.osmand.core.samples.android.sample1.SampleFormatter;
import net.osmand.core.samples.android.sample1.view.DirectionDrawable;
import net.osmand.data.Amenity;
import net.osmand.data.LatLon;
import net.osmand.search.core.SearchPhrase;
import net.osmand.util.Algorithms;
import net.osmand.util.OpeningHoursParser;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class QuickSearchListAdapter extends ArrayAdapter<QuickSearchListItem> {
private SampleApplication app;
private Activity activity;
private LatLon location;
private Float heading;
private boolean useMapCenter;
private int searchMoreItemPosition;
private int screenOrientation;
private int dp56;
private int dp1;
private static final int ITEM_TYPE_REGULAR = 0;
private static final int ITEM_TYPE_SEARCH_MORE = 1;
public interface OnSelectionListener {
void onUpdateSelectionMode(List<QuickSearchListItem> selectedItems);
void reloadData();
}
public QuickSearchListAdapter(SampleApplication app, Activity activity) {
super(app, R.layout.search_list_item);
this.app = app;
this.activity = activity;
dp56 = AndroidUtils.dpToPx(app, 56f);
dp1 = AndroidUtils.dpToPx(app, 1f);
}
public int getScreenOrientation() {
return screenOrientation;
}
public void setScreenOrientation(int screenOrientation) {
this.screenOrientation = screenOrientation;
}
public LatLon getLocation() {
return location;
}
public void setLocation(LatLon location) {
this.location = location;
}
public Float getHeading() {
return heading;
}
public void setHeading(Float heading) {
this.heading = heading;
}
public boolean isUseMapCenter() {
return useMapCenter;
}
public void setUseMapCenter(boolean useMapCenter) {
this.useMapCenter = useMapCenter;
}
public void setListItems(List<QuickSearchListItem> items) {
setNotifyOnChange(false);
clear();
for (QuickSearchListItem item : items) {
add(item);
}
acquireAdditionalItemsPositions();
setNotifyOnChange(true);
notifyDataSetChanged();
}
public void addListItem(QuickSearchListItem item) {
if (searchMoreItemPosition != -1 && item instanceof QuickSearchMoreListItem) {
return;
}
setNotifyOnChange(false);
add(item);
acquireAdditionalItemsPositions();
setNotifyOnChange(true);
notifyDataSetChanged();
}
public void insertListItem(QuickSearchListItem item, int index) {
setNotifyOnChange(false);
insert(item, index);
acquireAdditionalItemsPositions();
setNotifyOnChange(true);
notifyDataSetChanged();
}
private void acquireAdditionalItemsPositions() {
searchMoreItemPosition = -1;
if (getCount() > 0) {
QuickSearchListItem first = getItem(0);
QuickSearchListItem last = getItem(getCount() - 1);
searchMoreItemPosition = last instanceof QuickSearchMoreListItem ? getCount() - 1 : -1;
}
}
@Override
public QuickSearchListItem getItem(int position) {
return super.getItem(position);
}
@Override
public int getItemViewType(int position) {
if (position == searchMoreItemPosition) {
return ITEM_TYPE_SEARCH_MORE;
} else {
return ITEM_TYPE_REGULAR;
}
}
@Override
public int getViewTypeCount() {
return 4;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final QuickSearchListItem listItem = getItem(position);
int viewType = getItemViewType(position);
LinearLayout view;
if (viewType == ITEM_TYPE_SEARCH_MORE) {
if (convertView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
view = (LinearLayout) inflater.inflate(R.layout.search_more_list_item, null);
} else {
view = (LinearLayout) convertView;
}
((TextView) view.findViewById(R.id.title)).setText(listItem.getName());
} else {
if (convertView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
view = (LinearLayout) inflater.inflate(R.layout.search_list_item, null);
} else {
view = (LinearLayout) convertView;
}
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
TextView title = (TextView) view.findViewById(R.id.title);
TextView subtitle = (TextView) view.findViewById(R.id.subtitle);
imageView.setImageDrawable(listItem.getIcon());
String name = listItem.getName();
title.setText(name);
String desc = listItem.getTypeName();
boolean hasDesc = false;
if (!Algorithms.isEmpty(desc) && !desc.equals(name)) {
subtitle.setText(desc);
subtitle.setVisibility(View.VISIBLE);
hasDesc = true;
} else {
subtitle.setVisibility(View.GONE);
}
view.findViewById(R.id.type_name_icon).setVisibility(View.GONE);
TextView timeText = (TextView) view.findViewById(R.id.time);
ImageView timeIcon = (ImageView) view.findViewById(R.id.time_icon);
if (listItem.getSearchResult().object instanceof Amenity
&& ((Amenity) listItem.getSearchResult().object).getOpeningHours() != null) {
Amenity amenity = (Amenity) listItem.getSearchResult().object;
OpeningHoursParser.OpeningHours rs = OpeningHoursParser.parseOpenedHours(amenity.getOpeningHours());
if (rs != null) {
Calendar inst = Calendar.getInstance();
inst.setTimeInMillis(System.currentTimeMillis());
boolean worksNow = rs.isOpenedForTime(inst);
inst.setTimeInMillis(System.currentTimeMillis() + 30 * 60 * 1000); // 30 minutes later
boolean worksLater = rs.isOpenedForTime(inst);
int colorId = worksNow ? worksLater ? R.color.color_ok : R.color.color_intermediate : R.color.color_warning;
timeIcon.setVisibility(View.VISIBLE);
timeText.setVisibility(View.VISIBLE);
timeIcon.setImageDrawable(app.getIconsCache().getIcon("ic_small_time", colorId));
timeText.setTextColor(app.getResources().getColor(colorId));
String rt = rs.getCurrentRuleTime(inst);
timeText.setText(rt == null ? "" : rt);
} else {
timeIcon.setVisibility(View.GONE);
timeText.setVisibility(View.GONE);
}
} else {
timeIcon.setVisibility(View.GONE);
timeText.setVisibility(View.GONE);
}
updateCompassVisibility(view, listItem);
}
view.setBackgroundColor(app.getResources().getColor(R.color.bg_color_light));
View divider = view.findViewById(R.id.divider);
if (divider != null) {
if (position == getCount() - 1) {
divider.setVisibility(View.GONE);
} else {
divider.setVisibility(View.VISIBLE);
if (position + 1 == searchMoreItemPosition) {
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp1);
p.setMargins(0, 0, 0 ,0);
divider.setLayoutParams(p);
} else {
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp1);
p.setMargins(dp56, 0, 0 ,0);
divider.setLayoutParams(p);
}
}
}
return view;
}
private void updateCompassVisibility(View view, QuickSearchListItem listItem) {
View compassView = view.findViewById(R.id.compass_layout);
Location ll = app.getLocationProvider().getLastKnownLocation();
boolean showCompass = location != null && listItem.getSearchResult().location != null;
boolean gpsFixed = ll != null && System.currentTimeMillis() - ll.getTime() < 1000 * 60 * 60 * 20;
if ((gpsFixed || useMapCenter) && showCompass) {
updateDistanceDirection(view, listItem);
compassView.setVisibility(View.VISIBLE);
} else {
if (!showCompass) {
compassView.setVisibility(View.GONE);
} else {
compassView.setVisibility(View.INVISIBLE);
}
}
}
private void updateDistanceDirection(View view, QuickSearchListItem listItem) {
TextView distanceText = (TextView) view.findViewById(R.id.distance);
ImageView direction = (ImageView) view.findViewById(R.id.direction);
SearchPhrase phrase = listItem.getSearchResult().requiredSearchPhrase;
LatLon loc = location;
if(phrase != null && useMapCenter) {
LatLon ol = phrase.getSettings().getOriginalLocation();
if(ol != null) {
loc = ol;
}
}
updateLocationView(useMapCenter, loc,
heading, direction, distanceText,
listItem.getSearchResult().location.getLatitude(),
listItem.getSearchResult().location.getLongitude(),
screenOrientation, app, activity);
}
public static void updateLocationView(boolean useCenter, LatLon fromLoc, Float h,
ImageView arrow, TextView txt, double toLat, double toLon,
int screenOrientation, SampleApplication app, Context ctx) {
updateLocationView(useCenter, fromLoc, h, arrow, 0, txt, new LatLon(toLat, toLon), screenOrientation, app, ctx, true);
}
public static void updateLocationView(boolean useCenter, LatLon fromLoc, Float h,
ImageView arrow, int arrowResId, TextView txt, LatLon toLoc,
int screenOrientation, SampleApplication app, Context ctx, boolean paint) {
float[] mes = new float[2];
if (fromLoc != null && toLoc != null) {
Location.distanceBetween(toLoc.getLatitude(), toLoc.getLongitude(), fromLoc.getLatitude(), fromLoc.getLongitude(), mes);
}
if (arrow != null) {
boolean newImage = false;
if (arrowResId == 0) {
arrowResId = R.drawable.ic_direction_arrow;
}
DirectionDrawable dd;
if(!(arrow.getDrawable() instanceof DirectionDrawable)) {
newImage = true;
dd = new DirectionDrawable(ctx, arrow.getWidth(), arrow.getHeight());
} else {
dd = (DirectionDrawable) arrow.getDrawable();
}
dd.setImage(arrowResId, useCenter ? R.color.color_distance : R.color.color_myloc_distance);
if (fromLoc == null || h == null || toLoc == null) {
dd.setAngle(0);
} else {
dd.setAngle(mes[1] - h + 180 + screenOrientation);
}
if (newImage) {
arrow.setImageDrawable(dd);
}
arrow.invalidate();
}
if (txt != null) {
if (fromLoc != null && toLoc != null) {
if (paint) {
txt.setTextColor(app.getResources().getColor(
useCenter ? R.color.color_distance : R.color.color_myloc_distance));
}
txt.setText(SampleFormatter.getFormattedDistance(mes[0], app));
} else {
txt.setText("");
}
}
}
}