/* * Artcodes recognises a different marker scheme that allows the * creation of aesthetically pleasing, even beautiful, codes. * Copyright (C) 2013-2016 The University of Nottingham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.horizon.artcodes.fragment; import android.app.Activity; import android.app.DatePickerDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import android.view.View; import android.widget.DatePicker; import com.google.android.gms.location.places.Place; import com.google.android.gms.location.places.ui.PlacePicker; import java.util.Calendar; import uk.ac.horizon.artcodes.GoogleAnalytics; import uk.ac.horizon.artcodes.R; import uk.ac.horizon.artcodes.activity.ExperienceActivityBase; import uk.ac.horizon.artcodes.databinding.AvailabilityEditBinding; import uk.ac.horizon.artcodes.model.Availability; import uk.ac.horizon.artcodes.model.Experience; public class AvailabilityEditDialogFragment extends DialogFragment { private interface DateListener { void dateSelected(Long timestamp); } private static final int PLACE_PICKER_REQUEST = 119; private AvailabilityEditBinding binding; static void show(FragmentManager fragmentManager, AvailabilityEditListFragment fragment, int num) { final AvailabilityEditDialogFragment dialog = new AvailabilityEditDialogFragment(); final Bundle args = new Bundle(); dialog.setTargetFragment(fragment, 1); args.putInt("availability", num); dialog.setArguments(args); dialog.show(fragmentManager, "Availability Edit Dialog"); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { binding.availabilityLocationProgress.setVisibility(View.INVISIBLE); binding.availabilityLocation.setVisibility(View.VISIBLE); if (requestCode == PLACE_PICKER_REQUEST) { if (resultCode == Activity.RESULT_OK) { final Place place = PlacePicker.getPlace(getActivity(), data); final int index = data.getIntExtra("availIndex", 0); if (index >= 0) { final Availability availability = getExperience().getAvailabilities().get(index); availability.setName(place.getName().toString()); availability.setAddress(place.getAddress().toString()); availability.setLat(place.getLatLng().latitude); availability.setLon(place.getLatLng().longitude); } } } } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) throws NullPointerException { binding = AvailabilityEditBinding.inflate(getActivity().getLayoutInflater()); // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(binding.getRoot()); final Dialog dialog = builder.create(); binding.deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getArguments().containsKey("availability")) { dialog.dismiss(); final int index = getArguments().getInt("availability"); if (getTargetFragment() instanceof AvailabilityEditListFragment) { ((AvailabilityEditListFragment) getTargetFragment()).getAdapter().deleteAvailability(index); } else { getExperience().getAvailabilities().remove(index); } } } }); binding.doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); if (getArguments().containsKey("availability")) { final int index = getArguments().getInt("availability"); if (getTargetFragment() instanceof AvailabilityEditListFragment) { ((AvailabilityEditListFragment) getTargetFragment()).getAdapter().availabilityUpdated(index); } } } }); return dialog; } @Override public void onResume() { super.onResume(); updateAvailability(); } private void selectDate(Long timestamp, final DateListener listener) { final Calendar calendar = Calendar.getInstance(); if (timestamp != null) { calendar.setTimeInMillis(timestamp); } else { calendar.setTimeInMillis(System.currentTimeMillis()); } int mYear = calendar.get(Calendar.YEAR); int mMonth = calendar.get(Calendar.MONTH); int mDay = calendar.get(Calendar.DAY_OF_MONTH); DatePickerDialog dialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { final Calendar calendar = Calendar.getInstance(); calendar.set(year, monthOfYear, dayOfMonth); listener.dateSelected(calendar.getTimeInMillis()); } }, mYear, mMonth, mDay); dialog.setButton(DatePickerDialog.BUTTON_NEUTRAL, getString(R.string.clear), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); listener.dateSelected(null); } }); dialog.show(); } private Experience getExperience() { if (getActivity() instanceof ExperienceActivityBase) { return ((ExperienceActivityBase) getActivity()).getExperience(); } return null; } @NonNull private Availability getAvailability() throws NullPointerException { Experience experience = getExperience(); if (experience != null) { if (getArguments().containsKey("availability")) { int index = getArguments().getInt("availability"); return experience.getAvailabilities().get(index); } } throw new NullPointerException("Couldn't get action"); } private void updateAvailability() { final Availability availability = getAvailability(); binding.setAvailability(availability); binding.availabilityStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectDate(availability.getStart(), new DateListener() { @Override public void dateSelected(Long timestamp) { availability.setStart(timestamp); } }); } }); binding.availabilityEnd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { selectDate(availability.getEnd(), new DateListener() { @Override public void dateSelected(Long timestamp) { availability.setEnd(timestamp); } }); } }); binding.availabilityLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { binding.availabilityLocationProgress.setVisibility(View.VISIBLE); binding.availabilityLocation.setVisibility(View.INVISIBLE); PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); Intent intent = builder.build(getActivity()); intent.putExtra("availIndex", getExperience().getAvailabilities().indexOf(availability)); startActivityForResult(intent, PLACE_PICKER_REQUEST); } catch (Exception e) { GoogleAnalytics.trackException(e); binding.availabilityLocationProgress.setVisibility(View.INVISIBLE); binding.availabilityLocation.setVisibility(View.VISIBLE); } } }); binding.availabilityLocationClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { availability.setName(null); availability.setAddress(null); availability.setLat(null); availability.setLon(null); } }); //binding.setActionEditor(new ActionEditor(action)); } }