diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6827ac0..534ab20 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -43,7 +43,7 @@ + android:theme="@style/DialogHoloDark" > @@ -55,7 +55,7 @@ + android:theme="@style/DialogHoloDark" > diff --git a/board.svg b/board.svg new file mode 100644 index 0000000..d3a5e7f --- /dev/null +++ b/board.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/departure.png b/departure.png new file mode 100644 index 0000000..0dbf7ca Binary files /dev/null and b/departure.png differ diff --git a/departure.svg b/departure.svg new file mode 100644 index 0000000..8d86936 --- /dev/null +++ b/departure.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/departure_Med.png b/departure_Med.png new file mode 100644 index 0000000..7950129 Binary files /dev/null and b/departure_Med.png differ diff --git a/res/drawable-hdpi/actionbar_shadow.9.png b/res/drawable-hdpi/actionbar_shadow.9.png deleted file mode 100644 index 3c80a3f..0000000 Binary files a/res/drawable-hdpi/actionbar_shadow.9.png and /dev/null differ diff --git a/res/drawable-hdpi/boarding_icon.png b/res/drawable-hdpi/boarding_icon.png new file mode 100644 index 0000000..8c4fd2c Binary files /dev/null and b/res/drawable-hdpi/boarding_icon.png differ diff --git a/res/drawable-hdpi/delete_icon.png b/res/drawable-hdpi/delete_icon.png new file mode 100644 index 0000000..ffd19d9 Binary files /dev/null and b/res/drawable-hdpi/delete_icon.png differ diff --git a/res/drawable-hdpi/departure_icon.png b/res/drawable-hdpi/departure_icon.png new file mode 100644 index 0000000..422dae9 Binary files /dev/null and b/res/drawable-hdpi/departure_icon.png differ diff --git a/res/drawable-mdpi/actionbar_shadow.9.png b/res/drawable-mdpi/actionbar_shadow.9.png deleted file mode 100644 index cae1778..0000000 Binary files a/res/drawable-mdpi/actionbar_shadow.9.png and /dev/null differ diff --git a/res/drawable-mdpi/boarding_icon.png b/res/drawable-mdpi/boarding_icon.png new file mode 100644 index 0000000..f7f6075 Binary files /dev/null and b/res/drawable-mdpi/boarding_icon.png differ diff --git a/res/drawable-mdpi/delete_icon.png b/res/drawable-mdpi/delete_icon.png new file mode 100644 index 0000000..a8ee5f2 Binary files /dev/null and b/res/drawable-mdpi/delete_icon.png differ diff --git a/res/drawable-mdpi/departure_icon.png b/res/drawable-mdpi/departure_icon.png new file mode 100644 index 0000000..e084421 Binary files /dev/null and b/res/drawable-mdpi/departure_icon.png differ diff --git a/res/drawable/actionbar_compat_item.xml b/res/drawable/actionbar_compat_item.xml deleted file mode 100644 index 4b3960c..0000000 --- a/res/drawable/actionbar_compat_item.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - diff --git a/res/drawable/actionbar_compat_item_focused.xml b/res/drawable/actionbar_compat_item_focused.xml deleted file mode 100644 index 04811d3..0000000 --- a/res/drawable/actionbar_compat_item_focused.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/res/drawable/actionbar_compat_item_pressed.xml b/res/drawable/actionbar_compat_item_pressed.xml deleted file mode 100644 index 72ff4b4..0000000 --- a/res/drawable/actionbar_compat_item_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/res/drawable/btn_borderless_holo_dark.xml b/res/drawable/btn_borderless_holo_dark.xml new file mode 100644 index 0000000..84b68f8 --- /dev/null +++ b/res/drawable/btn_borderless_holo_dark.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/transparent.xml b/res/drawable/transparent.xml new file mode 100644 index 0000000..223e90e --- /dev/null +++ b/res/drawable/transparent.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/res/layout-v11/actionbar_indeterminate_progress.xml b/res/layout-v11/actionbar_indeterminate_progress.xml deleted file mode 100644 index c05750e..0000000 --- a/res/layout-v11/actionbar_indeterminate_progress.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/res/layout-v11/simple_spinner_dropdown_item.xml b/res/layout-v11/simple_spinner_dropdown_item.xml new file mode 100644 index 0000000..3493305 --- /dev/null +++ b/res/layout-v11/simple_spinner_dropdown_item.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/res/layout/actionbar_compat.xml b/res/layout/actionbar_compat.xml deleted file mode 100644 index ae6c44b..0000000 --- a/res/layout/actionbar_compat.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/res/layout/route_form.xml b/res/layout/route_form.xml index 6b05eb4..8fb26a6 100644 --- a/res/layout/route_form.xml +++ b/res/layout/route_form.xml @@ -1,71 +1,108 @@ + android:layout_width="300dp" + android:layout_height="wrap_content" + android:gravity="center_vertical" > + + + + + android:textSize="15sp" > + android:layout_alignParentRight="true" + android:layout_below="@+id/origin_spinner" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:paddingTop="15dip" /> + android:textSize="15sp" > - + diff --git a/res/layout/simple_spinner_dropdown_item.xml b/res/layout/simple_spinner_dropdown_item.xml new file mode 100644 index 0000000..ce1de16 --- /dev/null +++ b/res/layout/simple_spinner_dropdown_item.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/res/layout/simple_spinner_item.xml b/res/layout/simple_spinner_item.xml index d20985a..918bbb3 100644 --- a/res/layout/simple_spinner_item.xml +++ b/res/layout/simple_spinner_item.xml @@ -1,8 +1,15 @@ - + android:id="@android:id/text1" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:background="#282829" + android:textColor="#fff" + android:paddingBottom="12dip" + android:paddingLeft="5dip" + android:paddingRight="5dip" + android:paddingTop="12dip" + android:singleLine="true" > + + \ No newline at end of file diff --git a/res/menu/departure_context_menu.xml b/res/menu/departure_context_menu.xml index 59b3690..24022b3 100644 --- a/res/menu/departure_context_menu.xml +++ b/res/menu/departure_context_menu.xml @@ -1,4 +1,9 @@ - + + \ No newline at end of file diff --git a/res/menu/route_context_menu.xml b/res/menu/route_context_menu.xml index d8461d3..41f6c9e 100644 --- a/res/menu/route_context_menu.xml +++ b/res/menu/route_context_menu.xml @@ -1,5 +1,17 @@ - - - - + + + + + + + + \ No newline at end of file diff --git a/res/values-v11/styles.xml b/res/values-v11/styles.xml index 0d65e77..4e9e2df 100644 --- a/res/values-v11/styles.xml +++ b/res/values-v11/styles.xml @@ -1,34 +1,6 @@ - - - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/res/values-v13/styles.xml b/res/values-v13/styles.xml deleted file mode 100644 index 8a042b4..0000000 --- a/res/values-v13/styles.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 99d492f..187a49e 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -18,16 +18,6 @@ - - - - - - - - - - diff --git a/res/values/colors.xml b/res/values/colors.xml index ec349a6..f65b2d8 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -1,5 +1,6 @@ + #FF000000 - #EEEEEE + \ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml deleted file mode 100644 index 67c8436..0000000 --- a/res/values/dimens.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 48dp - 48dp - 56dp - diff --git a/res/values/ids.xml b/res/values/ids.xml deleted file mode 100644 index e0a4745..0000000 --- a/res/values/ids.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - diff --git a/res/values/strings.xml b/res/values/strings.xml index e08dbbd..ce12110 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,7 +1,7 @@ BART Runner - Favorite Routes + Favorite routes No favorite routes have been added yet Add a route Origin @@ -32,7 +32,7 @@ Departures OK Quick departure lookup - I\'m getting on this train + I will board this train Departure options Your train diff --git a/res/values/styles.xml b/res/values/styles.xml index e86670f..f7184e4 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -2,52 +2,7 @@ - - - - - - - - - - - - - - - + - + + + \ No newline at end of file diff --git a/src/com/dougkeen/bart/AbstractRouteSelectionActivity.java b/src/com/dougkeen/bart/AbstractRouteSelectionActivity.java index 7a074f6..4d1d529 100644 --- a/src/com/dougkeen/bart/AbstractRouteSelectionActivity.java +++ b/src/com/dougkeen/bart/AbstractRouteSelectionActivity.java @@ -6,7 +6,6 @@ import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; -import android.widget.SpinnerAdapter; import android.widget.Toast; import com.dougkeen.bart.model.Station; @@ -23,13 +22,20 @@ public abstract class AbstractRouteSelectionActivity extends Activity { setContentView(R.layout.route_form); - SpinnerAdapter originSpinnerAdapter = new ArrayAdapter(this, - R.layout.simple_spinner_item, Station.getStationList()); + ArrayAdapter originSpinnerAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, + Station.getStationList()); + originSpinnerAdapter + .setDropDownViewResource(R.layout.simple_spinner_dropdown_item); ((Spinner) findViewById(R.id.origin_spinner)) .setAdapter(originSpinnerAdapter); - SpinnerAdapter destinationSpinnerAdapter = new ArrayAdapter( - this, R.layout.simple_spinner_item, Station.getStationList()); + ArrayAdapter destinationSpinnerAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, + Station.getStationList()); + destinationSpinnerAdapter + .setDropDownViewResource(R.layout.simple_spinner_dropdown_item); + ((Spinner) findViewById(R.id.destination_spinner)) .setAdapter(destinationSpinnerAdapter); diff --git a/src/com/dougkeen/bart/AddRouteActivity.java b/src/com/dougkeen/bart/AddRouteActivity.java index 49b7510..906b7ca 100644 --- a/src/com/dougkeen/bart/AddRouteActivity.java +++ b/src/com/dougkeen/bart/AddRouteActivity.java @@ -15,7 +15,16 @@ public class AddRouteActivity extends AbstractRouteSelectionActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - findViewById(R.id.return_checkbox).setVisibility(View.VISIBLE); + final View checkboxText = findViewById(R.id.return_checkbox_text); + final View checkbox = findViewById(R.id.return_checkbox); + checkboxText.setVisibility(View.VISIBLE); + checkbox.setVisibility(View.VISIBLE); + checkboxText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + checkbox.performClick(); + } + }); } @Override diff --git a/src/com/dougkeen/bart/RoutesListActivity.java b/src/com/dougkeen/bart/RoutesListActivity.java index abc79c4..6a97a9a 100644 --- a/src/com/dougkeen/bart/RoutesListActivity.java +++ b/src/com/dougkeen/bart/RoutesListActivity.java @@ -14,27 +14,26 @@ import android.database.Cursor; import android.database.CursorWrapper; import android.net.Uri; import android.os.Bundle; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; -import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.SimpleCursorAdapter.ViewBinder; import android.widget.TextView; -import com.dougkeen.bart.actionbarcompat.ActionBarListActivity; +import com.actionbarsherlock.app.SherlockListActivity; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; import com.dougkeen.bart.data.CursorUtils; import com.dougkeen.bart.data.RoutesColumns; import com.dougkeen.bart.model.Constants; import com.dougkeen.bart.model.Station; import com.dougkeen.bart.networktasks.GetRouteFareTask; -public class RoutesListActivity extends ActionBarListActivity { +public class RoutesListActivity extends SherlockListActivity { private static final TimeZone PACIFIC_TIME = TimeZone .getTimeZone("America/Los_Angeles"); @@ -44,7 +43,10 @@ public class RoutesListActivity extends ActionBarListActivity { private Uri mCurrentlySelectedUri; - private String mCurrentlySelectedRouteName; + private Station mCurrentlySelectedOrigin; + private Station mCurrentlySelectedDestination; + + private ActionMode mActionMode; /** Called when the activity is first created. */ @Override @@ -88,7 +90,31 @@ public class RoutesListActivity extends ActionBarListActivity { setListAdapter(adapter); - registerForContextMenu(getListView()); + getListView().setOnItemLongClickListener( + new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, + View view, int position, long id) { + if (mActionMode != null) { + mActionMode.finish(); + } + + mCurrentlySelectedUri = ContentUris.withAppendedId( + Constants.FAVORITE_CONTENT_URI, id); + + CursorWrapper item = (CursorWrapper) getListAdapter() + .getItem(position); + Station orig = Station.getByAbbreviation(CursorUtils + .getString(item, RoutesColumns.FROM_STATION)); + Station dest = Station.getByAbbreviation(CursorUtils + .getString(item, RoutesColumns.TO_STATION)); + mCurrentlySelectedOrigin = orig; + mCurrentlySelectedDestination = dest; + + startContextualActionMode(); + return true; + } + }); ((Button) findViewById(R.id.quickLookupButton)) .setOnClickListener(new View.OnClickListener() { @@ -98,6 +124,26 @@ public class RoutesListActivity extends ActionBarListActivity { Constants.ARBITRARY_ROUTE_CONTENT_URI_ROOT)); } }); + + if (savedInstanceState != null) { + if (savedInstanceState.getString("currentlySelectedOrigin") != null) { + mCurrentlySelectedOrigin = Station + .getByAbbreviation(savedInstanceState + .getString("currentlySelectedOrigin")); + } + if (savedInstanceState.getString("currentlySelectedDestination") != null) { + mCurrentlySelectedDestination = Station + .getByAbbreviation(savedInstanceState + .getString("currentlySelectedDestination")); + } + if (savedInstanceState.getParcelable("currentlySelectedUri") != null) { + mCurrentlySelectedUri = (Uri) savedInstanceState + .getParcelable("currentlySelectedUri"); + } + if (savedInstanceState.getBoolean("hasActionMode")) { + startContextualActionMode(); + } + } } private void refreshFares() { @@ -146,6 +192,19 @@ public class RoutesListActivity extends ActionBarListActivity { } } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mCurrentlySelectedOrigin != null) + outState.putString("currentlySelectedOrigin", + mCurrentlySelectedOrigin.abbreviation); + if (mCurrentlySelectedDestination != null) + outState.putString("currentlySelectedDestination", + mCurrentlySelectedDestination.abbreviation); + outState.putParcelable("currentlySelectedUri", mCurrentlySelectedUri); + outState.putBoolean("hasActionMode", mActionMode != null); + } + @Override protected void onResume() { super.onResume(); @@ -154,14 +213,12 @@ public class RoutesListActivity extends ActionBarListActivity { refreshFares(); } - @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); + MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.routes_list_menu, menu); - return true; + return super.onCreateOptionsMenu(menu); } - @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.add_favorite_menu_button) { @@ -182,47 +239,10 @@ public class RoutesListActivity extends ActionBarListActivity { ContentUris.withAppendedId(Constants.FAVORITE_CONTENT_URI, id))); } - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.route_context_menu, menu); - - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - CursorWrapper item = (CursorWrapper) getListAdapter().getItem( - info.position); - Station orig = Station.getByAbbreviation(CursorUtils.getString(item, - RoutesColumns.FROM_STATION)); - Station dest = Station.getByAbbreviation(CursorUtils.getString(item, - RoutesColumns.TO_STATION)); - mCurrentlySelectedRouteName = orig.name + " - " + dest.name; - menu.setHeaderTitle(mCurrentlySelectedRouteName); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item - .getMenuInfo(); - mCurrentlySelectedUri = ContentUris.withAppendedId( - Constants.FAVORITE_CONTENT_URI, info.id); - - if (item.getItemId() == R.id.view) { - startActivity(new Intent(Intent.ACTION_VIEW, mCurrentlySelectedUri)); - return true; - } else if (item.getItemId() == R.id.delete) { - showDialog(DIALOG_DELETE_EVENT); - return true; - } - return super.onContextItemSelected(item); - } - @Override protected Dialog onCreateDialog(int id) { if (id == DIALOG_DELETE_EVENT && mCurrentlySelectedUri != null) { final AlertDialog.Builder builder = new Builder(this); - builder.setTitle(mCurrentlySelectedRouteName); builder.setCancelable(false); builder.setMessage("Are you sure you want to delete this route?"); builder.setPositiveButton(R.string.yes, @@ -231,15 +251,15 @@ public class RoutesListActivity extends ActionBarListActivity { getContentResolver().delete(mCurrentlySelectedUri, null, null); mCurrentlySelectedUri = null; - mCurrentlySelectedRouteName = null; + mCurrentlySelectedOrigin = null; + mCurrentlySelectedDestination = null; + mActionMode.finish(); removeDialog(DIALOG_DELETE_EVENT); } }); builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - mCurrentlySelectedUri = null; - mCurrentlySelectedRouteName = null; removeDialog(DIALOG_DELETE_EVENT); } }); @@ -248,4 +268,44 @@ public class RoutesListActivity extends ActionBarListActivity { return super.onCreateDialog(id); } + private void startContextualActionMode() { + mActionMode = startActionMode(new RouteActionMode()); + mActionMode.setTitle(mCurrentlySelectedOrigin.name); + mActionMode.setSubtitle("to " + mCurrentlySelectedDestination.name); + } + + private final class RouteActionMode implements ActionMode.Callback { + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + mode.getMenuInflater().inflate(R.menu.route_context_menu, menu); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (item.getItemId() == R.id.view) { + startActivity(new Intent(Intent.ACTION_VIEW, + mCurrentlySelectedUri)); + mode.finish(); + return true; + } else if (item.getItemId() == R.id.delete) { + showDialog(DIALOG_DELETE_EVENT); + return false; + } + + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + } + + } } \ No newline at end of file diff --git a/src/com/dougkeen/bart/ViewDeparturesActivity.java b/src/com/dougkeen/bart/ViewDeparturesActivity.java index bed4509..7a6e3f4 100644 --- a/src/com/dougkeen/bart/ViewDeparturesActivity.java +++ b/src/com/dougkeen/bart/ViewDeparturesActivity.java @@ -18,18 +18,17 @@ import android.os.PowerManager; import android.text.format.DateFormat; import android.text.util.Linkify; import android.util.Log; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; -import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.ImageView; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; -import com.dougkeen.bart.actionbarcompat.ActionBarListActivity; +import com.actionbarsherlock.app.SherlockListActivity; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; import com.dougkeen.bart.controls.CountdownTextView; import com.dougkeen.bart.controls.Ticker; import com.dougkeen.bart.data.RoutesColumns; @@ -44,7 +43,7 @@ import com.dougkeen.bart.model.TextProvider; import com.dougkeen.bart.networktasks.GetRealTimeDeparturesTask; import com.dougkeen.bart.networktasks.GetScheduleInformationTask; -public class ViewDeparturesActivity extends ActionBarListActivity { +public class ViewDeparturesActivity extends SherlockListActivity { private static final int UNCERTAINTY_THRESHOLD = 17; @@ -72,6 +71,8 @@ public class ViewDeparturesActivity extends ActionBarListActivity { private boolean mDepartureFetchIsPending; private boolean mScheduleFetchIsPending; + private ActionMode mActionMode; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -120,17 +121,22 @@ public class ViewDeparturesActivity extends ActionBarListActivity { mBoardedDeparture = (Departure) savedInstanceState .getParcelable("boardedDeparture"); } + if (savedInstanceState.containsKey("selectedDeparture")) { + mSelectedDeparture = (Departure) savedInstanceState + .getParcelable("selectedDeparture"); + } + if(savedInstanceState.getBoolean("hasActionMode") && mSelectedDeparture != null) { + startDepartureActionMode(); + } } setListAdapter(mDeparturesAdapter); - registerForContextMenu(getListView()); - findViewById(R.id.missingDepartureText).setVisibility(View.VISIBLE); refreshBoardedDeparture(); - getActionBarHelper().setHomeButtonEnabled(true); - getActionBarHelper().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override @@ -166,6 +172,8 @@ public class ViewDeparturesActivity extends ActionBarListActivity { } outState.putParcelableArray("departures", departures); outState.putParcelable("boardedDeparture", mBoardedDeparture); + outState.putParcelable("selectedDeparture", mSelectedDeparture); + outState.putBoolean("hasActionMode", mActionMode != null); } @Override @@ -529,7 +537,7 @@ public class ViewDeparturesActivity extends ActionBarListActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); + MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.route_menu, menu); return true; } @@ -538,8 +546,7 @@ public class ViewDeparturesActivity extends ActionBarListActivity { public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == android.R.id.home) { - startActivity(new Intent(Intent.ACTION_PICK, - Constants.FAVORITE_CONTENT_URI)); + finish(); return true; } else if (itemId == R.id.view_on_bart_site_button) { startActivity(new Intent( @@ -560,30 +567,6 @@ public class ViewDeparturesActivity extends ActionBarListActivity { } } - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.departure_context_menu, menu); - - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - mSelectedDeparture = (Departure) getListAdapter() - .getItem(info.position); - menu.setHeaderTitle(R.string.departure_options); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - if (item.getItemId() == R.id.boardTrain) { - mBoardedDeparture = mSelectedDeparture; - refreshBoardedDeparture(); - return true; - } - return super.onContextItemSelected(item); - } - private void refreshBoardedDeparture() { if (mBoardedDeparture == null) return; @@ -630,13 +613,60 @@ public class ViewDeparturesActivity extends ActionBarListActivity { } }); - arrivalCountdown - .setText(departure.getEstimatedArrivalMinutesLeftText()); + arrivalCountdown.setText(departure + .getEstimatedArrivalMinutesLeftText(this)); arrivalCountdown.setTextProvider(new TextProvider() { @Override public String getText() { - return departure.getEstimatedArrivalMinutesLeftText(); + return departure + .getEstimatedArrivalMinutesLeftText(ViewDeparturesActivity.this); } }); } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + mSelectedDeparture = (Departure) getListAdapter().getItem(position); + if (mActionMode != null) { + mActionMode.finish(); + } + startDepartureActionMode(); + } + + private void startDepartureActionMode() { + mActionMode = startActionMode(new DepartureActionMode()); + mActionMode.setTitle(mSelectedDeparture.getDestinationName()); + mActionMode.setSubtitle(mSelectedDeparture.getTrainLengthText()); + } + + private class DepartureActionMode implements ActionMode.Callback { + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + mode.getMenuInflater().inflate(R.menu.departure_context_menu, menu); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + if (item.getItemId() == R.id.boardTrain) { + mBoardedDeparture = mSelectedDeparture; + refreshBoardedDeparture(); + mode.finish(); + return true; + } + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + } + + } } diff --git a/src/com/dougkeen/bart/ViewMapActivity.java b/src/com/dougkeen/bart/ViewMapActivity.java index 760c950..c95dd18 100644 --- a/src/com/dougkeen/bart/ViewMapActivity.java +++ b/src/com/dougkeen/bart/ViewMapActivity.java @@ -2,15 +2,15 @@ package com.dougkeen.bart; import android.content.Intent; import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.webkit.WebView; -import com.dougkeen.bart.actionbarcompat.ActionBarActivity; +import com.actionbarsherlock.app.SherlockActivity; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; import com.dougkeen.bart.model.Constants; -public class ViewMapActivity extends ActionBarActivity { +public class ViewMapActivity extends SherlockActivity { @Override protected void onCreate(Bundle savedInstanceState) { @@ -24,13 +24,13 @@ public class ViewMapActivity extends ActionBarActivity { webview.loadUrl("file:///android_res/drawable/map.png"); - getActionBarHelper().setHomeButtonEnabled(true); - getActionBarHelper().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); + MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.system_map_menu, menu); return true; } @@ -38,8 +38,7 @@ public class ViewMapActivity extends ActionBarActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { - startActivity(new Intent(Intent.ACTION_PICK, - Constants.FAVORITE_CONTENT_URI)); + finish(); return true; } return super.onOptionsItemSelected(item); diff --git a/src/com/dougkeen/bart/actionbarcompat/ActionBarActivity.java b/src/com/dougkeen/bart/actionbarcompat/ActionBarActivity.java deleted file mode 100644 index 02ea24e..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/ActionBarActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dougkeen.bart.actionbarcompat; - -import android.app.Activity; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; - -/** - * Damn, I wish Java had mixins - */ -public class ActionBarActivity extends Activity { - final ActionBarHelper mActionBarHelper = ActionBarHelper - .createInstance(this); - - /** - * Returns the {@link ActionBarHelper} for this activity. - */ - protected ActionBarHelper getActionBarHelper() { - return mActionBarHelper; - } - - /** {@inheritDoc} */ - @Override - public MenuInflater getMenuInflater() { - return mActionBarHelper.getMenuInflater(super.getMenuInflater()); - } - - /** {@inheritDoc} */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mActionBarHelper.onCreate(savedInstanceState); - } - - /** {@inheritDoc} */ - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mActionBarHelper.onPostCreate(savedInstanceState); - } - - /** - * Base action bar-aware implementation for - * {@link Activity#onCreateOptionsMenu(android.view.Menu)}. - * - * Note: marking menu items as invisible/visible is not currently supported. - */ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean retValue = false; - retValue |= mActionBarHelper.onCreateOptionsMenu(menu); - retValue |= super.onCreateOptionsMenu(menu); - return retValue; - } - - /** {@inheritDoc} */ - @Override - protected void onTitleChanged(CharSequence title, int color) { - mActionBarHelper.onTitleChanged(title, color); - super.onTitleChanged(title, color); - } - -} diff --git a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelper.java b/src/com/dougkeen/bart/actionbarcompat/ActionBarHelper.java deleted file mode 100644 index f4a2ab4..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelper.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import android.app.Activity; -import android.os.Build; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; - -/** - * An abstract class that handles some common action bar-related functionality - * in the app. This class provides functionality useful for both phones and - * tablets, and does not require any Android 3.0-specific features, although it - * uses them if available. - * - * Two implementations of this class are {@link ActionBarHelperBase} for a - * pre-Honeycomb version of the action bar, and {@link ActionBarHelperHoneycomb} - * , which uses the built-in ActionBar features in Android 3.0 and later. - */ -public abstract class ActionBarHelper { - protected Activity mActivity; - - /** - * Factory method for creating {@link ActionBarHelper} objects for a given - * activity. Depending on which device the app is running, either a basic - * helper or Honeycomb-specific helper will be returned. - */ - public static ActionBarHelper createInstance(Activity activity) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return new ActionBarHelperICS(activity); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - return new ActionBarHelperHoneycomb(activity); - } else { - return new ActionBarHelperBase(activity); - } - } - - protected ActionBarHelper(Activity activity) { - mActivity = activity; - } - - /** - * Action bar helper code to be run in - * {@link Activity#onCreate(android.os.Bundle)}. - */ - public void onCreate(Bundle savedInstanceState) { - } - - /** - * Action bar helper code to be run in - * {@link Activity#onPostCreate(android.os.Bundle)}. - */ - public void onPostCreate(Bundle savedInstanceState) { - } - - /** - * Action bar helper code to be run in - * {@link Activity#onCreateOptionsMenu(android.view.Menu)}. - * - * NOTE: Setting the visibility of menu items in menu is not - * currently supported. - */ - public boolean onCreateOptionsMenu(Menu menu) { - return true; - } - - /** - * Action bar helper code to be run in - * {@link Activity#onTitleChanged(CharSequence, int)}. - */ - protected void onTitleChanged(CharSequence title, int color) { - } - - /** - * Sets the indeterminate loading state of the item with ID - * {@link R.id.menu_refresh}. (where the item ID was menu_refresh). - */ - public abstract void setRefreshActionItemState(boolean refreshing); - - /** - * Returns a {@link MenuInflater} for use when inflating menus. The - * implementation of this method in {@link ActionBarHelperBase} returns a - * wrapped menu inflater that can read action bar metadata from a menu - * resource pre-Honeycomb. - */ - public MenuInflater getMenuInflater(MenuInflater superMenuInflater) { - return superMenuInflater; - } - - abstract public void setHomeButtonEnabled(boolean enabled); - - abstract public void setDisplayHomeAsUpEnabled(boolean enabled); -} diff --git a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperBase.java b/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperBase.java deleted file mode 100644 index d6d36ed..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperBase.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import android.app.Activity; -import android.content.Context; -import android.content.res.XmlResourceParser; -import android.os.Bundle; -import android.view.InflateException; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.TextView; - -import com.dougkeen.bart.R; - -/** - * A class that implements the action bar pattern for pre-Honeycomb devices. - */ -public class ActionBarHelperBase extends ActionBarHelper { - private static final String MENU_RES_NAMESPACE = "http://schemas.android.com/apk/res/android"; - private static final String MENU_ATTR_ID = "id"; - private static final String MENU_ATTR_SHOW_AS_ACTION = "showAsAction"; - - protected Set mActionItemIds = new HashSet(); - - protected ActionBarHelperBase(Activity activity) { - super(activity); - } - - /** {@inheritDoc} */ - @Override - public void onCreate(Bundle savedInstanceState) { - mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); - } - - /** {@inheritDoc} */ - @Override - public void onPostCreate(Bundle savedInstanceState) { - mActivity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, - R.layout.actionbar_compat); - setupActionBar(); - - SimpleMenu menu = new SimpleMenu(mActivity); - mActivity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); - mActivity.onPrepareOptionsMenu(menu); - for (int i = 0; i < menu.size(); i++) { - MenuItem item = menu.getItem(i); - if (mActionItemIds.contains(item.getItemId())) { - addActionItemCompatFromMenuItem(item); - } - } - } - - /** - * Sets up the compatibility action bar with the given title. - */ - private void setupActionBar() { - final ViewGroup actionBarCompat = getActionBarCompat(); - if (actionBarCompat == null) { - return; - } - - LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams( - 0, ViewGroup.LayoutParams.FILL_PARENT); - springLayoutParams.weight = 1; - - // Add Home button - SimpleMenu tempMenu = new SimpleMenu(mActivity); - SimpleMenuItem homeItem = new SimpleMenuItem(tempMenu, - android.R.id.home, 0, mActivity.getString(R.string.app_name)); - homeItem.setIcon(R.drawable.icon); - addActionItemCompatFromMenuItem(homeItem); - - // Add title text - TextView titleText = new TextView(mActivity, null, - R.attr.actionbarCompatTitleStyle); - titleText.setLayoutParams(springLayoutParams); - titleText.setText(mActivity.getTitle()); - actionBarCompat.addView(titleText); - } - - /** {@inheritDoc} */ - @Override - public void setRefreshActionItemState(boolean refreshing) { - View refreshButton = mActivity - .findViewById(R.id.actionbar_compat_item_refresh); - View refreshIndicator = mActivity - .findViewById(R.id.actionbar_compat_item_refresh_progress); - - if (refreshButton != null) { - refreshButton.setVisibility(refreshing ? View.GONE : View.VISIBLE); - } - if (refreshIndicator != null) { - refreshIndicator.setVisibility(refreshing ? View.VISIBLE - : View.GONE); - } - } - - /** - * Action bar helper code to be run in - * {@link Activity#onCreateOptionsMenu(android.view.Menu)}. - * - * NOTE: This code will mark on-screen menu items as invisible. - */ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Hides on-screen action items from the options menu. - for (Integer id : mActionItemIds) { - menu.findItem(id).setVisible(false); - } - return true; - } - - /** {@inheritDoc} */ - @Override - protected void onTitleChanged(CharSequence title, int color) { - TextView titleView = (TextView) mActivity - .findViewById(R.id.actionbar_compat_title); - if (titleView != null) { - titleView.setText(title); - } - } - - /** - * Returns a {@link android.view.MenuInflater} that can read action bar - * metadata on pre-Honeycomb devices. - */ - public MenuInflater getMenuInflater(MenuInflater superMenuInflater) { - return new WrappedMenuInflater(mActivity, superMenuInflater); - } - - /** - * Returns the {@link android.view.ViewGroup} for the action bar on phones - * (compatibility action bar). Can return null, and will return null on - * Honeycomb. - */ - private ViewGroup getActionBarCompat() { - return (ViewGroup) mActivity.findViewById(R.id.actionbar_compat); - } - - /** - * Adds an action button to the compatibility action bar, using menu - * information from a {@link android.view.MenuItem}. If the menu item ID is - * menu_refresh, the menu item's state can be changed to show a - * loading spinner using - * {@link com.example.android.actionbarcompat.ActionBarHelperBase#setRefreshActionItemState(boolean)} - * . - */ - private View addActionItemCompatFromMenuItem(final MenuItem item) { - final int itemId = item.getItemId(); - - final ViewGroup actionBar = getActionBarCompat(); - if (actionBar == null) { - return null; - } - - // Create the button - ImageButton actionButton = new ImageButton( - mActivity, - null, - itemId == android.R.id.home ? R.attr.actionbarCompatItemHomeStyle - : R.attr.actionbarCompatItemStyle); - actionButton - .setLayoutParams(new ViewGroup.LayoutParams( - (int) mActivity - .getResources() - .getDimension( - itemId == android.R.id.home ? R.dimen.actionbar_compat_button_home_width - : R.dimen.actionbar_compat_button_width), - ViewGroup.LayoutParams.FILL_PARENT)); - if (itemId == R.id.menu_refresh) { - actionButton.setId(R.id.actionbar_compat_item_refresh); - } - actionButton.setImageDrawable(item.getIcon()); - actionButton.setScaleType(ImageView.ScaleType.CENTER); - actionButton.setContentDescription(item.getTitle()); - actionButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View view) { - mActivity - .onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); - } - }); - - actionBar.addView(actionButton); - - if (item.getItemId() == R.id.menu_refresh) { - // Refresh buttons should be stateful, and allow for indeterminate - // progress indicators, - // so add those. - ProgressBar indicator = new ProgressBar(mActivity, null, - R.attr.actionbarCompatProgressIndicatorStyle); - - final int buttonWidth = mActivity.getResources() - .getDimensionPixelSize( - R.dimen.actionbar_compat_button_width); - final int buttonHeight = mActivity.getResources() - .getDimensionPixelSize(R.dimen.actionbar_compat_height); - final int progressIndicatorWidth = buttonWidth / 2; - - LinearLayout.LayoutParams indicatorLayoutParams = new LinearLayout.LayoutParams( - progressIndicatorWidth, progressIndicatorWidth); - indicatorLayoutParams.setMargins( - (buttonWidth - progressIndicatorWidth) / 2, - (buttonHeight - progressIndicatorWidth) / 2, - (buttonWidth - progressIndicatorWidth) / 2, 0); - indicator.setLayoutParams(indicatorLayoutParams); - indicator.setVisibility(View.GONE); - indicator.setId(R.id.actionbar_compat_item_refresh_progress); - actionBar.addView(indicator); - } - - return actionButton; - } - - /** - * A {@link android.view.MenuInflater} that reads action bar metadata. - */ - private class WrappedMenuInflater extends MenuInflater { - MenuInflater mInflater; - - public WrappedMenuInflater(Context context, MenuInflater inflater) { - super(context); - mInflater = inflater; - } - - @Override - public void inflate(int menuRes, Menu menu) { - loadActionBarMetadata(menuRes); - mInflater.inflate(menuRes, menu); - } - - /** - * Loads action bar metadata from a menu resource, storing a list of - * menu item IDs that should be shown on-screen (i.e. those with - * showAsAction set to always or ifRoom). - * - * @param menuResId - */ - private void loadActionBarMetadata(int menuResId) { - XmlResourceParser parser = null; - try { - parser = mActivity.getResources().getXml(menuResId); - - int eventType = parser.getEventType(); - int itemId; - int showAsAction; - - boolean eof = false; - while (!eof) { - switch (eventType) { - case XmlPullParser.START_TAG: - if (!parser.getName().equals("item")) { - break; - } - - itemId = parser.getAttributeResourceValue( - MENU_RES_NAMESPACE, MENU_ATTR_ID, 0); - if (itemId == 0) { - break; - } - - showAsAction = parser.getAttributeIntValue( - MENU_RES_NAMESPACE, MENU_ATTR_SHOW_AS_ACTION, - -1); - if ((showAsAction & MenuItem.SHOW_AS_ACTION_ALWAYS) > 0 - || (showAsAction & MenuItem.SHOW_AS_ACTION_IF_ROOM) > 0) { - mActionItemIds.add(itemId); - } - break; - - case XmlPullParser.END_DOCUMENT: - eof = true; - break; - } - - eventType = parser.next(); - } - } catch (XmlPullParserException e) { - throw new InflateException("Error inflating menu XML", e); - } catch (IOException e) { - throw new InflateException("Error inflating menu XML", e); - } finally { - if (parser != null) { - parser.close(); - } - } - } - - } - - @Override - public void setHomeButtonEnabled(boolean enabled) { - } - - @Override - public void setDisplayHomeAsUpEnabled(boolean enabled) { - } -} diff --git a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperHoneycomb.java b/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperHoneycomb.java deleted file mode 100644 index 8dbf070..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperHoneycomb.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import android.app.Activity; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; - -import com.dougkeen.bart.R; - -/** - * An extension of {@link ActionBarHelper} that provides Android 3.0-specific - * functionality for Honeycomb tablets. It thus requires API level 11. - */ -public class ActionBarHelperHoneycomb extends ActionBarHelper { - private Menu mOptionsMenu; - private View mRefreshIndeterminateProgressView = null; - - protected ActionBarHelperHoneycomb(Activity activity) { - super(activity); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - mOptionsMenu = menu; - return super.onCreateOptionsMenu(menu); - } - - @Override - public void setRefreshActionItemState(boolean refreshing) { - // On Honeycomb, we can set the state of the refresh button by giving it - // a custom - // action view. - if (mOptionsMenu == null) { - return; - } - - final MenuItem refreshItem = mOptionsMenu.findItem(R.id.menu_refresh); - if (refreshItem != null) { - if (refreshing) { - if (mRefreshIndeterminateProgressView == null) { - LayoutInflater inflater = (LayoutInflater) getActionBarThemedContext() - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mRefreshIndeterminateProgressView = inflater.inflate( - R.layout.actionbar_indeterminate_progress, null); - } - - refreshItem.setActionView(mRefreshIndeterminateProgressView); - } else { - refreshItem.setActionView(null); - } - } - } - - /** - * Returns a {@link Context} suitable for inflating layouts for the action - * bar. The implementation for this method in {@link ActionBarHelperICS} - * asks the action bar for a themed context. - */ - protected Context getActionBarThemedContext() { - return mActivity; - } - - @Override - public void setHomeButtonEnabled(boolean enabled) { - mActivity.getActionBar().setHomeButtonEnabled(enabled); - } - - @Override - public void setDisplayHomeAsUpEnabled(boolean enabled) { - mActivity.getActionBar().setDisplayHomeAsUpEnabled(enabled); - } -} diff --git a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperICS.java b/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperICS.java deleted file mode 100644 index d71b045..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/ActionBarHelperICS.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import android.app.Activity; -import android.content.Context; - -/** - * An extension of {@link com.example.android.actionbarcompat.ActionBarHelper} that provides Android - * 4.0-specific functionality for IceCreamSandwich devices. It thus requires API level 14. - */ -public class ActionBarHelperICS extends ActionBarHelperHoneycomb { - protected ActionBarHelperICS(Activity activity) { - super(activity); - } - - @Override - protected Context getActionBarThemedContext() { - return mActivity.getActionBar().getThemedContext(); - } -} diff --git a/src/com/dougkeen/bart/actionbarcompat/ActionBarListActivity.java b/src/com/dougkeen/bart/actionbarcompat/ActionBarListActivity.java deleted file mode 100644 index 256efad..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/ActionBarListActivity.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import android.app.Activity; -import android.app.ListActivity; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; - -/** - * A base activity that defers common functionality across app activities to an {@link - * ActionBarHelper}. - * - * NOTE: dynamically marking menu items as invisible/visible is not currently supported. - * - * NOTE: this may used with the Android Compatibility Package by extending - * android.support.v4.app.FragmentActivity instead of {@link Activity}. - */ -public abstract class ActionBarListActivity extends ListActivity { - final ActionBarHelper mActionBarHelper = ActionBarHelper.createInstance(this); - - /** - * Returns the {@link ActionBarHelper} for this activity. - */ - protected ActionBarHelper getActionBarHelper() { - return mActionBarHelper; - } - - /**{@inheritDoc}*/ - @Override - public MenuInflater getMenuInflater() { - return mActionBarHelper.getMenuInflater(super.getMenuInflater()); - } - - /**{@inheritDoc}*/ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mActionBarHelper.onCreate(savedInstanceState); - } - - /**{@inheritDoc}*/ - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mActionBarHelper.onPostCreate(savedInstanceState); - } - - /** - * Base action bar-aware implementation for - * {@link Activity#onCreateOptionsMenu(android.view.Menu)}. - * - * Note: marking menu items as invisible/visible is not currently supported. - */ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean retValue = false; - retValue |= mActionBarHelper.onCreateOptionsMenu(menu); - retValue |= super.onCreateOptionsMenu(menu); - return retValue; - } - - /**{@inheritDoc}*/ - @Override - protected void onTitleChanged(CharSequence title, int color) { - mActionBarHelper.onTitleChanged(title, color); - super.onTitleChanged(title, color); - } -} diff --git a/src/com/dougkeen/bart/actionbarcompat/SimpleMenu.java b/src/com/dougkeen/bart/actionbarcompat/SimpleMenu.java deleted file mode 100644 index d2dc936..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/SimpleMenu.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.SubMenu; - -import java.util.ArrayList; - -/** - * A really dumb implementation of the {@link android.view.Menu} interface, that's only - * useful for our actionbar-compat purposes. See - * com.android.internal.view.menu.MenuBuilder in AOSP for a more complete - * implementation. - */ -public class SimpleMenu implements Menu { - - private Context mContext; - private Resources mResources; - - private ArrayList mItems; - - public SimpleMenu(Context context) { - mContext = context; - mResources = context.getResources(); - mItems = new ArrayList(); - } - - public Context getContext() { - return mContext; - } - - public Resources getResources() { - return mResources; - } - - public MenuItem add(CharSequence title) { - return addInternal(0, 0, title); - } - - public MenuItem add(int titleRes) { - return addInternal(0, 0, mResources.getString(titleRes)); - } - - public MenuItem add(int groupId, int itemId, int order, CharSequence title) { - return addInternal(itemId, order, title); - } - - public MenuItem add(int groupId, int itemId, int order, int titleRes) { - return addInternal(itemId, order, mResources.getString(titleRes)); - } - - /** - * Adds an item to the menu. The other add methods funnel to this. - */ - private MenuItem addInternal(int itemId, int order, CharSequence title) { - final SimpleMenuItem item = new SimpleMenuItem(this, itemId, order, title); - mItems.add(findInsertIndex(mItems, order), item); - return item; - } - - private static int findInsertIndex(ArrayList items, int order) { - for (int i = items.size() - 1; i >= 0; i--) { - MenuItem item = items.get(i); - if (item.getOrder() <= order) { - return i + 1; - } - } - - return 0; - } - - public int findItemIndex(int id) { - final int size = size(); - - for (int i = 0; i < size; i++) { - SimpleMenuItem item = mItems.get(i); - if (item.getItemId() == id) { - return i; - } - } - - return -1; - } - - public void removeItem(int itemId) { - removeItemAtInt(findItemIndex(itemId)); - } - - private void removeItemAtInt(int index) { - if ((index < 0) || (index >= mItems.size())) { - return; - } - mItems.remove(index); - } - - public void clear() { - mItems.clear(); - } - - public MenuItem findItem(int id) { - final int size = size(); - for (int i = 0; i < size; i++) { - SimpleMenuItem item = mItems.get(i); - if (item.getItemId() == id) { - return item; - } - } - - return null; - } - - public int size() { - return mItems.size(); - } - - public MenuItem getItem(int index) { - return mItems.get(index); - } - - // Unsupported operations. - - public SubMenu addSubMenu(CharSequence charSequence) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public SubMenu addSubMenu(int titleRes) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public int addIntentOptions(int i, int i1, int i2, ComponentName componentName, - Intent[] intents, Intent intent, int i3, MenuItem[] menuItems) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public void removeGroup(int i) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public void setGroupCheckable(int i, boolean b, boolean b1) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public void setGroupVisible(int i, boolean b) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public void setGroupEnabled(int i, boolean b) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public boolean hasVisibleItems() { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public void close() { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public boolean performShortcut(int i, KeyEvent keyEvent, int i1) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public boolean isShortcutKey(int i, KeyEvent keyEvent) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public boolean performIdentifierAction(int i, int i1) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } - - public void setQwertyMode(boolean b) { - throw new UnsupportedOperationException("This operation is not supported for SimpleMenu"); - } -} diff --git a/src/com/dougkeen/bart/actionbarcompat/SimpleMenuItem.java b/src/com/dougkeen/bart/actionbarcompat/SimpleMenuItem.java deleted file mode 100644 index 54722e2..0000000 --- a/src/com/dougkeen/bart/actionbarcompat/SimpleMenuItem.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dougkeen.bart.actionbarcompat; - -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.view.ActionProvider; -import android.view.ContextMenu; -import android.view.MenuItem; -import android.view.SubMenu; -import android.view.View; - -/** - * A really dumb implementation of the {@link android.view.MenuItem} - * interface, that's only useful for our actionbar-compat purposes. See - * com.android.internal.view.menu.MenuItemImpl in AOSP for a more - * complete implementation. - */ -public class SimpleMenuItem implements MenuItem { - - private SimpleMenu mMenu; - - private final int mId; - private final int mOrder; - private CharSequence mTitle; - private CharSequence mTitleCondensed; - private Drawable mIconDrawable; - private int mIconResId = 0; - private boolean mEnabled = true; - - public SimpleMenuItem(SimpleMenu menu, int id, int order, CharSequence title) { - mMenu = menu; - mId = id; - mOrder = order; - mTitle = title; - } - - public int getItemId() { - return mId; - } - - public int getOrder() { - return mOrder; - } - - public MenuItem setTitle(CharSequence title) { - mTitle = title; - return this; - } - - public MenuItem setTitle(int titleRes) { - return setTitle(mMenu.getContext().getString(titleRes)); - } - - public CharSequence getTitle() { - return mTitle; - } - - public MenuItem setTitleCondensed(CharSequence title) { - mTitleCondensed = title; - return this; - } - - public CharSequence getTitleCondensed() { - return mTitleCondensed != null ? mTitleCondensed : mTitle; - } - - public MenuItem setIcon(Drawable icon) { - mIconResId = 0; - mIconDrawable = icon; - return this; - } - - public MenuItem setIcon(int iconResId) { - mIconDrawable = null; - mIconResId = iconResId; - return this; - } - - public Drawable getIcon() { - if (mIconDrawable != null) { - return mIconDrawable; - } - - if (mIconResId != 0) { - return mMenu.getResources().getDrawable(mIconResId); - } - - return null; - } - - public MenuItem setEnabled(boolean enabled) { - mEnabled = enabled; - return this; - } - - public boolean isEnabled() { - return mEnabled; - } - - // No-op operations. We use no-ops to allow inflation from menu XML. - - public int getGroupId() { - // Noop - return 0; - } - - public View getActionView() { - // Noop - return null; - } - - public MenuItem setActionProvider(ActionProvider actionProvider) { - // Noop - return this; - } - - public ActionProvider getActionProvider() { - // Noop - return null; - } - - public boolean expandActionView() { - // Noop - return false; - } - - public boolean collapseActionView() { - // Noop - return false; - } - - public boolean isActionViewExpanded() { - // Noop - return false; - } - - @Override - public MenuItem setOnActionExpandListener( - OnActionExpandListener onActionExpandListener) { - // Noop - return this; - } - - public MenuItem setIntent(Intent intent) { - // Noop - return this; - } - - public Intent getIntent() { - // Noop - return null; - } - - public MenuItem setShortcut(char c, char c1) { - // Noop - return this; - } - - public MenuItem setNumericShortcut(char c) { - // Noop - return this; - } - - public char getNumericShortcut() { - // Noop - return 0; - } - - public MenuItem setAlphabeticShortcut(char c) { - // Noop - return this; - } - - public char getAlphabeticShortcut() { - // Noop - return 0; - } - - public MenuItem setCheckable(boolean b) { - // Noop - return this; - } - - public boolean isCheckable() { - // Noop - return false; - } - - public MenuItem setChecked(boolean b) { - // Noop - return this; - } - - public boolean isChecked() { - // Noop - return false; - } - - public MenuItem setVisible(boolean b) { - // Noop - return this; - } - - public boolean isVisible() { - // Noop - return true; - } - - public boolean hasSubMenu() { - // Noop - return false; - } - - public SubMenu getSubMenu() { - // Noop - return null; - } - - public MenuItem setOnMenuItemClickListener( - OnMenuItemClickListener onMenuItemClickListener) { - // Noop - return this; - } - - public ContextMenu.ContextMenuInfo getMenuInfo() { - // Noop - return null; - } - - public void setShowAsAction(int i) { - // Noop - } - - public MenuItem setShowAsActionFlags(int i) { - // Noop - return null; - } - - public MenuItem setActionView(View view) { - // Noop - return this; - } - - public MenuItem setActionView(int i) { - // Noop - return this; - } -} diff --git a/src/com/dougkeen/bart/controls/Ticker.java b/src/com/dougkeen/bart/controls/Ticker.java index 83d502a..a9a9af9 100644 --- a/src/com/dougkeen/bart/controls/Ticker.java +++ b/src/com/dougkeen/bart/controls/Ticker.java @@ -40,7 +40,7 @@ public class Ticker { mForceStop = false; return; } - Log.w("Ticker", "Tick #: " + mTickCount); + long startTimeNanos = System.nanoTime(); Iterator iterator = publisher.mSubscribers.keySet() .iterator(); diff --git a/src/com/dougkeen/bart/model/Departure.java b/src/com/dougkeen/bart/model/Departure.java index 19ecc69..b31e5d7 100644 --- a/src/com/dougkeen/bart/model/Departure.java +++ b/src/com/dougkeen/bart/model/Departure.java @@ -230,16 +230,22 @@ public class Departure implements Parcelable, Comparable { } } - public String getEstimatedArrivalMinutesLeftText() { + public String getEstimatedArrivalMinutesLeftText(Context context) { + if (!hasAnyArrivalEstimate()) { + return "Estimated arrival unknown"; + } long minutesLeft = getEstimatedArrivalMinutesLeft(); if (minutesLeft < 0) { return "Arrived at destination"; } else if (minutesLeft == 0) { - return "Estimated arrival in < 1 min."; + return "Arrives around " + getEstimatedArrivalTimeText(context) + + " (<1 min)"; } else if (minutesLeft == 1) { - return "Estimated arrival in 1 min."; + return "Arrives around " + getEstimatedArrivalTimeText(context) + + " (1 min)"; } else { - return "Estimated arrival in " + minutesLeft + " mins."; + return "Arrives around " + getEstimatedArrivalTimeText(context) + + " (" + minutesLeft + " mins)"; } }