package com.spielpark.steve.bernieapp.fragments; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.text.Html; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.spielpark.steve.bernieapp.R; import com.spielpark.steve.bernieapp.tasks.ConnectTask; import com.spielpark.steve.bernieapp.wrappers.Event; import java.util.ArrayList; import java.util.HashMap; /** * A simple {@link Fragment} subclass. */ public class ConnectFragment extends Fragment { private static ConnectTask mTask; private static GoogleMap map; private HashMap<Marker, Integer> mHashMap; public String mZip = ""; public int mRadius = 50; public boolean fetchCountry = true; private static ConnectFragment mInstance; public static ConnectFragment getInstance() { if (mInstance == null) { mInstance = new ConnectFragment(); return mInstance; } else { return mInstance; } } public static void cancelTask() { if (mTask != null) { if (mTask.getStatus() == AsyncTask.Status.RUNNING) { mTask.cancel(true); } } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { getView().findViewById(R.id.c_btnRadius).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { android.support.v7.app.AlertDialog.Builder bld = new android.support.v7.app.AlertDialog.Builder(getActivity()); bld.setTitle("Pick a Radius"); bld.setSingleChoiceItems(R.array.radius_choices, 1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { setRadius(i); dialogInterface.dismiss(); } }); bld.create().show(); } }); getView().findViewById(R.id.c_btnGo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { fetchCountry = false; startTask(); InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); } }); ((ListView) getView().findViewById(R.id.c_listEvents)).setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { listItemClicked(i, false); } }); fetchCountry = true; setUpMap(); MapsInitializer.initialize(getActivity().getApplicationContext()); super.onViewCreated(view, savedInstanceState); } private void listItemClicked(int pos, boolean alreadyLoaded) { final View base = getView(); if (!alreadyLoaded) { View[] topViews = new View[]{ base.findViewById(R.id.c_edtZip), base.findViewById(R.id.c_btnRadius), base.findViewById(R.id.c_btnGo) }; for (final View v : topViews) { Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.abc_slide_out_top); anim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { v.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } }); v.startAnimation(anim); } final View list = base.findViewById(R.id.c_listEvents); Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.abc_slide_out_bottom); anim.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { list.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } }); list.startAnimation(anim); View mapContainer = base.findViewById(R.id.c_mapContainer); mapContainer.startAnimation(new AnimationUtils().loadAnimation(getActivity(), R.anim.view_slide_up)); } final Event e = ConnectTask.getEvents().get(pos); base.findViewById(R.id.cd_btnRSVP).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(e.getUrl())); startActivity(i); } }); base.findViewById(R.id.cd_btnDirections).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Uri gmmIntentUri = Uri.parse("geo:" + Double.toString(e.getLatitude()) + "," + Double.toString(e.getLongitude())); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); mapIntent.setPackage("com.google.android.apps.maps"); startActivity(mapIntent); } }); if (e.getDate() != null) ((TextView) base.findViewById(R.id.cd_txtDate)).setText(e.getDate()); ((TextView) base.findViewById(R.id.cd_txtTitle)).setText(e.getName()); ((TextView) base.findViewById(R.id.cd_txtDescContent)).setText(Html.fromHtml(e.getDescription())); ((TextView) base.findViewById(R.id.cd_txtDescContent)).setMovementMethod(new ScrollingMovementMethod()); if (e.getVenue_city() != null) ((TextView) base.findViewById(R.id.cd_txtLocation)).setText(e.getVenue_addr() + "\n" + e.getVenue_city() + ", " + e.getState() + " - " + e.getZip()); if (e.getAttendee_count() != 0) ((TextView) base.findViewById(R.id.cd_txtRSVP)).setText(e.isOfficial() ? "N/A" : Integer.toString(e.getAttendee_count())); Animation fadeIn = AnimationUtils.loadAnimation(getActivity(), alreadyLoaded ? R.anim.view_fade_in_fast : R.anim.view_fade_in); fadeIn.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { base.findViewById(R.id.cd_container).setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } }); base.findViewById(R.id.cd_container).startAnimation(fadeIn); } private void startTask() { cancelTask(); if (fetchCountry) { mTask = new ConnectTask(getActivity(), getInstance()); mTask.execute(); } else if (validZip()) { getView().findViewById(R.id.c_btnGo).setEnabled(false); getView().findViewById(R.id.c_btnGo).setBackgroundColor(Color.parseColor("#CCCCCC")); getView().findViewById(R.id.c_progress).setVisibility(View.VISIBLE); mTask = new ConnectTask(getActivity(), getInstance()); mTask.execute(); } else { Toast.makeText(getActivity(), "Please enter a valid Zip Code!", Toast.LENGTH_SHORT).show(); } } private boolean validZip() { String text = ((EditText) getView().findViewById(R.id.c_edtZip)).getText().toString(); try { Integer.parseInt(text); } catch (NumberFormatException e) { return false; } mZip = text; return text.length() == 5; } private void setRadius(int m) { mRadius = m++ < 4 ? m*25 : ((m-2)*50); ((Button) getView().findViewById(R.id.c_btnRadius)).setText(mRadius + " miles"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.frag_connect, container, false); } private void setUpMap() { SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.c_map); mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { Log.d("Map Ready", "Bam."); ConnectFragment.this.map = googleMap; ConnectFragment.this.getView().findViewById(R.id.c_btnGo).setEnabled(true); ConnectFragment.this.getView().findViewById(R.id.c_progress).setVisibility(View.GONE); ConnectFragment.this.getView().findViewById(R.id.c_btnGo).setBackgroundColor(Color.parseColor("#147FD7")); } }); startTask(); } public void setMarkers() { map.clear(); ArrayList<Event> events = ConnectTask.getEvents(); if (events.size() == 0) { return; //There are no events to draw. } mHashMap = new HashMap<>(events.size()); LatLngBounds.Builder bld = new LatLngBounds.Builder(); LatLng pos; float hue; int id = 0; for (Event e : ConnectTask.getEvents()) { hue = e.isOfficial() ? 1.0f : 214f; pos = new LatLng(e.getLatitude(), e.getLongitude()); mHashMap.put(map.addMarker(new MarkerOptions() .position(pos) .title(e.getName()) .icon(BitmapDescriptorFactory.defaultMarker(hue))), id++); bld.include(pos); } LatLngBounds bounds = bld.build(); map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0)); map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(final Marker marker) { final int id = Integer.parseInt(marker.getId().substring(1)); if (getView().findViewById(R.id.cd_container).getVisibility() == View.VISIBLE) { listItemClicked(mHashMap.get(marker), true); return false; } final ListView list = (ListView) getView().findViewById(R.id.c_listEvents); list.post(new Runnable() { @Override public void run() { list.smoothScrollToPositionFromTop(mHashMap.get(marker), 0, 500); list.postDelayed(new Runnable() { @Override public void run() { list.setSelection(mHashMap.get(marker)); } }, 510); } }); return false; } }); } public void updateViews(ArrayAdapter a) { View parent = getView(); if (parent == null) { return; //We switched out of this view. } ListView list = (ListView) getView().findViewById(R.id.c_listEvents); list.setAdapter(a); list.setVisibility(View.VISIBLE); parent.findViewById(R.id.c_mapContainer).setVisibility(View.VISIBLE); parent.findViewById(R.id.c_progress).setVisibility(View.GONE); parent.findViewById(R.id.c_btnGo).setEnabled(true); parent.findViewById(R.id.c_btnGo).setBackgroundColor(Color.parseColor("#147FD7")); } public void backPressed() { View parent = getView(); if (parent.findViewById(R.id.c_btnGo).getVisibility() == View.VISIBLE) { getActivity().finish(); cancelTask(); } else { parent.findViewById(R.id.c_edtZip).setVisibility(View.VISIBLE); parent.findViewById(R.id.c_btnRadius).setVisibility(View.VISIBLE); parent.findViewById(R.id.c_listEvents).setVisibility(View.VISIBLE); parent.findViewById(R.id.c_btnGo).setVisibility(View.VISIBLE); parent.findViewById(R.id.cd_container).setVisibility(View.GONE); } } }