Skip to content

Commit

Permalink
Add Starred Routes list (#354)
Browse files Browse the repository at this point in the history
  • Loading branch information
millanp authored and aaronbrethorst committed Dec 17, 2023
1 parent b20e96f commit 177bde8
Show file tree
Hide file tree
Showing 11 changed files with 543 additions and 131 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@
*/
package org.onebusaway.android.provider;

import com.google.firebase.analytics.FirebaseAnalytics;

import org.onebusaway.android.BuildConfig;
import org.onebusaway.android.R;
import org.onebusaway.android.app.Application;
import org.onebusaway.android.io.ObaAnalytics;
import org.onebusaway.android.io.elements.ObaRegion;
import org.onebusaway.android.io.elements.ObaRegionElement;
import org.onebusaway.android.nav.model.PathLink;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
Expand All @@ -29,16 +39,6 @@
import android.provider.BaseColumns;
import android.text.format.Time;

import com.google.firebase.analytics.FirebaseAnalytics;

import org.onebusaway.android.BuildConfig;
import org.onebusaway.android.R;
import org.onebusaway.android.app.Application;
import org.onebusaway.android.io.ObaAnalytics;
import org.onebusaway.android.io.elements.ObaRegion;
import org.onebusaway.android.io.elements.ObaRegionElement;
import org.onebusaway.android.nav.model.PathLink;

import java.util.ArrayList;

/**
Expand Down Expand Up @@ -806,7 +806,7 @@ public static Uri insertOrUpdate(Context context,
return result;
}

protected static boolean markAsFavorite(Context context,
public static boolean markAsFavorite(Context context,
Uri uri,
boolean favorite) {
ContentResolver cr = context.getContentResolver();
Expand Down Expand Up @@ -1583,7 +1583,8 @@ private RouteHeadsignFavorites() {
* all stops, then stopId should be null.
*
* @param routeId routeId to be marked as favorite, in combination with headsign
* @param headsign headsign to be marked as favorite, in combination with routeId
* @param headsign headsign to be marked as favorite, in combination with routeId, or null
* if all headsigns should be marked for this routeId/stopId combo
* @param stopId stopId to be marked as a favorite, or null if all stopIds should be marked
* for this routeId/headsign combo.
* @param favorite true if this route and headsign combination should be marked as a
Expand All @@ -1594,8 +1595,11 @@ public static void markAsFavorite(Context context, String routeId, String headsi
if (context == null) {
return;
}
final String WHERE;
if (headsign == null) {
headsign = "";
WHERE = ROUTE_ID + "=? AND " + STOP_ID + "=?";
} else {
WHERE = ROUTE_ID + "=? AND " + HEADSIGN + "=? AND " + STOP_ID + "=?";
}

ContentResolver cr = context.getContentResolver();
Expand All @@ -1608,8 +1612,13 @@ public static void markAsFavorite(Context context, String routeId, String headsi
stopIdInternal = ALL_STOPS;
}

final String WHERE = ROUTE_ID + "=? AND " + HEADSIGN + "=? AND " + STOP_ID + "=?";
final String[] selectionArgs = {routeId, headsign, stopIdInternal};
final String[] selectionArgs;
if (headsign == null) {
selectionArgs = new String[] {routeId, stopIdInternal};
} else {
selectionArgs = new String[] {routeId, headsign, stopIdInternal};
}

if (favorite) {
if (stopIdInternal != ALL_STOPS) {
// First, delete any potential exclusion records for this stop by removing all records
Expand All @@ -1632,8 +1641,15 @@ public static void markAsFavorite(Context context, String routeId, String headsi
if (stopIdInternal == ALL_STOPS) {
// Also make sure we've deleted the single record for this specific stop, if it exists
// We don't have the stopId here, so we can just delete all records for this routeId/headsign
final String[] selectionArgs2 = {routeId, headsign};
final String WHERE2 = ROUTE_ID + "=? AND " + HEADSIGN + "=?";
final String[] selectionArgs2;
final String WHERE2;
if (headsign == null) {
selectionArgs2 = new String[] {routeId};
WHERE2 = ROUTE_ID + "=?";
} else {
selectionArgs2 = new String[] {routeId, headsign};
WHERE2 = ROUTE_ID + "=? AND " + HEADSIGN + "=?";
}
cr.delete(CONTENT_URI, WHERE2, selectionArgs2);
}

Expand Down Expand Up @@ -1675,6 +1691,14 @@ public static void markAsFavorite(Context context, String routeId, String headsi
analyticsParam.toString());
}

/**
* Delete all saved route/headsign favorites at once.
*/
public static void clearAllFavorites(Context context) {
ContentResolver cr = context.getContentResolver();
cr.delete(CONTENT_URI, null, null);
}

/**
* Returns true if this combination of routeId and headsign is a favorite for this stop
* or all stops (and that stop is not excluded as a favorite), false if it is not
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,40 @@
*/
package org.onebusaway.android.ui;

import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_ACTIVITY_FEED;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_HELP;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_MY_REMINDERS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_NEARBY;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_OPEN_SOURCE;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PAY_FARE;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PINS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PLAN_TRIP;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PROFILE;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_SEND_FEEDBACK;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_SETTINGS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_SIGN_IN;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_STARRED_STOPS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NavigationDrawerCallbacks;
import static org.onebusaway.android.util.PermissionUtils.BACKGROUND_LOCATION_PERMISSION_REQUEST;
import static org.onebusaway.android.util.PermissionUtils.LOCATION_PERMISSIONS;
import static uk.co.markormesher.android_fab.FloatingActionButton.POSITION_BOTTOM;
import static uk.co.markormesher.android_fab.FloatingActionButton.POSITION_END;
import static uk.co.markormesher.android_fab.FloatingActionButton.POSITION_START;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.analytics.FirebaseAnalytics;

import com.sothree.slidinguppanel.SlidingUpPanelLayout;

import org.onebusaway.android.BuildConfig;
import org.onebusaway.android.R;
import org.onebusaway.android.app.Application;
import org.onebusaway.android.io.ObaAnalytics;
import org.onebusaway.android.io.elements.ObaRegion;
import org.onebusaway.android.io.elements.ObaRoute;
import org.onebusaway.android.io.elements.ObaStop;
import org.onebusaway.android.io.request.ObaArrivalInfoResponse;
import org.onebusaway.android.map.MapModeController;
import org.onebusaway.android.map.MapParams;
import org.onebusaway.android.map.googlemapsv2.BaseMapFragment;
import org.onebusaway.android.map.googlemapsv2.LayerInfo;
import org.onebusaway.android.region.ObaRegionsTask;
import org.onebusaway.android.report.ui.ReportActivity;
import org.onebusaway.android.travelbehavior.TravelBehaviorManager;
import org.onebusaway.android.travelbehavior.constants.TravelBehaviorConstants;
import org.onebusaway.android.travelbehavior.utils.TravelBehaviorUtils;
import org.onebusaway.android.tripservice.TripService;
import org.onebusaway.android.util.FragmentUtils;
import org.onebusaway.android.util.LocationUtils;
import org.onebusaway.android.util.PermissionUtils;
import org.onebusaway.android.util.PreferenceUtils;
import org.onebusaway.android.util.RegionUtils;
import org.onebusaway.android.util.ShowcaseViewUtils;
import org.onebusaway.android.util.UIUtils;
import org.opentripplanner.routing.bike_rental.BikeRentalStation;

import android.Manifest;
import android.app.Dialog;
Expand Down Expand Up @@ -74,6 +89,13 @@
import android.widget.TextView;
import android.widget.Toast;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
Expand All @@ -82,46 +104,26 @@
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;

import org.onebusaway.android.BuildConfig;
import org.onebusaway.android.R;
import org.onebusaway.android.app.Application;
import org.onebusaway.android.io.ObaAnalytics;
import org.onebusaway.android.io.elements.ObaRegion;
import org.onebusaway.android.io.elements.ObaRoute;
import org.onebusaway.android.io.elements.ObaStop;
import org.onebusaway.android.io.request.ObaArrivalInfoResponse;
import org.onebusaway.android.map.MapModeController;
import org.onebusaway.android.map.MapParams;
import org.onebusaway.android.map.googlemapsv2.BaseMapFragment;
import org.onebusaway.android.map.googlemapsv2.LayerInfo;
import org.onebusaway.android.region.ObaRegionsTask;
import org.onebusaway.android.report.ui.ReportActivity;
import org.onebusaway.android.travelbehavior.TravelBehaviorManager;
import org.onebusaway.android.travelbehavior.constants.TravelBehaviorConstants;
import org.onebusaway.android.travelbehavior.utils.TravelBehaviorUtils;
import org.onebusaway.android.tripservice.TripService;
import org.onebusaway.android.util.FragmentUtils;
import org.onebusaway.android.util.LocationUtils;
import org.onebusaway.android.util.PermissionUtils;
import org.onebusaway.android.util.PreferenceUtils;
import org.onebusaway.android.util.RegionUtils;
import org.onebusaway.android.util.ShowcaseViewUtils;
import org.onebusaway.android.util.UIUtils;
import org.opentripplanner.routing.bike_rental.BikeRentalStation;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_ACTIVITY_FEED;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_HELP;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_MY_REMINDERS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_NEARBY;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_OPEN_SOURCE;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PAY_FARE;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PINS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PLAN_TRIP;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_PROFILE;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_SEND_FEEDBACK;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_SETTINGS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_SIGN_IN;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_STARRED_ROUTES;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NAVDRAWER_ITEM_STARRED_STOPS;
import static org.onebusaway.android.ui.NavigationDrawerFragment.NavigationDrawerCallbacks;
import static org.onebusaway.android.util.PermissionUtils.BACKGROUND_LOCATION_PERMISSION_REQUEST;
import static org.onebusaway.android.util.PermissionUtils.LOCATION_PERMISSIONS;
import static uk.co.markormesher.android_fab.FloatingActionButton.POSITION_BOTTOM;
import static uk.co.markormesher.android_fab.FloatingActionButton.POSITION_END;
import static uk.co.markormesher.android_fab.FloatingActionButton.POSITION_START;

public class HomeActivity extends AppCompatActivity
implements BaseMapFragment.OnFocusChangedListener,
Expand Down Expand Up @@ -213,6 +215,7 @@ interface SlidingPanelController {
* Fragments that can be selected as main content via the NavigationDrawer
*/
MyStarredStopsFragment mMyStarredStopsFragment;
MyStarredRoutesFragment mMyStarredRoutesFragment;

BaseMapFragment mMapFragment;

Expand All @@ -223,6 +226,8 @@ interface SlidingPanelController {
*/
private boolean mShowStarredStopsMenu = false;

private boolean mShowStarredRoutesMenu = false;

private boolean mShowArrivalsMenu = false;

/**
Expand Down Expand Up @@ -485,6 +490,15 @@ private void goToNavDrawerItem(int item) {
null);
}
break;
case NAVDRAWER_ITEM_STARRED_ROUTES:
if (mCurrentNavDrawerPosition != NAVDRAWER_ITEM_STARRED_ROUTES) {
showStarredRoutesFragment();
mCurrentNavDrawerPosition = item;
ObaAnalytics.reportUiEvent(mFirebaseAnalytics,
getString(R.string.analytics_label_button_press_star),
null);
}
break;
// below values are deprecated; fall through to NAVDRAWER_ITEM_NEARBY
case NAVDRAWER_ITEM_SIGN_IN:
case NAVDRAWER_ITEM_PROFILE:
Expand Down Expand Up @@ -557,6 +571,7 @@ private void showMapFragment() {
/**
* Hide everything that shouldn't be shown
*/
hideStarredRoutesFragment();
hideStarredStopsFragment();
hideReminderFragment();
mShowStarredStopsMenu = false;
Expand Down Expand Up @@ -615,6 +630,7 @@ private void showStarredStopsFragment() {
hideMapProgressBar();
hideMapFragment();
hideReminderFragment();
hideStarredRoutesFragment();
hideSlidingPanel();
mShowArrivalsMenu = false;
showZoomControls(false);
Expand All @@ -640,13 +656,49 @@ private void showStarredStopsFragment() {
setTitle(getResources().getString(R.string.navdrawer_item_starred_stops));
}

private void showStarredRoutesFragment() {
FragmentManager fm = getSupportFragmentManager();
/**
* Hide everything that shouldn't be shown
*/
hideFloatingActionButtons();
hideMapProgressBar();
hideMapFragment();
hideReminderFragment();
hideSlidingPanel();
hideStarredStopsFragment();
mShowArrivalsMenu = false;
showZoomControls(false);

/**
* Show fragment (we use show instead of replace to keep the map state)
*/
mShowStarredRoutesMenu = true;
if (mMyStarredRoutesFragment == null) {
// First check to see if an instance of MyStarredRoutesFragment already exists
mMyStarredRoutesFragment = (MyStarredRoutesFragment) fm
.findFragmentByTag(MyStarredRoutesFragment.TAG);

if (mMyStarredRoutesFragment == null) {
// No existing fragment was found, so create a new one
Log.d(TAG, "Creating new MyStarredRoutesFragment");
mMyStarredRoutesFragment = new MyStarredRoutesFragment();
fm.beginTransaction().add(R.id.main_fragment_container, mMyStarredRoutesFragment,
MyStarredRoutesFragment.TAG).commit();
}
}
fm.beginTransaction().show(mMyStarredRoutesFragment).commit();
setTitle(getResources().getString(R.string.navdrawer_item_starred_routes));
}

private void showMyRemindersFragment() {
FragmentManager fm = getSupportFragmentManager();
/**
* Hide everything that shouldn't be shown
*/
hideFloatingActionButtons();
hideMapProgressBar();
hideStarredRoutesFragment();
hideStarredStopsFragment();
hideMapFragment();
hideSlidingPanel();
Expand Down Expand Up @@ -690,6 +742,15 @@ private void hideStarredStopsFragment() {
}
}

private void hideStarredRoutesFragment() {
FragmentManager fm = getSupportFragmentManager();
mMyStarredRoutesFragment = (MyStarredRoutesFragment) fm.findFragmentByTag(
MyStarredRoutesFragment.TAG);
if (mMyStarredRoutesFragment != null && !mMyStarredRoutesFragment.isHidden()) {
fm.beginTransaction().hide(mMyStarredRoutesFragment).commit();
}
}

private void hideReminderFragment() {
FragmentManager fm = getSupportFragmentManager();
mMyRemindersFragment = (MyRemindersFragment) fm
Expand Down Expand Up @@ -731,6 +792,7 @@ private void setupOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.main_options_menu_group, true);
menu.setGroupVisible(R.id.arrival_list_menu_group, mShowArrivalsMenu);
menu.setGroupVisible(R.id.starred_stop_menu_group, mShowStarredStopsMenu);
menu.setGroupVisible(R.id.starred_route_menu_group, mShowStarredRoutesMenu);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public void onListItemClick(ListView l, View v, int position, long id) {
activity.setResult(Activity.RESULT_OK, shortcut.getIntent());
activity.finish();
} else {
RouteInfoActivity.start(getActivity(), routeId);
HomeActivity.start(getActivity(), routeId);
}
}

Expand Down
Loading

0 comments on commit 177bde8

Please sign in to comment.