package bf.io.openshop.ux.dialogs; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import bf.io.openshop.R; import bf.io.openshop.entities.delivery.Branch; import bf.io.openshop.entities.delivery.OpeningHours; import bf.io.openshop.entities.delivery.Shipping; import bf.io.openshop.listeners.OnSingleClickListener; import timber.log.Timber; /** * Dialog offers a branch detail with an interactive map. */ public class MapDialogFragment extends DialogFragment implements OnMapReadyCallback { private ShippingDialogFragment shippingDialogFragment; private SupportMapFragment supportMapFragment; private Branch branch; private Shipping shipping; public MapDialogFragment() { super(); supportMapFragment = new SupportMapFragment(); supportMapFragment.getMapAsync(this); } /** * Creates dialog which handles the branch detail with an interactive map. * * @param fragment fragment which handles branch selection. * @param shipping shipping object for selection response. * @param branch branch to display. * @return new instance of dialog. */ public static MapDialogFragment newInstance(ShippingDialogFragment fragment, Shipping shipping, Branch branch) { MapDialogFragment frag = new MapDialogFragment(); frag.branch = branch; frag.shipping = shipping; frag.shippingDialogFragment = fragment; return frag; } /** * Creates dialog which handles the branch detail with an interactive map. * * @param branch branch to display. * @return new instance of dialog. */ public static MapDialogFragment newInstance(Branch branch) { return newInstance(null, null, branch); } @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); return dialog; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("%s - OnCreateView", this.getClass().getSimpleName()); View view = inflater.inflate(R.layout.dialog_map, container, false); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.map_frame, supportMapFragment).commit(); View closeBtn = view.findViewById(R.id.map_close); closeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); Button selectionButton = (Button) view.findViewById(R.id.map_select); // If selection isn't supported, hide button. if (shippingDialogFragment == null || shipping == null) { selectionButton.setVisibility(View.GONE); } else { selectionButton.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { if (shippingDialogFragment != null && shipping != null) { shippingDialogFragment.onShippingSelected(shipping); dismiss(); } else { Timber.e("Something is null"); } } }); } TextView title = (TextView) view.findViewById(R.id.map_title); TextView location = (TextView) view.findViewById(R.id.map_location); TextView openingTime = (TextView) view.findViewById(R.id.map_shop_info_time); TextView note = (TextView) view.findViewById(R.id.map_note); LinearLayout locationPaths = (LinearLayout) view.findViewById(R.id.map_shop_info); if (branch != null) { title.setText(branch.getName()); location.setText(branch.getAddress()); if (branch.getOpeningHoursList() != null && branch.getOpeningHoursList().size() > 0) { openingTime.setVisibility(View.VISIBLE); String timeText = ""; for (int i = 0; i < branch.getOpeningHoursList().size(); i++) { OpeningHours openingHours = branch.getOpeningHoursList().get(i); timeText += openingHours.getDay() + " " + openingHours.getOpening(); if (i != branch.getOpeningHoursList().size() - 1) { timeText += "\n"; } } openingTime.setText(timeText); } else { openingTime.setVisibility(View.GONE); } if (branch.getNote() != null && !branch.getNote().isEmpty()) { note.setVisibility(View.VISIBLE); note.setText(branch.getNote()); } else { note.setVisibility(View.GONE); } // TODO add "How to get here" options // how would normal data looks like? Probably not strings like tram/train/sub //// List<Transport> transports = branch.getTransports(); //// transports = new ArrayList<>(); //// transports.add(new Transport("tram", "15 minut pesky od tramvaje")); //// transports.add(new Transport("train", "12 sekund pesky od vlaku")); //// transports.add(new Transport("sub", "4 piko schody z metra a pak pesky do stanice miru")); // // // if (transports != null) { // for (int i = 0; i < transports.size(); i++) { // View transportView = inflater.inflate(R.layout.dialog_map_transport_item, locationPaths, false); // ImageView locationIcon = (ImageView) transportView.findViewById(R.id.dialog_map_transport_item_image); // TextView locationText = (TextView) transportView.findViewById(R.id.dialog_map_transport_item_text); // locationText.setText(transports.get(i).getText()); // // locationPaths.addView(transportView); // } // } final ScrollView parentScrollView = (ScrollView) view.findViewById(R.id.map_fragment_scroll_view); ImageView transparentImageView = (ImageView) view.findViewById(R.id.map_frame_overlay); transparentImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. parentScrollView.requestDisallowInterceptTouchEvent(true); // Disable touch on transparent view return false; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. parentScrollView.requestDisallowInterceptTouchEvent(false); return true; case MotionEvent.ACTION_MOVE: parentScrollView.requestDisallowInterceptTouchEvent(true); return false; default: return true; } } }); } else { Timber.e(new RuntimeException(), "Null branch in MapDialogFragment"); } return view; } public SupportMapFragment getFragment() { return supportMapFragment; } @Override public void onMapReady(GoogleMap googleMap) { if (branch != null && branch.getCoordinates() != null) { LatLng position = new LatLng(branch.getCoordinates().getLat(), branch.getCoordinates().getLon()); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13)); googleMap.addMarker(new MarkerOptions() // .icon(BitmapDescriptorFactory.fromResource(R.drawable.shop_info_map_mrker)) .title(branch.getName()) .snippet(branch.getAddress()) .position(position) .draggable(false) .anchor((float) 0.917, (float) 0.903)); } } }