package org.rudirect.android.fragment; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; import com.google.android.gms.analytics.HitBuilders; import org.rudirect.android.R; import org.rudirect.android.activity.SettingsActivity; import org.rudirect.android.adapter.BusRouteAdapter; import org.rudirect.android.api.NextBusAPI; import org.rudirect.android.data.constants.RUDirectApplication; import org.rudirect.android.data.model.BusRoute; import org.rudirect.android.ui.view.DividerItemDecoration; import org.rudirect.android.util.RUDirectUtil; import java.util.ArrayList; public class RoutesFragment extends BaseMainFragment { private static final int MILLIS_IN_DAY = 86400000; private RecyclerView recyclerView; private ProgressBar progressBar; private TextView noInternetBanner; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_routes, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); noInternetBanner = (TextView) mainActivity.findViewById(R.id.no_internet_banner); progressBar = (ProgressBar) mainActivity.findViewById(R.id.routes_progress_spinner); if (progressBar != null) progressBar.setVisibility(View.VISIBLE); setupRecyclerView(); setupSwipeRefreshLayout(); // TODO Move this into Stops when it's completed // DirectionsFragment directionsFragment = (DirectionsFragment) MainPagerAdapter.getRegisteredFragment(1); // new UpdateBusRoutesTask().execute(directionsFragment); updateActiveRoutes(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.settings) { Intent intent = new Intent(mainActivity, SettingsActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } // Set up RecyclerView private void setupRecyclerView() { // Initialize recycler view recyclerView = (RecyclerView) mainActivity.findViewById(R.id.routes_recyclerview); // Set layout manager LinearLayoutManager layoutManager = new LinearLayoutManager(mainActivity); recyclerView.setLayoutManager(layoutManager); // Setup layout recyclerView.addItemDecoration(new DividerItemDecoration(mainActivity, LinearLayoutManager.VERTICAL)); // Set adapter recyclerView.setAdapter(new BusRouteAdapter(mainActivity, this)); } // Set up SwipeRefreshLayout private void setupSwipeRefreshLayout() { mSwipeRefreshLayout = (SwipeRefreshLayout) mainActivity.findViewById(R.id.routes_swipe_refresh_layout); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { updateActiveRoutes(); } }); mSwipeRefreshLayout.setColorSchemeResources(R.color.primary_color); } // Update active routes public void updateActiveRoutes() { new UpdateRoutesTask().execute(); } // private class UpdateBusRoutesTask extends AsyncTask<NetworkCallFinishListener, Void, Void> { // private NetworkCallFinishListener listener; // // protected Void doInBackground(NetworkCallFinishListener... listeners) { // listener = listeners[0]; // NextBusAPI.saveBusRoutes(); // return null; // } // // protected void onPostExecute(Void v) { // listener.onBusStopsUpdated(); // } // } private class UpdateRoutesTask extends AsyncTask<Void, Void, ArrayList<BusRoute>> { protected ArrayList<BusRoute> doInBackground(Void... voids) { // Update the bus routes if more than a day has passed since it has been updated long busDataDate = RUDirectApplication.getBusData().getDateInMillis(); if (busDataDate == 0 || System.currentTimeMillis() - busDataDate >= MILLIS_IN_DAY) { NextBusAPI.saveBusRoutes(); RUDirectApplication.getBusData().setDateInMillis(System.currentTimeMillis()); } return NextBusAPI.getActiveRoutes(); } protected void onPostExecute(ArrayList<BusRoute> activeRoutes) { BusRouteAdapter adapter = (BusRouteAdapter) recyclerView.getAdapter(); if (RUDirectUtil.isNetworkAvailable()) { noInternetBanner.setVisibility(View.GONE); if (activeRoutes == null || activeRoutes.size() == 0) { activeRoutes = new ArrayList<>(); activeRoutes.add(new BusRoute("No active routes.")); } else { // Set active and inactive routes adapter.setActiveRoutes(activeRoutes); ArrayList<BusRoute> inactiveRoutes = RUDirectApplication.getBusData().getBusRoutes(); inactiveRoutes.removeAll(activeRoutes); if (inactiveRoutes.size() == 0) { inactiveRoutes.add(new BusRoute("No inactive routes.")); } adapter.setInactiveRoutes(inactiveRoutes); adapter.notifyDataSetChanged(); } } else { // Show error noInternetBanner.setVisibility(View.VISIBLE); if (recyclerView.getAdapter().getItemCount() == 0) { ArrayList<BusRoute> allRoutes = RUDirectApplication.getBusData().getBusRoutes(); if (allRoutes != null) { adapter.setActiveRoutes(allRoutes); adapter.notifyDataSetChanged(); } else { View layout = mainActivity.findViewById(R.id.routes_layout); if (layout != null) Snackbar.make(layout, getString(R.string.no_internet_error), Snackbar.LENGTH_SHORT).show(); } } } progressBar.setVisibility(View.GONE); mSwipeRefreshLayout.setRefreshing(false); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isAdded()) { RUDirectApplication.getTracker().send(new HitBuilders.EventBuilder() .setCategory(getString(R.string.active_routes_category)) .setAction(getString(R.string.view_action)) .build()); } } }