Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Starred Routes list (#354) #1097

Merged
merged 1 commit into from
Dec 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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