diff --git a/.gitmodules b/.gitmodules index e650e93..221b65b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,3 @@ -[submodule "holoeverywhere"] - path = holoeverywhere - url = https://github.com/Prototik/HoloEverywhere.git -[submodule "nineoldandroids"] - path = nineoldandroids - url = https://github.com/JakeWharton/NineOldAndroids [submodule "drag-sort-listview"] path = drag-sort-listview url = https://github.com/bauerca/drag-sort-listview diff --git a/.project b/.project deleted file mode 100644 index 1ce07ec..0000000 --- a/.project +++ /dev/null @@ -1,39 +0,0 @@ - - - BARTRunner - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - net.rim.ajde.internal.verifier - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - net.rim.ajde.BlackBerryAndroidNature - - diff --git a/app/build.gradle b/app/build.gradle index 5067daa..d79ca26 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,17 +2,21 @@ apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile project(":holoeverywhere-gradle") - compile project(":holoeverywhere-preferences-gradle") - compile project(":drag-sort-listview-gradle") + compile project(':drag-sort-listview-gradle') + compile 'commons-io:commons-io:2.4' + compile 'org.apache.commons:commons-lang3:3.4' + compile 'com.fasterxml.jackson.core:jackson-databind:2.6.1' + compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE' + compile 'com.code-troopers.betterpickers:library:2.0.0' + + compile 'com.android.support:appcompat-v7:22.2.1' apt 'com.googlecode.androidannotations:androidannotations:2.7' compile "com.googlecode.androidannotations:androidannotations-api:2.7" } android { - compileSdkVersion 17 + compileSdkVersion 22 buildToolsVersion "22.0.1" compileOptions { @@ -20,8 +24,13 @@ android { targetCompatibility JavaVersion.VERSION_1_7 } - sourceSets { - main.java.srcDirs += ["../nineoldandroids/library/src"] + defaultConfig { + versionName "2.2.4" + versionCode 31 + + // TODO(fuegofro) - bring this back down to 8 if it's easy by using a different number picker library + minSdkVersion 9 + targetSdkVersion 22 } buildTypes { @@ -31,8 +40,10 @@ android { } packagingOptions { + exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/license.txt' + exclude 'META-INF/NOTICE' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/notice.txt' } diff --git a/app/libs/commons-io-2.0.1.jar b/app/libs/commons-io-2.0.1.jar deleted file mode 100644 index 5b64b7d..0000000 Binary files a/app/libs/commons-io-2.0.1.jar and /dev/null differ diff --git a/app/libs/commons-lang3-3.1.jar b/app/libs/commons-lang3-3.1.jar deleted file mode 100644 index a85e539..0000000 Binary files a/app/libs/commons-lang3-3.1.jar and /dev/null differ diff --git a/app/libs/jackson-annotations-2.1.1.jar b/app/libs/jackson-annotations-2.1.1.jar deleted file mode 100644 index 740a1e9..0000000 Binary files a/app/libs/jackson-annotations-2.1.1.jar and /dev/null differ diff --git a/app/libs/jackson-core-2.1.2.jar b/app/libs/jackson-core-2.1.2.jar deleted file mode 100644 index 961d6f0..0000000 Binary files a/app/libs/jackson-core-2.1.2.jar and /dev/null differ diff --git a/app/libs/jackson-databind-2.1.0.jar b/app/libs/jackson-databind-2.1.0.jar deleted file mode 100644 index 5eceb00..0000000 Binary files a/app/libs/jackson-databind-2.1.0.jar and /dev/null differ diff --git a/app/libs/spring-android-core-1.0.1.RELEASE.jar b/app/libs/spring-android-core-1.0.1.RELEASE.jar deleted file mode 100644 index bba682b..0000000 Binary files a/app/libs/spring-android-core-1.0.1.RELEASE.jar and /dev/null differ diff --git a/app/libs/spring-android-rest-template-1.0.1.RELEASE.jar b/app/libs/spring-android-rest-template-1.0.1.RELEASE.jar deleted file mode 100644 index 427b0fd..0000000 Binary files a/app/libs/spring-android-rest-template-1.0.1.RELEASE.jar and /dev/null differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78338ba..3c541d9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,22 +2,19 @@ + > - - + android:theme="@style/AppTheme" + android:allowBackup="true" + > - \ No newline at end of file + diff --git a/app/src/main/java/com/dougkeen/bart/BartRunnerApplication.java b/app/src/main/java/com/dougkeen/bart/BartRunnerApplication.java index 970a902..c4b55a0 100644 --- a/app/src/main/java/com/dougkeen/bart/BartRunnerApplication.java +++ b/app/src/main/java/com/dougkeen/bart/BartRunnerApplication.java @@ -8,9 +8,9 @@ import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ObjectUtils; -import org.holoeverywhere.app.Application; import android.app.AlarmManager; +import android.app.Application; import android.content.Context; import android.media.MediaPlayer; import android.os.Parcel; @@ -126,10 +126,10 @@ public class BartRunnerApplication extends Application { .createFromParcel(parcel); parcel.recycle(); - /* + /* * Ooptionally check if the cached one is relatively recent. - * If so, restore that to the application context - */ + * If so, restore that to the application context + */ long now = System.currentTimeMillis(); if (useOldCache || lastBoardedDeparture.getEstimatedArrivalTime() >= now diff --git a/app/src/main/java/com/dougkeen/bart/activities/AbstractRouteSelectionFragment.java b/app/src/main/java/com/dougkeen/bart/activities/AbstractRouteSelectionFragment.java index 849048e..0834ef8 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/AbstractRouteSelectionFragment.java +++ b/app/src/main/java/com/dougkeen/bart/activities/AbstractRouteSelectionFragment.java @@ -1,20 +1,21 @@ package com.dougkeen.bart.activities; -import org.holoeverywhere.LayoutInflater; -import org.holoeverywhere.app.AlertDialog; -import org.holoeverywhere.app.Dialog; -import org.holoeverywhere.app.DialogFragment; -import org.holoeverywhere.widget.ArrayAdapter; -import org.holoeverywhere.widget.Spinner; -import org.holoeverywhere.widget.Toast; - +import android.annotation.SuppressLint; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; +import android.support.v7.app.AlertDialog; +import android.view.LayoutInflater; import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; import com.dougkeen.bart.R; import com.dougkeen.bart.model.Station; @@ -57,22 +58,23 @@ public abstract class AbstractRouteSelectionFragment extends DialogFragment { final Dialog dialog = getDialog(); final FragmentActivity activity = getActivity(); - ArrayAdapter originSpinnerAdapter = new ArrayAdapter( - activity, R.layout.simple_spinner_item, + + ArrayAdapter originSpinnerAdapter = new ArrayAdapter<>( + activity, R.layout.support_simple_spinner_dropdown_item, Station.getStationList()); originSpinnerAdapter - .setDropDownViewResource(R.layout.simple_spinner_dropdown_item); + .setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item); final Spinner originSpinner = (Spinner) dialog .findViewById(R.id.origin_spinner); originSpinner.setAdapter(originSpinnerAdapter); originSpinner.setSelection(lastSelectedOriginPosition); - ArrayAdapter destinationSpinnerAdapter = new ArrayAdapter( - activity, R.layout.simple_spinner_item, + ArrayAdapter destinationSpinnerAdapter = new ArrayAdapter<>( + activity, R.layout.support_simple_spinner_dropdown_item, Station.getStationList()); destinationSpinnerAdapter - .setDropDownViewResource(R.layout.simple_spinner_dropdown_item); + .setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item); final Spinner destinationSpinner = (Spinner) dialog .findViewById(R.id.destination_spinner); @@ -80,12 +82,14 @@ public abstract class AbstractRouteSelectionFragment extends DialogFragment { destinationSpinner.setSelection(lastSelectedDestinationPosition); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final FragmentActivity activity = getActivity(); - final View dialogView = LayoutInflater.inflate(activity, - R.layout.route_form); + @SuppressLint("InflateParams") + final View dialogView = LayoutInflater.from(activity) + .inflate(R.layout.route_form, null /* root */); return new AlertDialog.Builder(activity) .setTitle(mTitle) @@ -117,6 +121,7 @@ public abstract class AbstractRouteSelectionFragment extends DialogFragment { Station origin = (Station) originSpinner.getSelectedItem(); Station destination = (Station) destinationSpinner.getSelectedItem(); + // TODO(fuegofro) - convert these toasts to error messages on the dialog. if (origin == null) { Toast.makeText(dialog.getContext(), com.dougkeen.bart.R.string.error_null_origin, diff --git a/app/src/main/java/com/dougkeen/bart/activities/AddRouteDialogFragment.java b/app/src/main/java/com/dougkeen/bart/activities/AddRouteDialogFragment.java index 062b566..189e9a3 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/AddRouteDialogFragment.java +++ b/app/src/main/java/com/dougkeen/bart/activities/AddRouteDialogFragment.java @@ -9,6 +9,8 @@ import com.dougkeen.bart.model.Station; import com.dougkeen.bart.model.StationPair; public class AddRouteDialogFragment extends AbstractRouteSelectionFragment { + public static final String TAG = "ADD_ROUTE_DIALOG_FRAGMENT_TAG"; + public AddRouteDialogFragment() { super(BartRunnerApplication.getAppContext().getString( R.string.add_route)); diff --git a/app/src/main/java/com/dougkeen/bart/activities/QuickRouteDialogFragment.java b/app/src/main/java/com/dougkeen/bart/activities/QuickRouteDialogFragment.java index c85e3c0..0f7e4de 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/QuickRouteDialogFragment.java +++ b/app/src/main/java/com/dougkeen/bart/activities/QuickRouteDialogFragment.java @@ -10,6 +10,8 @@ import com.dougkeen.bart.model.StationPair; public class QuickRouteDialogFragment extends AbstractRouteSelectionFragment { + public static final String TAG = "QUICK_ROUTE_DIALOG_FRAGMENT_TAG"; + public QuickRouteDialogFragment() { super(BartRunnerApplication.getAppContext().getString( R.string.quick_departure_lookup)); diff --git a/app/src/main/java/com/dougkeen/bart/activities/RoutesListActivity.java b/app/src/main/java/com/dougkeen/bart/activities/RoutesListActivity.java index c80c829..e1e211d 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/RoutesListActivity.java +++ b/app/src/main/java/com/dougkeen/bart/activities/RoutesListActivity.java @@ -3,26 +3,25 @@ package com.dougkeen.bart.activities; import java.util.Calendar; import java.util.TimeZone; -import org.holoeverywhere.app.Activity; -import org.holoeverywhere.app.AlertDialog; -import org.holoeverywhere.app.AlertDialog.Builder; -import org.holoeverywhere.app.DialogFragment; -import org.holoeverywhere.widget.TextView; - import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.ActivityCompat; +import android.support.v4.app.DialogFragment; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.view.ActionMode; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListAdapter; +import android.widget.TextView; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; import com.dougkeen.bart.BartRunnerApplication; import com.dougkeen.bart.R; import com.dougkeen.bart.controls.Ticker; @@ -49,7 +48,7 @@ import com.googlecode.androidannotations.annotations.rest.RestService; import com.mobeta.android.dslv.DragSortListView; @EActivity(R.layout.main) -public class RoutesListActivity extends Activity implements TickSubscriber { +public class RoutesListActivity extends AppCompatActivity implements TickSubscriber { private static final String NO_DELAYS_REPORTED = "No delays reported"; private static final TimeZone PACIFIC_TIME = TimeZone @@ -88,7 +87,7 @@ public class RoutesListActivity extends Activity implements TickSubscriber { @Click(R.id.quickLookupButton) void quickLookupButtonClick() { DialogFragment dialog = new QuickRouteDialogFragment(); - dialog.show(getSupportFragmentManager().beginTransaction()); + dialog.show(getSupportFragmentManager(), QuickRouteDialogFragment.TAG); } @ItemClick(android.R.id.list) @@ -273,8 +272,9 @@ public class RoutesListActivity extends Activity implements TickSubscriber { } } + @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getSupportMenuInflater(); + MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.routes_list_menu, menu); return super.onCreateOptionsMenu(menu); } @@ -282,11 +282,12 @@ public class RoutesListActivity extends Activity implements TickSubscriber { private MenuItem elevatorMenuItem; private View origElevatorActionView; + @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.add_favorite_menu_button) { - new AddRouteDialogFragment().show(getSupportFragmentManager() - .beginTransaction()); + new AddRouteDialogFragment().show(getSupportFragmentManager(), + AddRouteDialogFragment.TAG); return true; } else if (itemId == R.id.view_system_map_button) { startActivity(new Intent(this, ViewMapActivity.class)); @@ -294,8 +295,8 @@ public class RoutesListActivity extends Activity implements TickSubscriber { } else if (itemId == R.id.elevator_button) { elevatorMenuItem = item; fetchElevatorInfo(); - origElevatorActionView = elevatorMenuItem.getActionView(); - elevatorMenuItem.setActionView(R.layout.progress_spinner); + origElevatorActionView = MenuItemCompat.getActionView(elevatorMenuItem); + MenuItemCompat.setActionView(elevatorMenuItem, R.layout.progress_spinner); return true; } else { return super.onOptionsItemSelected(item); @@ -336,7 +337,7 @@ public class RoutesListActivity extends Activity implements TickSubscriber { if (messageText == null) { hideAlertMessage(); return; - } else if (messageText == NO_DELAYS_REPORTED) { + } else if (messageText.equals(NO_DELAYS_REPORTED)) { alertMessages.setCompoundDrawablesWithIntrinsicBounds( R.drawable.ic_allgood, 0, 0, 0); } else { @@ -360,19 +361,19 @@ public class RoutesListActivity extends Activity implements TickSubscriber { @UiThread void resetElevatorMenuGraphic() { ActivityCompat.invalidateOptionsMenu(this); - elevatorMenuItem.setActionView(origElevatorActionView); + MenuItemCompat.setActionView(elevatorMenuItem, origElevatorActionView); } @UiThread void showElevatorMessage(String message) { - Builder builder = new AlertDialog.Builder(this); + AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(message); builder.setTitle("Elevator status"); builder.show(); } private void startContextualActionMode() { - mActionMode = startActionMode(new RouteActionMode()); + mActionMode = startSupportActionMode(new RouteActionMode()); mActionMode.setTitle(mCurrentlySelectedStationPair.getOrigin().name); mActionMode.setSubtitle("to " + mCurrentlySelectedStationPair.getDestination().name); @@ -446,4 +447,4 @@ public class RoutesListActivity extends Activity implements TickSubscriber { public void onTick(long mTickCount) { fetchAlerts(); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dougkeen/bart/activities/TrainAlarmDialogFragment.java b/app/src/main/java/com/dougkeen/bart/activities/TrainAlarmDialogFragment.java index 8fb2e3d..b7a5e41 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/TrainAlarmDialogFragment.java +++ b/app/src/main/java/com/dougkeen/bart/activities/TrainAlarmDialogFragment.java @@ -1,25 +1,27 @@ package com.dougkeen.bart.activities; -import org.holoeverywhere.LayoutInflater; -import org.holoeverywhere.app.AlertDialog; -import org.holoeverywhere.app.Dialog; -import org.holoeverywhere.app.DialogFragment; -import org.holoeverywhere.widget.NumberPicker; - +import android.annotation.SuppressLint; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; +import android.support.v7.app.AlertDialog; +import android.view.LayoutInflater; import android.view.View; +import com.codetroopers.betterpickers.numberpicker.NumberPicker; import com.dougkeen.bart.BartRunnerApplication; import com.dougkeen.bart.R; import com.dougkeen.bart.model.Departure; public class TrainAlarmDialogFragment extends DialogFragment { + public static final String TAG = "TRAIN_ALARM_DIALOG_FRAGMENT_TAG"; private static final String KEY_LAST_ALARM_LEAD_TIME = "lastAlarmLeadTime"; public TrainAlarmDialogFragment() { @@ -52,33 +54,35 @@ public class TrainAlarmDialogFragment extends DialogFragment { final Departure boardedDeparture = application.getBoardedDeparture(); final int maxValue = boardedDeparture.getMeanSecondsLeft() / 60; - String[] displayedValues = new String[maxValue]; - for (int i = 1; i <= maxValue; i++) { - displayedValues[i - 1] = String.valueOf(i); - } - numberPicker.setMinValue(1); - numberPicker.setMaxValue(maxValue); - numberPicker.setDisplayedValues(displayedValues); + numberPicker.setMin(1); + numberPicker.setMax(maxValue); if (boardedDeparture.isAlarmPending()) { - numberPicker.setValue(boardedDeparture.getAlarmLeadTimeMinutes()); + setNumber(numberPicker, boardedDeparture.getAlarmLeadTimeMinutes()); } else if (maxValue >= lastAlarmLeadTime) { - numberPicker.setValue(lastAlarmLeadTime); + setNumber(numberPicker, lastAlarmLeadTime); } else if (maxValue >= 5) { - numberPicker.setValue(5); + setNumber(numberPicker, 5); } else if (maxValue >= 3) { - numberPicker.setValue(3); + setNumber(numberPicker, 3); } else { - numberPicker.setValue(1); + setNumber(numberPicker, 1); } } + private void setNumber(NumberPicker numberPicker, int value) { + // Passing in null for the decimalPart and sign doesn't change them. + numberPicker.setNumber(value, null /* decimalPart */, null /* sign */); + } + + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final FragmentActivity activity = getActivity(); - final View dialogView = LayoutInflater.inflate(activity, - R.layout.train_alarm_dialog); + @SuppressLint("InflateParams") + final View dialogView = LayoutInflater.from(activity) + .inflate(R.layout.train_alarm_dialog, null /* root */); return new AlertDialog.Builder(activity) .setTitle(R.string.set_up_departure_alarm) @@ -88,11 +92,10 @@ public class TrainAlarmDialogFragment extends DialogFragment { new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, - int which) { + int which) { NumberPicker numberPicker = (NumberPicker) getDialog() .findViewById(R.id.numberPicker); - final int alarmLeadTime = numberPicker - .getValue(); + final int alarmLeadTime = numberPicker.getNumber(); // Save most recent selection Editor editor = getActivity().getPreferences( diff --git a/app/src/main/java/com/dougkeen/bart/activities/ViewDeparturesActivity.java b/app/src/main/java/com/dougkeen/bart/activities/ViewDeparturesActivity.java index b427961..a8bf3e2 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/ViewDeparturesActivity.java +++ b/app/src/main/java/com/dougkeen/bart/activities/ViewDeparturesActivity.java @@ -2,12 +2,6 @@ package com.dougkeen.bart.activities; import java.util.List; -import org.holoeverywhere.app.Activity; -import org.holoeverywhere.widget.ListView; -import org.holoeverywhere.widget.ProgressBar; -import org.holoeverywhere.widget.TextView; -import org.holoeverywhere.widget.Toast; - import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.ComponentName; @@ -23,18 +17,23 @@ import android.os.Handler; import android.os.IBinder; import android.os.Parcelable; import android.os.Vibrator; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.view.ActionMode; import android.text.format.DateFormat; import android.text.util.Linkify; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.Checkable; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; -import com.actionbarsherlock.view.ActionMode; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; import com.dougkeen.bart.BartRunnerApplication; import com.dougkeen.bart.R; import com.dougkeen.bart.controls.SwipeHelper; @@ -52,7 +51,7 @@ import com.dougkeen.bart.services.EtdService_; import com.dougkeen.util.Observer; import com.dougkeen.util.WakeLocker; -public class ViewDeparturesActivity extends Activity implements +public class ViewDeparturesActivity extends AppCompatActivity implements EtdServiceListener { private StationPair mStationPair; @@ -286,15 +285,15 @@ public class ViewDeparturesActivity extends Activity implements if (mActionMode != null) { /* - * If action mode is displayed, cancel out of that - */ + * If action mode is displayed, cancel out of that + */ mActionMode.finish(); getListView().clearChoices(); } else { - /* - * Otherwise select the clicked departure as the one the user - * wants to board - */ + /* + * Otherwise select the clicked departure as the one the user + * wants to board + */ setBoardedDeparture( getListAdapter().getItem(position), true); } @@ -350,10 +349,10 @@ public class ViewDeparturesActivity extends Activity implements protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mStationPair != null) { - /* - * If origin or destination are null, this thing was never - * initialized in the first place, so there's really nothing to save - */ + /* + * If origin or destination are null, this thing was never + * initialized in the first place, so there's really nothing to save + */ Departure[] departures = new Departure[mDeparturesAdapter .getCount()]; for (int i = mDeparturesAdapter.getCount() - 1; i >= 0; i--) { @@ -399,7 +398,7 @@ public class ViewDeparturesActivity extends Activity implements @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getSupportMenuInflater(); + MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.route_menu, menu); return true; } @@ -453,15 +452,10 @@ public class ViewDeparturesActivity extends Activity implements && departure.getStationPair().equals(getStationPair()); } - private void setBoardedDeparture(Departure selectedDeparture) { - setBoardedDeparture(selectedDeparture, false); - } - private void setBoardedDeparture(Departure selectedDeparture, boolean startActionMode) { final BartRunnerApplication application = (BartRunnerApplication) getApplication(); - selectedDeparture - .setPassengerDestination(mStationPair.getDestination()); + selectedDeparture.setPassengerDestination(mStationPair.getDestination()); application.setBoardedDeparture(selectedDeparture); refreshBoardedDeparture(true); @@ -479,7 +473,7 @@ public class ViewDeparturesActivity extends Activity implements private void startDepartureActionMode() { if (mActionMode == null) - mActionMode = startActionMode(new DepartureActionMode()); + mActionMode = startSupportActionMode(new DepartureActionMode()); mActionMode.setTitle(mSelectedDeparture.getTrainDestinationName()); mActionMode.setSubtitle(mSelectedDeparture.getTrainLengthAndPlatform()); } @@ -519,7 +513,7 @@ public class ViewDeparturesActivity extends Activity implements private void startYourTrainActionMode() { if (mActionMode == null) - mActionMode = startActionMode(new YourTrainActionMode()); + mActionMode = startSupportActionMode(new YourTrainActionMode()); mActionMode.setTitle(R.string.your_train); Departure boardedDeparture = getBoardedDeparture(); if (boardedDeparture != null && boardedDeparture.isAlarmPending()) { @@ -624,8 +618,7 @@ public class ViewDeparturesActivity extends Activity implements // Don't prompt for alarm if train is about to leave if (boardedDeparture.getMeanSecondsLeft() > 60) { new TrainAlarmDialogFragment() - .show(getSupportFragmentManager() - .beginTransaction()); + .show(getSupportFragmentManager(), TrainAlarmDialogFragment.TAG); } return true; @@ -733,7 +726,6 @@ public class ViewDeparturesActivity extends Activity implements existingDeparture.mergeEstimate(departure); } else { mDeparturesAdapter.add(departure); - existingDeparture = departure; } } } else { @@ -762,6 +754,7 @@ public class ViewDeparturesActivity extends Activity implements runOnUiThread(new Runnable() { @Override public void run() { + // TODO(fuegofro) - see if there's a way to not use toasts Toast.makeText(ViewDeparturesActivity.this, errorMessage, Toast.LENGTH_LONG).show(); } @@ -821,4 +814,4 @@ public class ViewDeparturesActivity extends Activity implements private Departure getBoardedDeparture() { return ((BartRunnerApplication) getApplication()).getBoardedDeparture(); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dougkeen/bart/activities/ViewMapActivity.java b/app/src/main/java/com/dougkeen/bart/activities/ViewMapActivity.java index 0c55e9f..531d36c 100644 --- a/app/src/main/java/com/dougkeen/bart/activities/ViewMapActivity.java +++ b/app/src/main/java/com/dougkeen/bart/activities/ViewMapActivity.java @@ -1,16 +1,15 @@ package com.dougkeen.bart.activities; -import org.holoeverywhere.app.Activity; - import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.webkit.WebView; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; import com.dougkeen.bart.R; -public class ViewMapActivity extends Activity { +public class ViewMapActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { @@ -30,7 +29,7 @@ public class ViewMapActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getSupportMenuInflater(); + MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.system_map_menu, menu); return true; } diff --git a/app/src/main/java/com/dougkeen/bart/controls/CountdownTextView.java b/app/src/main/java/com/dougkeen/bart/controls/CountdownTextView.java index 7c284e5..908fc74 100644 --- a/app/src/main/java/com/dougkeen/bart/controls/CountdownTextView.java +++ b/app/src/main/java/com/dougkeen/bart/controls/CountdownTextView.java @@ -1,9 +1,11 @@ package com.dougkeen.bart.controls; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; import android.widget.TextView; +import com.dougkeen.bart.R; import com.dougkeen.bart.model.TextProvider; public class CountdownTextView extends TextView implements @@ -27,9 +29,9 @@ public class CountdownTextView extends TextView implements } private void setInstanceVarsFromAttrs(AttributeSet attrs) { - int tickInterval = attrs.getAttributeIntValue( - "http://schemas.android.com/apk/res/com.dougkeen.bart", - "tickInterval", 0); + TypedArray typedArray = getContext().getTheme() + .obtainStyledAttributes(attrs, R.styleable.CountdownTextView, 0, 0); + int tickInterval = typedArray.getInteger(R.styleable.CountdownTextView_tickInterval, 0); if (tickInterval > 0) { setTickInterval(tickInterval); } diff --git a/app/src/main/java/com/dougkeen/bart/controls/SwipeHelper.java b/app/src/main/java/com/dougkeen/bart/controls/SwipeHelper.java index 9dee18f..2021bca 100644 --- a/app/src/main/java/com/dougkeen/bart/controls/SwipeHelper.java +++ b/app/src/main/java/com/dougkeen/bart/controls/SwipeHelper.java @@ -56,11 +56,11 @@ import com.nineoldandroids.animation.ValueAnimator; *

*

  * view.setOnTouchListener(new SwipeDismisser(view, null, // Optional
- * 														// token/cookie
- * 														// object
- * 		new SwipeDismisser.OnDismissCallback() {
- * 			public void onDismiss(View view, Object token) {
- * 				parent.removeView(view);
+ *                                                         // token/cookie
+ *                                                         // object
+ *         new SwipeDismisser.OnDismissCallback() {
+ *             public void onDismiss(View view, Object token) {
+ *                 parent.removeView(view);
  *            }
  *        }));
  * 
@@ -244,10 +244,10 @@ public class SwipeHelper implements View.OnTouchListener { mCallback.onDismiss(mView, mToken); // Reset view presentation - /* + /* * Alpha stays at 0, otherwise Android 2.x leaves weird - * artifacts - */ + * artifacts + */ // setAlpha(mView, 1f); setTranslationX(mView, 0); @@ -269,14 +269,14 @@ public class SwipeHelper implements View.OnTouchListener { public void showWithAnimation() { final int measureSpec = MeasureSpec.makeMeasureSpec( - ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY); + ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED); mView.measure(measureSpec, measureSpec); mViewWidth = mView.getMeasuredWidth(); final int viewHeight = mView.getMeasuredHeight(); setAlpha(mView, 0f); final ViewGroup.LayoutParams lp = mView.getLayoutParams(); - lp.width = mViewWidth; + final int originalHeight = lp.height; setTranslationX(mView, mViewWidth); @@ -288,11 +288,13 @@ public class SwipeHelper implements View.OnTouchListener { @Override public void onAnimationEnd(Animator animation) { // Reset view presentation - // mView.requestLayout(); + lp.height = originalHeight; + mView.setLayoutParams(lp); // Swipe view into space that opened up animate(mView).translationX(0).alpha(1) .setDuration(mAnimationTime) + // Dummy listener so the default doesn't run .setListener(new AnimatorListenerAdapter() { }); } @@ -308,4 +310,4 @@ public class SwipeHelper implements View.OnTouchListener { animator.start(); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dougkeen/bart/controls/TimedTextSwitcher.java b/app/src/main/java/com/dougkeen/bart/controls/TimedTextSwitcher.java index 73ef985..fc09f1e 100644 --- a/app/src/main/java/com/dougkeen/bart/controls/TimedTextSwitcher.java +++ b/app/src/main/java/com/dougkeen/bart/controls/TimedTextSwitcher.java @@ -3,9 +3,11 @@ package com.dougkeen.bart.controls; import org.apache.commons.lang3.StringUtils; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; import android.widget.TextSwitcher; +import com.dougkeen.bart.R; import com.dougkeen.bart.model.TextProvider; public class TimedTextSwitcher extends TextSwitcher implements @@ -21,9 +23,9 @@ public class TimedTextSwitcher extends TextSwitcher implements } private void setInstanceVarsFromAttrs(AttributeSet attrs) { - int tickInterval = attrs.getAttributeIntValue( - "http://schemas.android.com/apk/res/com.dougkeen.bart", - "tickInterval", 0); + TypedArray typedArray = getContext().getTheme() + .obtainStyledAttributes(attrs, R.styleable.TimedTextSwitcher, 0, 0); + int tickInterval = typedArray.getInteger(R.styleable.TimedTextSwitcher_tickInterval, 0); if (tickInterval > 0) { setTickInterval(tickInterval); } diff --git a/app/src/main/java/com/dougkeen/bart/model/Departure.java b/app/src/main/java/com/dougkeen/bart/model/Departure.java index d040269..1a4da62 100644 --- a/app/src/main/java/com/dougkeen/bart/model/Departure.java +++ b/app/src/main/java/com/dougkeen/bart/model/Departure.java @@ -363,9 +363,9 @@ public class Departure implements Parcelable, Comparable { if (departure.hasDeparted() && origin.longStationLinger && getMinEstimate() > 0 && !beganAsDeparted) { /* - * This is probably not a true departure, but an indication that the - * train is in the station. Don't update the estimates. - */ + * This is probably not a true departure, but an indication that the + * train is in the station. Don't update the estimates. + */ return; } @@ -380,19 +380,19 @@ public class Departure implements Parcelable, Comparable { if ((getMaxEstimate() - departure.getMinEstimate()) < MINIMUM_MERGE_OVERLAP_MILLIS || departure.getMaxEstimate() - getMinEstimate() < MINIMUM_MERGE_OVERLAP_MILLIS) { - /* - * The estimate must have changed... just use the latest incoming - * values - */ + /* + * The estimate must have changed... just use the latest incoming + * values + */ newMin = departure.getMinEstimate(); newMax = departure.getMaxEstimate(); } - /* - * If the new departure would mark this as departed, and we have < 60 - * seconds left on a fairly accurate local estimate, ignore the incoming - * departure - */ + /* + * If the new departure would mark this as departed, and we have < 60 + * seconds left on a fairly accurate local estimate, ignore the incoming + * departure + */ if (!wasDeparted && getMeanSecondsLeft(newMin, newMax) <= 0 && getMeanSecondsLeft() < 60 && getUncertaintySeconds() < 30) { Log.d(Constants.TAG, @@ -736,4 +736,4 @@ public class Departure implements Parcelable, Comparable { public void notifyAlarmHasBeenHandled() { this.alarmPending.setValue(false); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dougkeen/bart/services/BoardedDepartureService.java b/app/src/main/java/com/dougkeen/bart/services/BoardedDepartureService.java index e7f0307..38463ec 100644 --- a/app/src/main/java/com/dougkeen/bart/services/BoardedDepartureService.java +++ b/app/src/main/java/com/dougkeen/bart/services/BoardedDepartureService.java @@ -247,14 +247,14 @@ public class BoardedDepartureService extends Service implements if (mEtdService != null) { /* - * Make sure we're still listening for ETD changes (in case weak ref - * was garbage collected). Not a huge fan of this approach, but I - * think I'd rather keep the weak references to avoid memory leaks - * than move to soft references or some other form of stronger - * reference. Besides, registerListener() should only result in a - * few constant-time map operations, so there shouldn't be a big - * performance hit. - */ + * Make sure we're still listening for ETD changes (in case weak ref + * was garbage collected). Not a huge fan of this approach, but I + * think I'd rather keep the weak references to avoid memory leaks + * than move to soft references or some other form of stronger + * reference. Besides, registerListener() should only result in a + * few constant-time map operations, so there shouldn't be a big + * performance hit. + */ mEtdService.registerListener(this, false); } diff --git a/app/src/main/java/com/dougkeen/bart/services/EtdService.java b/app/src/main/java/com/dougkeen/bart/services/EtdService.java index c8a9baf..d0e0d06 100644 --- a/app/src/main/java/com/dougkeen/bart/services/EtdService.java +++ b/app/src/main/java/com/dougkeen/bart/services/EtdService.java @@ -367,10 +367,10 @@ public class EtdService extends Service { mStationPair.setAverageTripSampleCount(newAverageSampleCount); } - /* + /* * If we still have some departures without estimates, try again - * later - */ + * later + */ if (departuresWithoutEstimates > 0) { scheduleScheduleInfoFetch(20000); } @@ -386,12 +386,12 @@ public class EtdService extends Service { if (result.getDepartures().isEmpty() && mStationPair.isBetweenStations(Station.MLBR, Station.SFIA)) { - /* - * Let's try again, ignoring direction (this sometimes comes up - * when you travel between Millbrae and SFO... sometimes you - * need to travel north and transfer, sometimes you can travel - * south for a direct line) - */ + /* + * Let's try again, ignoring direction (this sometimes comes up + * when you travel between Millbrae and SFO... sometimes you + * need to travel north and transfer, sometimes you can travel + * south for a direct line) + */ mIgnoreDepartureDirection = true; scheduleDepartureFetch(50); return; @@ -402,10 +402,10 @@ public class EtdService extends Service { final Departure boardedDeparture = ((BartRunnerApplication) getApplication()) .getBoardedDeparture(); - /* - * Keep track of first departure, since we'll request another quick - * refresh if it has departed. - */ + /* + * Keep track of first departure, since we'll request another quick + * refresh if it has departed. + */ Departure firstDeparture = null; final List departures = result.getDepartures(); @@ -424,16 +424,16 @@ public class EtdService extends Service { } } - /* - * Since all the departures are new, we'll definitely need - * better accuracy - */ + /* + * Since all the departures are new, we'll definitely need + * better accuracy + */ needsBetterAccuracy = true; } else { - /* - * Let's merge the latest departure list with the instance - * departure list - */ + /* + * Let's merge the latest departure list with the instance + * departure list + */ int instanceListIndex = -1; for (Departure departure : departures) { instanceListIndex++; @@ -442,20 +442,20 @@ public class EtdService extends Service { existingDeparture = mLatestDepartures .get(instanceListIndex); } - /* - * Looks for departures at the beginning of the adapter that - * aren't in the latest list of departures - */ + /* + * Looks for departures at the beginning of the adapter that + * aren't in the latest list of departures + */ while (existingDeparture != null && !departure.equals(existingDeparture)) { // Remove old departure mLatestDepartures.remove(existingDeparture); if (instanceListIndex < mLatestDepartures.size()) { - /* - * Try again with next departure (keep in mind the - * next departure is now at the current index, since - * we removed a member) - */ + /* + * Try again with next departure (keep in mind the + * next departure is now at the current index, since + * we removed a member) + */ existingDeparture = mLatestDepartures .get(instanceListIndex); } else { @@ -463,10 +463,10 @@ public class EtdService extends Service { existingDeparture = null; } } - /* - * Merge the estimate if we found a matching departure, - * otherwise add a new one to the adapter - */ + /* + * Merge the estimate if we found a matching departure, + * otherwise add a new one to the adapter + */ if (existingDeparture != null) { existingDeparture.mergeEstimate(departure); } else { @@ -502,10 +502,10 @@ public class EtdService extends Service { // Get more data in 20s scheduleDepartureFetch(20000); } else { - /* - * Get more 90 seconds before next train arrives, right when - * next train arrives, or 3 minutes, whichever is sooner - */ + /* + * Get more 90 seconds before next train arrives, right when + * next train arrives, or 3 minutes, whichever is sooner + */ final int intervalUntilNextDeparture = firstDeparture .getMinSecondsLeft() * 1000; final int alternativeInterval = 3 * 60 * 1000; @@ -539,10 +539,10 @@ public class EtdService extends Service { return; } - /* - * Otherwise, check if the latest departure doesn't have schedule - * info... if not, fetch - */ + /* + * Otherwise, check if the latest departure doesn't have schedule + * info... if not, fetch + */ Departure lastDeparture = mLatestDepartures.get(mLatestDepartures .size() - 1); if (mLatestScheduleInfo.getLatestDepartureTime() < lastDeparture diff --git a/app/src/main/res/layout-h480dp/departure_listing.xml b/app/src/main/res/layout-h480dp/departure_listing.xml index 6a3b588..2e5070d 100644 --- a/app/src/main/res/layout-h480dp/departure_listing.xml +++ b/app/src/main/res/layout-h480dp/departure_listing.xml @@ -1,6 +1,7 @@ - @@ -73,4 +74,4 @@ android:layout_alignParentRight="true" android:layout_below="@id/uncertainty" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/departure_listing.xml b/app/src/main/res/layout/departure_listing.xml index 11085a1..722b0d3 100644 --- a/app/src/main/res/layout/departure_listing.xml +++ b/app/src/main/res/layout/departure_listing.xml @@ -1,6 +1,7 @@ - @@ -60,4 +61,4 @@ android:layout_below="@id/topRow" bart:tickInterval="1" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/departures.xml b/app/src/main/res/layout/departures.xml index aa43a41..e98902d 100644 --- a/app/src/main/res/layout/departures.xml +++ b/app/src/main/res/layout/departures.xml @@ -1,6 +1,6 @@ - @@ -20,7 +20,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:padding="10dp" - android:visibility="gone"> + android:visibility="gone" + /> - - \ No newline at end of file + diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index 12be8ea..397d489 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -1,6 +1,7 @@ - - @@ -22,7 +22,7 @@ android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingTop="15dip" - holo:spinnerMode="dialog" /> + /> + /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/train_alarm_dialog.xml b/app/src/main/res/layout/train_alarm_dialog.xml index af62a5b..a06870c 100644 --- a/app/src/main/res/layout/train_alarm_dialog.xml +++ b/app/src/main/res/layout/train_alarm_dialog.xml @@ -1,15 +1,10 @@ - - - + android:orientation="vertical" + > + android:text="minutes before departure" + /> - \ No newline at end of file + + + diff --git a/app/src/main/res/layout/your_train.xml b/app/src/main/res/layout/your_train.xml index 084247b..4814a8b 100644 --- a/app/src/main/res/layout/your_train.xml +++ b/app/src/main/res/layout/your_train.xml @@ -1,6 +1,7 @@ - + - \ No newline at end of file + diff --git a/app/src/main/res/menu/departure_context_menu.xml b/app/src/main/res/menu/departure_context_menu.xml index c72eb62..a6e2498 100644 --- a/app/src/main/res/menu/departure_context_menu.xml +++ b/app/src/main/res/menu/departure_context_menu.xml @@ -1,8 +1,12 @@ - + - \ No newline at end of file + android:title="@string/getting_on_this_train" + app:showAsAction="ifRoom|withText" + /> + diff --git a/app/src/main/res/menu/route_context_menu.xml b/app/src/main/res/menu/route_context_menu.xml index 7051c77..b5109b9 100644 --- a/app/src/main/res/menu/route_context_menu.xml +++ b/app/src/main/res/menu/route_context_menu.xml @@ -1,15 +1,20 @@ - + + android:title="@string/view_departures" + app:showAsAction="ifRoom|withText" + /> + android:title="@string/delete" + app:showAsAction="ifRoom|withText" + /> - \ No newline at end of file + diff --git a/app/src/main/res/menu/route_menu.xml b/app/src/main/res/menu/route_menu.xml index 3f4be30..888b3e3 100644 --- a/app/src/main/res/menu/route_menu.xml +++ b/app/src/main/res/menu/route_menu.xml @@ -1,15 +1,20 @@ - + + android:title="@string/view_on_bart_site" + app:showAsAction="never" + /> + android:title="@string/view_system_map" + app:showAsAction="ifRoom|withText" + /> - \ No newline at end of file + diff --git a/app/src/main/res/menu/routes_list_menu.xml b/app/src/main/res/menu/routes_list_menu.xml index 3d4e859..3ad027f 100644 --- a/app/src/main/res/menu/routes_list_menu.xml +++ b/app/src/main/res/menu/routes_list_menu.xml @@ -1,20 +1,26 @@ - + + android:title="@string/add_route" + app:showAsAction="ifRoom|withText" + /> + android:title="@string/view_system_map" + app:showAsAction="ifRoom|withText" + /> + android:title="Check elevator status" + app:showAsAction="ifRoom|withText" + /> - \ No newline at end of file + diff --git a/app/src/main/res/menu/your_train_context_menu.xml b/app/src/main/res/menu/your_train_context_menu.xml index 1b8cb1f..703ea43 100644 --- a/app/src/main/res/menu/your_train_context_menu.xml +++ b/app/src/main/res/menu/your_train_context_menu.xml @@ -1,26 +1,33 @@ - + + android:visible="false" + app:showAsAction="always|withText" + /> + android:title="@string/set_alarm" + app:showAsAction="always|withText" + /> + android:title="@string/share_arrival_time" + app:showAsAction="always|withText" + /> + android:title="@string/delete" + app:showAsAction="always|withText" + /> - \ No newline at end of file + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 187a49e..7f5e2e7 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 585b06c..7d6a0b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,15 +10,15 @@ Destination Save The origin and destination stations must be - different + different You must select a destination station You must select an origin station Please wait while real time departure data is - loaded + loaded No departure data is currently available for this - route. Note that this route may require a non-standard transfer due to - a temporary change in service. Check for service advisories posted at - http://m.bart.gov/schedules/advisories/ + route. Note that this route may require a non-standard transfer due to + a temporary change in service. Check for service advisories posted at + http://m.bart.gov/schedules/advisories/ View View departures Missing/inaccurate departure? Feature request? Please report to bartrunner@dougkeen.com @@ -27,7 +27,7 @@ Cancel View details on BART site Could not connect to BART services. Please try - again later. + again later. Also add return route View system map System map @@ -48,4 +48,4 @@ I\'ll be arriving at %1$s around %2$s Share arrival time - \ No newline at end of file + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 506598e..899317d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -3,7 +3,7 @@ - +