diff --git a/api/src/main/java/ch/liip/timeforcoffee/api/DepartureService.java b/api/src/main/java/ch/liip/timeforcoffee/api/DepartureService.java index 36f31b9..2a8245f 100644 --- a/api/src/main/java/ch/liip/timeforcoffee/api/DepartureService.java +++ b/api/src/main/java/ch/liip/timeforcoffee/api/DepartureService.java @@ -17,6 +17,7 @@ public class DepartureService { private final EventBus eventBus; + private String stationId; @Inject public DepartureService(EventBus eventBus) { @@ -26,14 +27,20 @@ public DepartureService(EventBus eventBus) { @Subscribe public void onEvent(FetchDeparturesEvent event) { - eventBus.post(new FetchZvvDeparturesEvent(event.getStationId())); + stationId = event.getStationId(); + eventBus.post(new FetchZvvDeparturesEvent(stationId)); } @Subscribe public void onEvent(ZvvDeparturesFetchedEvent event) { ArrayList departures = new ArrayList<>(); + int stationId = Integer.parseInt(this.stationId); + for (ch.liip.timeforcoffee.zvv.Departure zvvDeparture : event.getDepartures()) { - departures.add(DepartureMapper.fromZvv(zvvDeparture)); + Departure departure = DepartureMapper.fromZvv(zvvDeparture, stationId); + if(departure != null) { + departures.add(departure); + } } eventBus.post(new DeparturesFetchedEvent(departures)); diff --git a/api/src/main/java/ch/liip/timeforcoffee/api/mappers/DepartureMapper.java b/api/src/main/java/ch/liip/timeforcoffee/api/mappers/DepartureMapper.java index ff83cc3..1fd621e 100644 --- a/api/src/main/java/ch/liip/timeforcoffee/api/mappers/DepartureMapper.java +++ b/api/src/main/java/ch/liip/timeforcoffee/api/mappers/DepartureMapper.java @@ -2,19 +2,30 @@ import android.graphics.Color; +import java.util.Date; + import ch.liip.timeforcoffee.api.models.Departure; public class DepartureMapper { - public static Departure fromZvv(ch.liip.timeforcoffee.zvv.Departure zvvDeparture) { + public static Departure fromZvv(ch.liip.timeforcoffee.zvv.Departure zvvDeparture, int stationId) { int id = zvvDeparture.getId() != null ? Integer.parseInt(zvvDeparture.getId()) : 0; int colorBg = Color.WHITE; int colorFg = Color.BLACK; + try { colorBg = Color.parseColor(zvvDeparture.getColors().getBg()); colorFg = Color.parseColor(zvvDeparture.getColors().getFg()); - } catch (Throwable e) { - // + } + catch (Throwable ignored) { } + + Date departureScheduled = zvvDeparture.getDeparture() == null ? null : zvvDeparture.getDeparture().getScheduled(); + Date departureRealtime = zvvDeparture.getDeparture() == null ? null : zvvDeparture.getDeparture().getRealtime(); + Date arrivalScheduled = zvvDeparture.getArrival() == null ? null : zvvDeparture.getArrival().getScheduled(); + + // If destination id and station id are equal, it is not a valid departure + if(id == stationId) { + return null; } return new Departure(zvvDeparture.getName(), @@ -23,9 +34,9 @@ public static Departure fromZvv(ch.liip.timeforcoffee.zvv.Departure zvvDeparture zvvDeparture.getPlatform(), colorFg, colorBg, - zvvDeparture.getDeparture().getScheduled(), - zvvDeparture.getDeparture().getRealtime(), - zvvDeparture.getArrival().getScheduled(), + departureScheduled, + departureRealtime, + arrivalScheduled, zvvDeparture.getAccessible(), false ); diff --git a/api/src/main/java/ch/liip/timeforcoffee/api/models/Departure.java b/api/src/main/java/ch/liip/timeforcoffee/api/models/Departure.java index af49f76..214e855 100644 --- a/api/src/main/java/ch/liip/timeforcoffee/api/models/Departure.java +++ b/api/src/main/java/ch/liip/timeforcoffee/api/models/Departure.java @@ -104,21 +104,25 @@ public String getDepartureRealtimeStr() { } public String getDepartureStrForZvv() { - DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); - return dateFormatter.format(departureScheduled); + DateFormat dt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); + if (departureScheduled != null) { + return dt.format(departureScheduled); + } + + return null; } public String getArrivalStrForZvv() { - DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); - return dateFormatter.format(arrivalScheduled); + DateFormat dt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); + if (arrivalScheduled != null) { + return dt.format(arrivalScheduled); + } + + return null; } - //realtime != schedule time public Boolean isLate() { - if (departureRealtime != null && departureScheduled != null && departureRealtime.compareTo(departureScheduled) != 0) { - return true; - } - return false; + return departureRealtime != null && departureScheduled != null && departureRealtime.compareTo(departureScheduled) != 0; } public String departureInMinutes() { @@ -133,7 +137,7 @@ public String departureInMinutes() { return timeInterval +"'"; } - long getDepartureTimeDiffInMinutes() { + private long getDepartureTimeDiffInMinutes() { long diff = -1; Date now = new Date(); if (departureRealtime != null){ diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/activity/ConnectionsActivity.java b/mobile/src/main/java/ch/liip/timeforcoffee/activity/ConnectionsActivity.java index 67fc264..e564fd1 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/activity/ConnectionsActivity.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/activity/ConnectionsActivity.java @@ -24,7 +24,7 @@ import ch.liip.timeforcoffee.fragment.StationMapFragment; import ch.liip.timeforcoffee.presenter.ConnectionsPresenter; -public class ConnectionsActivity extends AppCompatActivity implements SlidingUpPanelLayout.PanelSlideListener, ConnectionListFragment.Callbacks { +public class ConnectionsActivity extends AppCompatActivity implements SlidingUpPanelLayout.PanelSlideListener, StationMapFragment.Callbacks, ConnectionListFragment.Callbacks { private SlidingUpPanelLayout mSlidingLayout; private StationMapFragment mStationMapFragment; @@ -105,10 +105,11 @@ protected void onCreate(Bundle savedInstanceState) { // View mStationMapFragment = (StationMapFragment) getFragmentManager().findFragmentById(R.id.station_map); - mProgressLayout = findViewById(R.id.progressLayout); + mProgressLayout = findViewById(R.id.progressLayout); mSlidingLayout = findViewById(R.id.sliding_layout); mSlidingLayout.setPanelSlideListener(this); + mSlidingLayout.setTouchEnabled(false); } @Override @@ -193,7 +194,9 @@ public void onPanelAnchored(View panel) { } public void onPanelHidden(View panel) { } @Override - public void onConnectionSelected(Connection connection) { } + public void onMapLoaded() { + mSlidingLayout.setTouchEnabled(true); + } public void performConnectionsUpdate() { mPresenter.updateConnections(); diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/activity/DeparturesActivity.java b/mobile/src/main/java/ch/liip/timeforcoffee/activity/DeparturesActivity.java index 6241777..c0b9635 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/activity/DeparturesActivity.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/activity/DeparturesActivity.java @@ -11,7 +11,6 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.widget.RelativeLayout; import android.widget.Toast; import com.astuetz.PagerSlidingTabStrip; @@ -29,13 +28,11 @@ import ch.liip.timeforcoffee.fragment.StationMapFragment; import ch.liip.timeforcoffee.presenter.DeparturesPresenter; -public class DeparturesActivity extends AppCompatActivity implements SlidingUpPanelLayout.PanelSlideListener, FavoritesListFragment.Callbacks, DepartureListFragment.Callbacks { +public class DeparturesActivity extends AppCompatActivity implements SlidingUpPanelLayout.PanelSlideListener, StationMapFragment.Callbacks, FavoritesListFragment.Callbacks, DepartureListFragment.Callbacks { private SlidingUpPanelLayout mSlidingLayout; private StationMapFragment mStationMapFragment; private ViewPager mTabsViewPager; - private RelativeLayout mProgressLayout; - private DeparturesPresenter mPresenter; private DepartureListFragment mDepartureListFragment; @@ -77,13 +74,6 @@ protected void onCreate(Bundle savedInstanceState) { ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); - mStationMapFragment = (StationMapFragment) getFragmentManager().findFragmentById(R.id.station_map); - mStationMapFragment.setup(station); - - mProgressLayout = findViewById(R.id.progressLayout); - mSlidingLayout = findViewById(R.id.sliding_layout); - mSlidingLayout.setPanelSlideListener(this); - // Fragments Bundle favoritesFragmentArgs = new Bundle(); favoritesFragmentArgs.putInt(FavoritesListFragment.ARG_MODE, FavoritesListFragment.ARG_MODE_DEPARTURES); @@ -91,7 +81,8 @@ protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState == null) { mDepartureListFragment = (DepartureListFragment) Fragment.instantiate(this, DepartureListFragment.class.getName()); mFavoriteListFragment = (FavoritesListFragment) Fragment.instantiate(this, FavoritesListFragment.class.getName(), favoritesFragmentArgs); - } else{ + } + else{ mDepartureListFragment = (DepartureListFragment) getSupportFragmentManager().getFragment(savedInstanceState, DEPARTURE_LIST_FRAGMENT_KEY); mFavoriteListFragment = (FavoritesListFragment) getSupportFragmentManager().getFragment(savedInstanceState, FAVORITE_LIST_FRAGMENT_KEY); } @@ -100,7 +91,7 @@ protected void onCreate(Bundle savedInstanceState) { fragments.add(mDepartureListFragment); fragments.add(mFavoriteListFragment); - // Initialize the ViewPager and bind to tabs + // View mTabsViewPager = super.findViewById(R.id.viewpager); mTabsViewPager.setAdapter(new TabsAdapter( this, @@ -117,6 +108,13 @@ public void onPageSelected(int position) { mPresenter.updateFavorites(); } }); + + mStationMapFragment = (StationMapFragment) getFragmentManager().findFragmentById(R.id.station_map); + mStationMapFragment.setup(station); + + mSlidingLayout = findViewById(R.id.sliding_layout); + mSlidingLayout.setPanelSlideListener(this); + mSlidingLayout.setTouchEnabled(false); } @Override @@ -202,6 +200,11 @@ public void onPanelAnchored(View panel) { } @Override public void onPanelHidden(View panel) { } + @Override + public void onMapLoaded() { + mSlidingLayout.setTouchEnabled(true); + } + @Override public void onDepartureSelected(Departure departure) { selectDeparture(departure); @@ -264,13 +267,8 @@ public void displayToastMessage(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } - public void showProgressLayout(boolean show) { - if (show) { - mProgressLayout.setVisibility(View.VISIBLE); - } - else { - mProgressLayout.setVisibility(View.GONE); - } + public void setAreDeparturesLoading(boolean loading) { + mDepartureListFragment.showLoadingDeparturesProgressBar(loading); } public void displayDepartureList() { diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/adapter/ConnectionListAdapter.java b/mobile/src/main/java/ch/liip/timeforcoffee/adapter/ConnectionListAdapter.java index 022ca4b..749013d 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/adapter/ConnectionListAdapter.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/adapter/ConnectionListAdapter.java @@ -33,30 +33,29 @@ public ConnectionListAdapter(Context context, List connexions) { } public View getView(int position, View convertView, ViewGroup parent) { - ConnectionListAdapter.ConnexionViewHolder viewHolder; + String departureLabel = mContext.getResources().getString(R.string.connection_departure); + String arrivalLabel = mContext.getResources().getString(R.string.connection_arrival); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.fragment_connection_list_row, parent, false); viewHolder = new ConnectionListAdapter.ConnexionViewHolder(); - viewHolder.stationTextView = (TextView) convertView.findViewById(R.id.station); - viewHolder.timeLabelTextView = (TextView) convertView.findViewById(R.id.time_label); - viewHolder.timeTextView = (TextView) convertView.findViewById(R.id.time); - viewHolder.realtimeDepartureTextView = (TextView) convertView.findViewById(R.id.realtime); - viewHolder.departureTextView = (TextView) convertView.findViewById(R.id.departure); + viewHolder.stationTextView = convertView.findViewById(R.id.station); + viewHolder.timeLabelTextView = convertView.findViewById(R.id.time_label); + viewHolder.timeTextView = convertView.findViewById(R.id.time); + viewHolder.realtimeDepartureTextView = convertView.findViewById(R.id.realtime); + viewHolder.departureTextView = convertView.findViewById(R.id.departure); convertView.setTag(viewHolder); - } else { + } + else { viewHolder = (ConnectionListAdapter.ConnexionViewHolder) convertView.getTag(); } - String departureLabel = mContext.getResources().getString(R.string.connection_departure); - String arrivalLabel = mContext.getResources().getString(R.string.connection_arrival); - Connection connection = this.mConnexions.get(position); viewHolder.stationTextView.setText(connection.getName()); viewHolder.timeLabelTextView.setText(connection.getTimeLabel(departureLabel, arrivalLabel)); @@ -67,7 +66,8 @@ public View getView(int position, View convertView, ViewGroup parent) { viewHolder.realtimeDepartureTextView.setVisibility(View.VISIBLE); viewHolder.realtimeDepartureTextView.setText(connection.getRealtimeDepartureStr()); viewHolder.timeTextView.setPaintFlags(viewHolder.timeTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - } else { + } + else { viewHolder.realtimeDepartureTextView.setVisibility(View.GONE); viewHolder.timeTextView.setPaintFlags(viewHolder.timeTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); } @@ -75,10 +75,6 @@ public View getView(int position, View convertView, ViewGroup parent) { return convertView; } - public Connection getConnexion(int position) { - return this.mConnexions.get(position); - } - public void setConnexions(List connexions) { this.mConnexions.clear(); this.mConnexions.addAll(connexions); diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/ConnectionListFragment.java b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/ConnectionListFragment.java index 709f25b..14de18b 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/ConnectionListFragment.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/ConnectionListFragment.java @@ -1,5 +1,6 @@ package ch.liip.timeforcoffee.fragment; +import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; @@ -9,7 +10,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ListView; import java.util.ArrayList; import java.util.List; @@ -25,23 +25,12 @@ public class ConnectionListFragment extends ListFragment implements SwipeRefresh private ConnectionListAdapter mConnectionListAdapter; private SwipeRefreshLayout mSwipeRefreshLayout; - private ConnectionListFragment.Callbacks mCallbacks = sDummyCallbacks; + private Callbacks mCallbacks; public interface Callbacks { - void onConnectionSelected(Connection connection); void onRefresh(); } - private static ConnectionListFragment.Callbacks sDummyCallbacks = new ConnectionListFragment.Callbacks() { - @Override - public void onConnectionSelected(Connection connection) { - } - - @Override - public void onRefresh() { - } - }; - /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). @@ -81,24 +70,28 @@ public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { - mCallbacks.onRefresh(); mSwipeRefreshLayout.setRefreshing(false); + if(mCallbacks != null) { + mCallbacks.onRefresh(); + } } }, 100); } @Override - public void onAttach(Context context) { - super.onAttach(context); - if (!(context instanceof ConnectionListFragment.Callbacks)) { + public void onAttach(Activity activity) { + super.onAttach(activity); + if (!(activity instanceof ConnectionListFragment.Callbacks)) { throw new IllegalStateException("Activity must implement fragment's callbacks."); } - mCallbacks = (ConnectionListFragment.Callbacks) context; + + mCallbacks = (ConnectionListFragment.Callbacks) activity; } - public void onListItemClick(ListView listView, View view, int position, long id) { - super.onListItemClick(listView, view, position, id); - mCallbacks.onConnectionSelected(mConnectionListAdapter.getConnexion(position)); + @Override + public void onDetach() { + super.onDetach(); + mCallbacks = null; } public void setConnections(List connections) { diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/DepartureListFragment.java b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/DepartureListFragment.java index 8e865f6..f6f50bf 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/DepartureListFragment.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/DepartureListFragment.java @@ -1,5 +1,6 @@ package ch.liip.timeforcoffee.fragment; +import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; @@ -10,6 +11,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; import java.util.ArrayList; import java.util.List; @@ -29,9 +32,11 @@ public class DepartureListFragment extends ListFragment implements SwipeRefreshL private FragmentActivity mActivity; private DepartureListAdapter mDepartureListAdapter; + private RelativeLayout mNoDeparturesLayout; + private ProgressBar mLoadingDeparturesProgressBar; private SwipeRefreshLayout mSwipeRefreshLayout; - private Callbacks mCallbacks = sDummyCallbacks; + private Callbacks mCallbacks; public interface Callbacks { void onRefresh(); @@ -39,17 +44,6 @@ public interface Callbacks { void onDepartureFavoriteToggled(Departure departure, boolean isFavorite); } - private static Callbacks sDummyCallbacks = new Callbacks() { - @Override - public void onDepartureSelected(Departure departure) { } - - @Override - public void onRefresh() { } - - @Override - public void onDepartureFavoriteToggled(Departure departure, boolean isFavorite) { } - }; - /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). @@ -71,9 +65,15 @@ public void onCreate(Bundle savedInstanceState) { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_departure_list, container, false); + + mLoadingDeparturesProgressBar = rootView.findViewById(R.id.loadingDeparturesSpinner); + mNoDeparturesLayout = rootView.findViewById(R.id.noDeparturesLayout); mSwipeRefreshLayout = rootView.findViewById(R.id.swipe_container); mSwipeRefreshLayout.setOnRefreshListener(this); + mLoadingDeparturesProgressBar.setVisibility(View.GONE); + mNoDeparturesLayout.setVisibility(View.GONE); + return rootView; } @@ -90,40 +90,69 @@ public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { - mCallbacks.onRefresh(); mSwipeRefreshLayout.setRefreshing(false); + if(mCallbacks != null) { + mCallbacks.onRefresh(); + } } }, 100); } @Override - public void onAttach(Context context) { - super.onAttach(context); - if (!(context instanceof Callbacks)) { + public void onAttach(Activity activity) { + super.onAttach(activity); + if (!(activity instanceof Callbacks)) { throw new IllegalStateException("Activity must implement fragment's callbacks."); } - mCallbacks = (Callbacks) context; + + mCallbacks = (Callbacks) activity; } @Override public void onDetach() { super.onDetach(); - // Reset the active callbacks interface to the dummy implementation. - mCallbacks = sDummyCallbacks; + mCallbacks = null; } @Override public void onListItemClick(ListView listView, View view, int position, long id) { super.onListItemClick(listView, view, position, id); - mCallbacks.onDepartureSelected(mDepartureListAdapter.getDeparture(position)); + if(mCallbacks != null) { + mCallbacks.onDepartureSelected(mDepartureListAdapter.getDeparture(position)); + } } @Override public void onDepartureFavoriteToggled(Departure departure, boolean isFavorite) { - mCallbacks.onDepartureFavoriteToggled(departure, isFavorite); + if(mCallbacks != null) { + mCallbacks.onDepartureFavoriteToggled(departure, isFavorite); + } } public void setDepartures(List departures) { + showNoDeparturesLayout(departures.size() == 0); mDepartureListAdapter.setDepartures(departures); } + + public void showLoadingDeparturesProgressBar(boolean show) { + if(mLoadingDeparturesProgressBar != null) { + if (show) { + mLoadingDeparturesProgressBar.setVisibility(View.VISIBLE); + } else { + mLoadingDeparturesProgressBar.setVisibility(View.GONE); + } + } + + } + + public void showNoDeparturesLayout(boolean show) { + if(mNoDeparturesLayout != null) { + mNoDeparturesLayout.setVisibility(View.GONE); + if (show) { + mNoDeparturesLayout.setVisibility(View.VISIBLE); + } else { + mNoDeparturesLayout.setVisibility(View.GONE); + } + } + } } \ No newline at end of file diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/FavoritesListFragment.java b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/FavoritesListFragment.java index bda1660..38c37c2 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/FavoritesListFragment.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/FavoritesListFragment.java @@ -1,6 +1,7 @@ package ch.liip.timeforcoffee.fragment; import android.app.Activity; +import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentActivity; @@ -38,7 +39,7 @@ public class FavoritesListFragment extends ListFragment implements SwipeRefreshL private LinearLayout mNoFavoritesLayout; private SwipeRefreshLayout mSwipeRefreshLayout; - private Callbacks mCallbacks = sDummyCallbacks; + private Callbacks mCallbacks; public interface Callbacks { void onFavoriteStationSelected(Station station); @@ -47,20 +48,6 @@ public interface Callbacks { void onDepartureFavoriteToggled(Departure station, boolean isFavorite); } - private static Callbacks sDummyCallbacks = new Callbacks() { - @Override - public void onFavoriteStationSelected(Station station) { } - - @Override - public void onFavoriteDepartureSelected(Departure departure) { } - - @Override - public void onStationFavoriteToggled(Station station, boolean isFavorite) { } - - @Override - public void onDepartureFavoriteToggled(Departure departure, boolean isFavorite) { } - }; - /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). @@ -104,8 +91,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa @Override public void onAttach(Activity activity) { super.onAttach(activity); - - // Activities containing this fragment must implement its callbacks. if (!(activity instanceof Callbacks)) { throw new IllegalStateException("Activity must implement fragment's callbacks."); } @@ -116,8 +101,7 @@ public void onAttach(Activity activity) { @Override public void onDetach() { super.onDetach(); - // Reset the active callbacks interface to the dummy implementation. - mCallbacks = sDummyCallbacks; + mCallbacks = null; } @Override @@ -133,21 +117,28 @@ public void run() { @Override public void onListItemClick(ListView listView, View view, int position, long id) { super.onListItemClick(listView, view, position, id); - if(mFavoriteMode == FavoritesListFragment.ARG_MODE_STATIONS) { - mCallbacks.onFavoriteStationSelected(mStationListAdapter.getStation(position)); - } else { - mCallbacks.onFavoriteDepartureSelected(mDepartureListAdapter.getDeparture(position)); + if(mCallbacks != null) { + if(mFavoriteMode == FavoritesListFragment.ARG_MODE_STATIONS) { + mCallbacks.onFavoriteStationSelected(mStationListAdapter.getStation(position)); + } + else { + mCallbacks.onFavoriteDepartureSelected(mDepartureListAdapter.getDeparture(position)); + } } } @Override public void onStationFavoriteToggled(Station station, boolean isFavorite) { - mCallbacks.onStationFavoriteToggled(station, isFavorite); + if(mCallbacks != null) { + mCallbacks.onStationFavoriteToggled(station, isFavorite); + } } @Override public void onDepartureFavoriteToggled(Departure departure, boolean isFavorite) { - mCallbacks.onDepartureFavoriteToggled(departure, isFavorite); + if(mCallbacks != null) { + mCallbacks.onDepartureFavoriteToggled(departure, isFavorite); + } } public void setStations(List stations) { diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationListFragment.java b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationListFragment.java index 097003c..06daa02 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationListFragment.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationListFragment.java @@ -1,5 +1,6 @@ package ch.liip.timeforcoffee.fragment; +import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; @@ -40,7 +41,7 @@ public class StationListFragment extends ListFragment implements SwipeRefreshLay private RelativeLayout mEnterSearchLayout; private SwipeRefreshLayout swipeRefreshLayout; - private Callbacks mCallbacks = sDummyCallbacks; + private Callbacks mCallbacks; @Inject FavoritesDataSource favoritesDataSource; @@ -51,17 +52,6 @@ public interface Callbacks { void onStationFavoriteToggled(Station station, boolean isFavorite); } - private static Callbacks sDummyCallbacks = new Callbacks() { - @Override - public void onStationSelected(Station station) { } - - @Override - public void onRefresh() { } - - @Override - public void onStationFavoriteToggled(Station station, boolean isFavorite) { } - }; - /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). @@ -97,8 +87,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa swipeRefreshLayout = rootView.findViewById(R.id.swipe_container); swipeRefreshLayout.setOnRefreshListener(this); - mNoStationsLayout.setVisibility(View.GONE); mLoadingPositionLayout.setVisibility(View.GONE); + mNoStationsLayout.setVisibility(View.GONE); if (mSearchMode) { mEnterSearchLayout.setVisibility(View.VISIBLE); } else { @@ -120,19 +110,19 @@ else if(mActivity instanceof StationSearchActivity) { } @Override - public void onAttach(Context context) { - super.onAttach(context); - if (!(context instanceof Callbacks)) { + public void onAttach(Activity activity) { + super.onAttach(activity); + if (!(activity instanceof Callbacks)) { throw new IllegalStateException("Activity must implement fragment's callbacks."); } - mCallbacks = (Callbacks) context; + + mCallbacks = (Callbacks) activity; } @Override public void onDetach() { super.onDetach(); - // Reset the active callbacks interface to the dummy implementation. - mCallbacks = sDummyCallbacks; + mCallbacks = null; } @Override @@ -140,8 +130,10 @@ public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { - mCallbacks.onRefresh(); swipeRefreshLayout.setRefreshing(false); + if(mCallbacks != null) { + mCallbacks.onRefresh(); + } } }, 100); } @@ -149,12 +141,16 @@ public void run() { @Override public void onListItemClick(ListView listView, View view, int position, long id) { super.onListItemClick(listView, view, position, id); - mCallbacks.onStationSelected(mStationListAdapter.getStation(position)); + if(mCallbacks != null) { + mCallbacks.onStationSelected(mStationListAdapter.getStation(position)); + } } @Override public void onStationFavoriteToggled(Station station, boolean isFavorite) { - mCallbacks.onStationFavoriteToggled(station, isFavorite); + if(mCallbacks != null) { + mCallbacks.onStationFavoriteToggled(station, isFavorite); + } } public void setStations(List stations) { @@ -170,7 +166,8 @@ public void showLoadingPositionLayout(boolean show) { if(mLoadingPositionLayout != null) { if (show) { mLoadingPositionLayout.setVisibility(View.VISIBLE); - } else { + } + else { mLoadingPositionLayout.setVisibility(View.GONE); } } @@ -182,7 +179,8 @@ public void showNoStationsLayout(boolean show) { mEnterSearchLayout.setVisibility(View.GONE); if (show) { mNoStationsLayout.setVisibility(View.VISIBLE); - } else { + } + else { mNoStationsLayout.setVisibility(View.GONE); } } diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationMapFragment.java b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationMapFragment.java index 48b8648..a14607e 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationMapFragment.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/fragment/StationMapFragment.java @@ -1,6 +1,7 @@ package ch.liip.timeforcoffee.fragment; import android.Manifest; +import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; @@ -31,6 +32,7 @@ import ch.liip.timeforcoffee.R; import ch.liip.timeforcoffee.api.models.Connection; +import ch.liip.timeforcoffee.api.models.Departure; import ch.liip.timeforcoffee.api.models.Station; import ch.liip.timeforcoffee.api.models.WalkingDistance; import io.nlopez.smartlocation.SmartLocation; @@ -53,6 +55,12 @@ public class StationMapFragment extends Fragment implements OnMapReadyCallback, private TextView mSubtitleTextView; private ImageView mChevron; + private Callbacks mCallbacks; + + public interface Callbacks { + void onMapLoaded(); + } + public StationMapFragment() { // Required empty public constructor } @@ -74,6 +82,22 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa return view; } + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + if (!(activity instanceof Callbacks)) { + throw new IllegalStateException("Activity must implement fragment's callbacks."); + } + + mCallbacks = (Callbacks) activity; + } + + @Override + public void onDetach() { + super.onDetach(); + mCallbacks = null; + } + @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; @@ -95,6 +119,9 @@ else if(mConnections != null) { @Override public void onMapLoaded() { calculateZoomForVisiblePoints(); + if(mCallbacks != null) { + mCallbacks.onMapLoaded(); + } } public void setup(Station station) { diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/presenter/DeparturesPresenter.java b/mobile/src/main/java/ch/liip/timeforcoffee/presenter/DeparturesPresenter.java index d137e63..cc50437 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/presenter/DeparturesPresenter.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/presenter/DeparturesPresenter.java @@ -73,7 +73,7 @@ public void onDestroy() { @Subscribe public void onDeparturesFetchedEvent(DeparturesFetchedEvent event) { - mActivity.showProgressLayout(false); + mActivity.setAreDeparturesLoading(false); mDepartures = event.getDepartures(); mActivity.updateDepartures(mDepartures); @@ -83,7 +83,7 @@ public void onDeparturesFetchedEvent(DeparturesFetchedEvent event) { @Subscribe public void onFetchErrorEvent(FetchDeparturesErrorEvent event) { - mActivity.showProgressLayout(false); + mActivity.setAreDeparturesLoading(false); SnackBars.showNetworkError(mActivity, new View.OnClickListener() { @Override public void onClick(View view) { @@ -102,7 +102,7 @@ public boolean getStationIsFavorite() { public void updateDepartures() { if (mDepartures == null || mDepartures.size() == 0) { - mActivity.showProgressLayout(true); + mActivity.setAreDeparturesLoading(true); } mEventBus.post(new FetchDeparturesEvent(mStation.getIdStr())); diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/presenter/MainPresenter.java b/mobile/src/main/java/ch/liip/timeforcoffee/presenter/MainPresenter.java index c92e024..bd6f9ad 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/presenter/MainPresenter.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/presenter/MainPresenter.java @@ -84,9 +84,6 @@ public void onPauseView() { @Override public void onRefreshView() { - // Empty list before reloading - mActivity.updateStations(new ArrayList()); - loadStationsWithLastPosition(); } @@ -147,7 +144,8 @@ public void onClick(View view) { public void updateStations() { if (Build.FINGERPRINT.contains("generic")) { //emulator loadStationsWithLastPosition(); - } else if (!mIsCapturingLocation) { + } + else if (!mIsCapturingLocation) { startLocation(); } } @@ -186,6 +184,7 @@ private void updateFavoritesOnFavoriteList() { private void startLocation() { if (!permissionsChecker.LacksPermission(locationPermission)) { + mActivity.updateStations(new ArrayList()); mActivity.setIsPositionLoading(true); if (!SmartLocation.with(mActivity).location().state().locationServicesEnabled()) { @@ -226,6 +225,7 @@ private void loadStations(Location location) { } private void loadStationsWithLastPosition() { + mActivity.updateStations(new ArrayList()); mActivity.setIsPositionLoading(true); if (Build.FINGERPRINT.contains("generic")) { //emulator diff --git a/mobile/src/main/java/ch/liip/timeforcoffee/wear/DataService.java b/mobile/src/main/java/ch/liip/timeforcoffee/wear/DataService.java index 0a83531..a8b3d14 100644 --- a/mobile/src/main/java/ch/liip/timeforcoffee/wear/DataService.java +++ b/mobile/src/main/java/ch/liip/timeforcoffee/wear/DataService.java @@ -169,7 +169,7 @@ void sendStations(ArrayList stations, String destSourceNodeId) { } } - public void getStationBoard(String stationId) { + public void getStationBoard(final String stationId) { if (_gettingStationBoard || stationId == null) { return; @@ -195,8 +195,10 @@ public void onError(Throwable e) { @Override public void onNext(StationboardResponse stationboard) { ArrayList departures = new ArrayList<>(); + int stationIdInteger = Integer.parseInt(stationId); + for (ch.liip.timeforcoffee.zvv.Departure zvvDeparture : stationboard.getDepartures()) { - Departure departure = DepartureMapper.fromZvv(zvvDeparture); + Departure departure = DepartureMapper.fromZvv(zvvDeparture, stationIdInteger); if(departure != null) { departures.add(departure); } diff --git a/mobile/src/main/res/layout/activity_about.xml b/mobile/src/main/res/layout/activity_about.xml index a949f47..001ddaf 100644 --- a/mobile/src/main/res/layout/activity_about.xml +++ b/mobile/src/main/res/layout/activity_about.xml @@ -7,12 +7,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:gravity="center"> + android:gravity="center" + android:padding="20dp"> - - - - - - \ No newline at end of file diff --git a/mobile/src/main/res/layout/fragment_departure_list.xml b/mobile/src/main/res/layout/fragment_departure_list.xml index b4b873a..b6d64ba 100644 --- a/mobile/src/main/res/layout/fragment_departure_list.xml +++ b/mobile/src/main/res/layout/fragment_departure_list.xml @@ -9,12 +9,37 @@ android:layout_height="match_parent"> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:drawSelectorOnTop="false" + android:listSelector="@android:color/transparent" /> + + + + + + + + diff --git a/mobile/src/main/res/layout/fragment_station_list.xml b/mobile/src/main/res/layout/fragment_station_list.xml index f88cd42..4f08f3e 100644 --- a/mobile/src/main/res/layout/fragment_station_list.xml +++ b/mobile/src/main/res/layout/fragment_station_list.xml @@ -65,11 +65,11 @@ + android:gravity="center" + android:text="@string/title_enter_search" + android:textSize="22sp" /> diff --git a/mobile/src/main/res/values-de/strings.xml b/mobile/src/main/res/values-de/strings.xml index f25ad7f..49b2e85 100644 --- a/mobile/src/main/res/values-de/strings.xml +++ b/mobile/src/main/res/values-de/strings.xml @@ -7,10 +7,11 @@ Suche Über Zu Favoriten hinzufügen - Wir versuchen sie zu lokalisieren... + Wir versuchen sie zu lokalisieren… Keine Stationen gefunden "Geben Sie Ihre Suche ein" Keine Favoriten + Keine Abfahrten um eine Station als Favorit hinzuzufügen Tippe das Icon an - Gl: %s diff --git a/mobile/src/main/res/values-fr/strings.xml b/mobile/src/main/res/values-fr/strings.xml index 13f9f26..a539974 100644 --- a/mobile/src/main/res/values-fr/strings.xml +++ b/mobile/src/main/res/values-fr/strings.xml @@ -7,10 +7,11 @@ "Recherche "A propos de cette appli" "Ajouter aux favoris" - Nous essayons de vous localiser... + Nous essayons de vous localiser… "Pas d'arrêts trouvés" "Entrer votre recherche" - "Pas de favoris + Pas de favoris + Pas de départs "pour ajouter un arrêt comme favori" "Tape sur l'icône" "- Voie: %s" diff --git a/mobile/src/main/res/values/strings.xml b/mobile/src/main/res/values/strings.xml index 1795321..7046f5c 100644 --- a/mobile/src/main/res/values/strings.xml +++ b/mobile/src/main/res/values/strings.xml @@ -9,10 +9,11 @@ Search About Add to favorites - We are trying to locate you... + We are trying to locate you… No stations found "Enter your search" No favorites + No departures to add a station as favorite Tap on the icon - Pl: %s