package com.sunlightlabs.android.congress; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import com.sunlightlabs.android.congress.fragments.BillActionFragment; import com.sunlightlabs.android.congress.fragments.BillInfoFragment; import com.sunlightlabs.android.congress.fragments.BillLoaderFragment; import com.sunlightlabs.android.congress.fragments.BillVoteFragment; import com.sunlightlabs.android.congress.utils.ActionBarUtils; import com.sunlightlabs.android.congress.utils.ActionBarUtils.HasActionMenu; import com.sunlightlabs.android.congress.utils.Analytics; import com.sunlightlabs.android.congress.utils.Database; import com.sunlightlabs.android.congress.utils.TitlePageAdapter; import com.sunlightlabs.android.congress.utils.Utils; import com.sunlightlabs.congress.models.Bill; import com.sunlightlabs.congress.models.CongressException; import com.sunlightlabs.congress.services.BillService; import java.util.List; public class BillPager extends FragmentActivity implements HasActionMenu { public String bill_id; public Bill bill; public String tab; public Database database; public Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Analytics.init(this); setContentView(R.layout.pager_titled); Intent intent = getIntent(); Bundle extras = intent.getExtras(); bill_id = extras.getString("bill_id"); bill = (Bill) extras.getSerializable("bill"); tab = extras.getString("tab"); // if coming in from a link (in form /bill/:congress/:formatted_code, e.g. "/bill/112/H.R. 2345") Uri uri = intent.getData(); if (uri != null) { List<String> segments = uri.getPathSegments(); if (segments.size() == 3) { // coming in from floor String congress = segments.get(1); String formattedCode = segments.get(2); String code = Bill.normalizeCode(formattedCode); bill_id = code + "-" + congress; } } setupControls(); if (bill == null) BillLoaderFragment.start(this); else onLoadBill(bill); } public void setupControls() { ActionBarUtils.setTitle(this, Bill.formatCode(bill_id)); findViewById(android.R.id.empty).setVisibility(View.VISIBLE); findViewById(R.id.pager_container).setVisibility(View.GONE); Utils.setLoading(this, R.string.bill_loading); ((Button) findViewById(R.id.refresh)).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { refresh(); } }); } private void refresh() { this.bill = null; Utils.setLoading(this, R.string.bill_loading); Utils.showLoading(this); BillLoaderFragment.start(this, true); } public void onLoadBill(Bill bill) { this.bill = bill; findViewById(R.id.pager_container).setVisibility(View.VISIBLE); findViewById(android.R.id.empty).setVisibility(View.GONE); setupDatabase(); setupButtons(); setupPager(); } public void onLoadBill(CongressException exception) { if (exception instanceof BillService.BillNotFoundException) Utils.showEmpty(this, R.string.bill_not_known_yet); else Utils.showRefresh(this, R.string.bill_loading_error); } private void setupPager() { TitlePageAdapter adapter = new TitlePageAdapter(this); adapter.add("info", R.string.tab_details, BillInfoFragment.create(bill)); adapter.add("history", R.string.tab_history, BillActionFragment.create(bill)); adapter.add("votes", R.string.tab_votes, BillVoteFragment.create(bill)); if (tab != null) adapter.selectPage(tab); } @SuppressWarnings("deprecation") private void setupDatabase() { database = new Database(this); database.open(); cursor = database.getBill(bill.id); startManagingCursor(cursor); } @Override protected void onDestroy() { super.onDestroy(); if (database != null && database.isOpen()) database.close(); } public void setupButtons() { ActionBarUtils.setActionButton(this, R.id.action_1, R.drawable.star_off, new View.OnClickListener() { public void onClick(View v) { toggleDatabaseFavorite(); } }); toggleFavoriteStar(cursor.getCount() == 1); ActionBarUtils.setActionButton(this, R.id.action_2, R.drawable.share, new View.OnClickListener() { public void onClick(View v) { Analytics.billShare(BillPager.this, bill.id); Intent intent = new Intent(Intent.ACTION_SEND).setType("text/plain") .putExtra(Intent.EXTRA_TEXT, shareText()) .putExtra(Intent.EXTRA_SUBJECT, shareSubject()); startActivity(Intent.createChooser(intent, "Share bill via:")); } }); ActionBarUtils.setActionMenu(this, R.menu.bill); } public String shareText() { return bill.sunlightShortUrl(); } public String shareSubject() { return Bill.formatCode(bill.id); } private void toggleFavoriteStar(boolean enabled) { if (enabled) ActionBarUtils.setActionIcon(this, R.id.action_1, R.drawable.star_on); else ActionBarUtils.setActionIcon(this, R.id.action_1, R.drawable.star_off); } private void toggleDatabaseFavorite() { String id = bill.id; cursor.requery(); if (cursor.getCount() == 1) { if (database.removeBill(id) != 0) { toggleFavoriteStar(false); Analytics.removeFavoriteBill(this, id); } else Utils.alert(this, "Problem unstarring bill."); } else { if (database.addBill(bill) != -1) { toggleFavoriteStar(true); Analytics.addFavoriteBill(this, id); } else Utils.alert(this, "Problem starring bill."); } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.bill, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { menuSelected(item); return true; } @Override public void menuSelected(MenuItem item) { if (bill == null) return; // safety valve (only matters on pre-4.0 devices) switch(item.getItemId()) { case R.id.text: Analytics.billText(this, bill.id); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(bill.bestFullTextUrl()))); break; case R.id.govtrack: Analytics.billGovTrack(this, bill.id); if (bill.urls != null && bill.urls.containsKey("govtrack")) startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(bill.urls.get("govtrack")))); break; case R.id.opencongress: Analytics.billOpenCongress(this, bill.id); if (bill.urls != null && bill.urls.containsKey("opencongress")) startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(bill.urls.get("opencongress")))); break; } } @Override public void onStart() { super.onStart(); Analytics.start(this); } @Override public void onStop() { super.onStop(); Analytics.stop(this); } }