package com.sunlightlabs.android.congress.fragments;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.mapbox.mapboxsdk.geometry.BoundingBox;
import com.mapbox.mapboxsdk.views.MapView;
import com.sunlightlabs.android.congress.CommitteeMember;
import com.sunlightlabs.android.congress.R;
import com.sunlightlabs.android.congress.tasks.LoadDistrictTask;
import com.sunlightlabs.android.congress.tasks.LoadPhotoTask;
import com.sunlightlabs.android.congress.utils.Analytics;
import com.sunlightlabs.android.congress.utils.FragmentUtils;
import com.sunlightlabs.android.congress.utils.LegislatorImage;
import com.sunlightlabs.android.congress.utils.Utils;
import com.sunlightlabs.congress.models.CongressException;
import com.sunlightlabs.congress.models.District;
import com.sunlightlabs.congress.models.Legislator;
public class LegislatorProfileFragment extends Fragment implements LoadPhotoTask.LoadsPhoto, LoadDistrictTask.LoadsDistrict {
private Legislator legislator;
private District district;
private Drawable avatar;
public static LegislatorProfileFragment create(Legislator legislator) {
LegislatorProfileFragment frag = new LegislatorProfileFragment();
Bundle args = new Bundle();
args.putSerializable("legislator", legislator);
frag.setArguments(args);
frag.setRetainInstance(true);
return frag;
}
public LegislatorProfileFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentUtils.setupAPI(this);
legislator = (Legislator) getArguments().getSerializable("legislator");
loadPhoto();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.legislator_profile, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setupControls();
if (avatar != null)
displayAvatar();
}
public void loadPhoto() {
new LoadPhotoTask(this, LegislatorImage.PIC_LARGE).execute(legislator.bioguide_id);
}
public void onLoadPhoto(Drawable avatar, Object tag) {
if (avatar == null) {
Resources resources = null;
if (getActivity() != null)
resources = getActivity().getResources();
if (resources != null)
avatar = resources.getDrawable(R.drawable.person);
}
this.avatar = avatar;
if (isAdded())
displayAvatar();
}
public Context getContext() {
return getActivity();
}
public void displayAvatar() {
((ImageView) getView().findViewById(R.id.profile_picture)).setImageDrawable(avatar);
}
public void callOffice() {
Analytics.legislatorCall(getActivity(), legislator.bioguide_id);
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel://" + legislator.phone)));
}
public void seeCommittees() {
startActivity(new Intent(getActivity(), CommitteeMember.class)
.putExtra("legislator", legislator));
}
public void visit(String url, String social) {
Analytics.legislatorWebsite(getActivity(), legislator.bioguide_id, social);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}
public void setupControls() {
View mainView = getView();
if (!legislator.in_office)
mainView.findViewById(R.id.out_of_office_text).setVisibility(View.VISIBLE);
String party = partyName(legislator.party);
String state = Utils.stateCodeToName(getActivity(), legislator.state);
((TextView) mainView.findViewById(R.id.profile_state_party)).setText(party + " from " + state);
String domain = legislator.getDomain();
if (legislator.leadership_role != null && !legislator.leadership_role.equals(""))
domain = legislator.leadership_role + ", " + domain;
((TextView) mainView.findViewById(R.id.profile_domain)).setText(domain);
socialButton(R.id.twitter, legislator.twitterUrl(), Analytics.LEGISLATOR_TWITTER);
socialButton(R.id.youtube, legislator.youtubeUrl(), Analytics.LEGISLATOR_YOUTUBE);
socialButton(R.id.facebook, legislator.facebookUrl(), Analytics.LEGISLATOR_FACEBOOK);
TextView officeView = (TextView) mainView.findViewById(R.id.profile_office);
if (legislator.office != null && !legislator.office.equals(""))
officeView.setText(officeName(legislator.office));
else
officeView.setVisibility(View.GONE);
// allow for devices without phones
boolean hasPhone = getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
if (hasPhone && legislator.phone != null && !legislator.phone.equals("")) {
mainView.findViewById(R.id.call_office).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callOffice();
}
});
} else
mainView.findViewById(R.id.call_office_container).setVisibility(View.GONE);
if (legislator.website != null && !legislator.website.equals("")) {
mainView.findViewById(R.id.visit_website).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
visit(legislator.website, Analytics.LEGISLATOR_WEBSITE);
}
});
} else
mainView.findViewById(R.id.visit_website_container).setVisibility(View.GONE);
// we should always be able to link to their committees
mainView.findViewById(R.id.committees).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
seeCommittees();
}
});
// note: this depends on 2.3 and up, which we're now requiring (2014-04-14)
setupMap();
}
// public void setupMap() {
// MapView mapView = (MapView) getView().findViewById(R.id.map_view);
// debug: Washington, DC
// mapView.setCenter(new LatLng(38.8875839,-76.9872818));
// download and display GeoJSON
// mapView.loadFromGeoJSONURL(DistrictService.urlForLegislator(this.legislator));
// }
// can assume this.district is set
public void displayDistrict() {
Log.i(Utils.TAG, "Got district map fetched, drawing it to the Mapbox map...");
MapView mapView = (MapView) getView().findViewById(R.id.map_view);
BoundingBox box = District.drawDistrict(district, mapView);
mapView.zoomToBoundingBox(box);
Log.i(Utils.TAG, "Drew district to the map.");
}
public void setupMap() {
if (this.district != null)
displayDistrict();
else
loadDistrict();
}
public void loadDistrict() {
Log.i(Utils.TAG, "Kicking off district map fetching...");
new LoadDistrictTask(this).execute(legislator);
}
@Override
public void onLoadDistrict(District district) {
this.district = district;
if (isAdded())
displayDistrict();
}
@Override
public void onLoadDistrict(CongressException exception) {
Log.e(Utils.TAG, "Error fetching map :(", exception);
Utils.alert(this.getContext(), "There was an error loading the district map.");
}
private void socialButton(int id, final String url, final String network) {
View view = getView().findViewById(id);
if (url != null && !url.equals("")) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
visit(url, network);
}
});
} else
view.setVisibility(View.GONE);
}
public static String partyName(String code) {
if (code.equals("D"))
return "Democrat";
if (code.equals("R"))
return "Republican";
if (code.equals("I"))
return "Independent";
else
return "";
}
public static String pronoun(String gender) {
if (gender.equals("M"))
return "his";
else // "F"
return "her";
}
public static String officeName(String office) {
return office.replaceAll("(?:House|Senate)? ?(?:Office)? ?Building", "").trim();
}
}