package net.osmand.plus.osmedit;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.PlatformUtil;
import net.osmand.osm.edit.OSMSettings;
import net.osmand.plus.R;
import net.osmand.plus.base.BaseOsmAndFragment;
import net.osmand.plus.osmedit.dialogs.OpeningHoursDaysDialogFragment;
import net.osmand.plus.osmedit.dialogs.OpeningHoursHoursDialogFragment;
import net.osmand.util.Algorithms;
import net.osmand.util.OpeningHoursParser;
import net.osmand.util.OpeningHoursParser.BasicOpeningHourRule;
import org.apache.commons.logging.Log;
import gnu.trove.list.array.TIntArrayList;
public class BasicEditPoiFragment extends BaseOsmAndFragment
implements EditPoiDialogFragment.OnFragmentActivatedListener {
private static final Log LOG = PlatformUtil.getLog(BasicEditPoiFragment.class);
private static final String OPENING_HOURS = "opening_hours";
private EditText streetEditText;
private EditText houseNumberEditText;
private EditText phoneEditText;
private EditText webSiteEditText;
private EditText descriptionEditText;
OpeningHoursAdapter mOpeningHoursAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_edit_poi_normal, container, false);
TypedValue typedValue = new TypedValue();
Resources.Theme theme = getActivity().getTheme();
theme.resolveAttribute(android.R.attr.textColorSecondary, typedValue, true);
int iconColor = typedValue.data;
ImageView streetImageView = (ImageView) view.findViewById(R.id.streetImageView);
streetImageView.setImageDrawable(
getPaintedContentIcon(R.drawable.ic_action_street_name, iconColor));
ImageView houseNumberImageView = (ImageView) view.findViewById(R.id.houseNumberImageView);
houseNumberImageView.setImageDrawable(
getPaintedContentIcon(R.drawable.ic_action_building_number, iconColor));
ImageView phoneImageView = (ImageView) view.findViewById(R.id.phoneImageView);
phoneImageView.setImageDrawable(
getPaintedContentIcon(R.drawable.ic_action_call_dark, iconColor));
ImageView webSiteImageView = (ImageView) view.findViewById(R.id.webSiteImageView);
webSiteImageView.setImageDrawable(
getPaintedContentIcon(R.drawable.ic_world_globe_dark, iconColor));
ImageView descriptionImageView = (ImageView) view.findViewById(R.id.descriptionImageView);
descriptionImageView.setImageDrawable(
getPaintedContentIcon(R.drawable.ic_action_description, iconColor));
ImageView openingHoursImageView = (ImageView) view.findViewById(R.id.openingHoursImageView);
openingHoursImageView.setImageDrawable(
getPaintedContentIcon(R.drawable.ic_action_time, iconColor));
streetEditText = (EditText) view.findViewById(R.id.streetEditText);
houseNumberEditText = (EditText) view.findViewById(R.id.houseNumberEditText);
phoneEditText = (EditText) view.findViewById(R.id.phoneEditText);
webSiteEditText = (EditText) view.findViewById(R.id.webSiteEditText);
descriptionEditText = (EditText) view.findViewById(R.id.descriptionEditText);
addTextWatcher(OSMSettings.OSMTagKey.ADDR_STREET.getValue(), streetEditText);
addTextWatcher(OSMSettings.OSMTagKey.WEBSITE.getValue(), webSiteEditText);
addTextWatcher(OSMSettings.OSMTagKey.PHONE.getValue(), phoneEditText);
addTextWatcher(OSMSettings.OSMTagKey.ADDR_HOUSE_NUMBER.getValue(), houseNumberEditText);
addTextWatcher(OSMSettings.OSMTagKey.DESCRIPTION.getValue(), descriptionEditText);
Button addOpeningHoursButton = (Button) view.findViewById(R.id.addOpeningHoursButton);
addOpeningHoursButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BasicOpeningHourRule rule = new BasicOpeningHourRule();
rule.setStartTime(9 * 60);
rule.setEndTime(18 * 60);
OpeningHoursDaysDialogFragment fragment = OpeningHoursDaysDialogFragment.createInstance(rule, -1);
fragment.show(getChildFragmentManager(), "OpenTimeDialogFragment");
}
});
LinearLayout openHoursContainer = (LinearLayout) view.findViewById(R.id.openHoursContainer);
Drawable clockDrawable = getPaintedContentIcon(R.drawable.ic_action_time, iconColor);
Drawable deleteDrawable = getPaintedContentIcon(R.drawable.ic_action_remove_dark, iconColor);
if (savedInstanceState != null && savedInstanceState.containsKey(OPENING_HOURS)) {
mOpeningHoursAdapter = new OpeningHoursAdapter(
(OpeningHoursParser.OpeningHours) savedInstanceState.getSerializable(OPENING_HOURS),
openHoursContainer, getData(), clockDrawable, deleteDrawable);
mOpeningHoursAdapter.updateViews();
} else {
mOpeningHoursAdapter = new OpeningHoursAdapter(new OpeningHoursParser.OpeningHours(),
openHoursContainer, getData(), clockDrawable, deleteDrawable);
}
onFragmentActivated();
return view;
}
protected void addTextWatcher(final String tag, final EditText e) {
e.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!getData().isInEdit()) {
if (!TextUtils.isEmpty(s)) {
getData().putTag(tag, s.toString());
} else {
getData().removeTag(tag);
}
}
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putSerializable(OPENING_HOURS, mOpeningHoursAdapter.openingHours);
super.onSaveInstanceState(outState);
}
public void setBasicOpeningHoursRule(BasicOpeningHourRule item, int position) {
mOpeningHoursAdapter.setOpeningHoursRule(item, position);
}
private EditPoiDialogFragment getEditPoiFragment() {
return (EditPoiDialogFragment) getParentFragment();
}
private EditPoiData getData() {
return getEditPoiFragment().getEditPoiData();
}
@Override
public void onFragmentActivated() {
streetEditText.setText(getData().getTagValues()
.get(OSMSettings.OSMTagKey.ADDR_STREET.getValue()));
houseNumberEditText.setText(getData().getTagValues()
.get(OSMSettings.OSMTagKey.ADDR_HOUSE_NUMBER.getValue()));
phoneEditText.setText(getData().getTagValues()
.get(OSMSettings.OSMTagKey.PHONE.getValue()));
webSiteEditText.setText(getData().getTagValues()
.get(OSMSettings.OSMTagKey.WEBSITE.getValue()));
descriptionEditText.setText(getData().getTagValues()
.get(OSMSettings.OSMTagKey.DESCRIPTION.getValue()));
OpeningHoursParser.OpeningHours openingHours =
OpeningHoursParser.parseOpenedHoursHandleErrors(getData().getTagValues()
.get(OSMSettings.OSMTagKey.OPENING_HOURS.getValue()));
if (openingHours == null) {
openingHours = new OpeningHoursParser.OpeningHours();
}
mOpeningHoursAdapter.replaceOpeningHours(openingHours);
mOpeningHoursAdapter.updateViews();
}
private class OpeningHoursAdapter {
private OpeningHoursParser.OpeningHours openingHours;
private final LinearLayout linearLayout;
private final EditPoiData data;
private final Drawable clockDrawable;
private final Drawable deleteDrawable;
public OpeningHoursAdapter(OpeningHoursParser.OpeningHours openingHours,
LinearLayout linearLayout, EditPoiData data,
Drawable clockDrawable, Drawable deleteDrawable) {
this.openingHours = openingHours;
this.linearLayout = linearLayout;
this.data = data;
this.clockDrawable = clockDrawable;
this.deleteDrawable = deleteDrawable;
}
public void setOpeningHoursRule(OpeningHoursParser.BasicOpeningHourRule rule, int position) {
if (position == -1) {
openingHours.addRule(rule);
} else {
openingHours.getRules().set(position, rule);
}
updateViews();
}
public void replaceOpeningHours(OpeningHoursParser.OpeningHours openingHours) {
this.openingHours = openingHours;
}
public void updateViews() {
linearLayout.removeAllViews();
for (int i = 0; i < openingHours.getRules().size(); i++) {
linearLayout.addView(getView(i));
}
if (!data.isInEdit()) {
String openingHoursString = openingHours.toString();
if (!TextUtils.isEmpty(openingHoursString)) {
if(openingHours.getOriginal() == null ||
!OpeningHoursParser.parseOpenedHoursHandleErrors(openingHours.getOriginal()).toString().equals(openingHoursString)) {
data.putTag(OSMSettings.OSMTagKey.OPENING_HOURS.getValue(),
openingHoursString);
}
} else {
data.removeTag(OSMSettings.OSMTagKey.OPENING_HOURS.getValue());
}
}
}
private View getView(final int position) {
final View view = LayoutInflater.from(linearLayout.getContext())
.inflate(R.layout.open_time_list_item, null, false);
ImageView clockIconImageView = (ImageView) view.findViewById(R.id.clockIconImageView);
clockIconImageView.setImageDrawable(clockDrawable);
TextView daysTextView = (TextView) view.findViewById(R.id.daysTextView);
LinearLayout timeListContainer = (LinearLayout) view.findViewById(R.id.timeListContainer);
ImageButton deleteItemImageButton = (ImageButton) view.findViewById(R.id.deleteItemImageButton);
Button addTimeSpanButton = (Button) view.findViewById(R.id.addTimeSpanButton);
if (openingHours.getRules().get(position) instanceof BasicOpeningHourRule) {
final OpeningHoursParser.BasicOpeningHourRule rule =
(BasicOpeningHourRule) openingHours.getRules().get(position);
StringBuilder stringBuilder = new StringBuilder();
rule.appendDaysString(stringBuilder);
daysTextView.setText(stringBuilder.toString());
daysTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpeningHoursDaysDialogFragment fragment =
OpeningHoursDaysDialogFragment.createInstance(rule, position);
fragment.show(getChildFragmentManager(), "OpenTimeDialogFragment");
}
});
final TIntArrayList startTimes = rule.getStartTimes();
final TIntArrayList endTimes = rule.getEndTimes();
for (int i = 0; i < startTimes.size(); i++) {
View timeFromToLayout = LayoutInflater.from(linearLayout.getContext())
.inflate(R.layout.time_from_to_layout, timeListContainer, false);
TextView openingTextView =
(TextView) timeFromToLayout.findViewById(R.id.openingTextView);
openingTextView.setText(Algorithms.formatMinutesDuration(startTimes.get(i)));
TextView closingTextView =
(TextView) timeFromToLayout.findViewById(R.id.closingTextView);
closingTextView.setText(Algorithms.formatMinutesDuration(endTimes.get(i)));
openingTextView.setTag(i);
openingTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int index = (int) v.getTag();
OpeningHoursHoursDialogFragment.createInstance(rule, position, true, index)
.show(getChildFragmentManager(), "OpeningHoursHoursDialogFragment");
}
});
closingTextView.setTag(i);
closingTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int index = (int) v.getTag();
OpeningHoursHoursDialogFragment.createInstance(rule, position, false, index)
.show(getChildFragmentManager(), "OpeningHoursHoursDialogFragment");
}
});
ImageButton deleteTimespanImageButton = (ImageButton) timeFromToLayout
.findViewById(R.id.deleteTimespanImageButton);
deleteTimespanImageButton.setImageDrawable(deleteDrawable);
final int timespanPosition = i;
deleteTimespanImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (startTimes.size() == 1) {
openingHours.getRules().remove(position);
updateViews();
} else {
rule.deleteTimeRange(timespanPosition);
updateViews();
}
}
});
timeListContainer.addView(timeFromToLayout);
}
deleteItemImageButton.setVisibility(View.GONE);
addTimeSpanButton.setVisibility(View.VISIBLE);
addTimeSpanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpeningHoursHoursDialogFragment.createInstance(rule, position, true,
startTimes.size()).show(getChildFragmentManager(),
"TimePickerDialogFragment");
}
});
} else if (openingHours.getRules().get(position) instanceof OpeningHoursParser.UnparseableRule) {
daysTextView.setText(openingHours.getRules().get(position).toRuleString());
timeListContainer.removeAllViews();
deleteItemImageButton.setVisibility(View.VISIBLE);
deleteItemImageButton.setImageDrawable(deleteDrawable);
deleteItemImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openingHours.getRules().remove(position);
updateViews();
}
});
addTimeSpanButton.setVisibility(View.GONE);
}
return view;
}
}
}