package org.rudirect.android.adapter;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.rudirect.android.R;
import org.rudirect.android.activity.RouteActivity;
import org.rudirect.android.data.constants.RUDirectApplication;
import org.rudirect.android.data.model.BusData;
import org.rudirect.android.data.model.BusRoute;
import org.rudirect.android.fragment.RoutesFragment;
import org.rudirect.android.interfaces.ViewHolderClickListener;
import org.rudirect.android.ui.holder.BusRouteViewHolder;
import org.rudirect.android.ui.holder.HeaderViewHolder;
import java.sql.SQLException;
import java.util.ArrayList;
public class BusRouteAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = BusRouteAdapter.class.getSimpleName();
private static final int BUS_ROUTE = 0, HEADER = 1;
private ArrayList<BusRoute> activeRoutes;
private ArrayList<BusRoute> inactiveRoutes;
private Activity activity;
private Fragment fragment;
public BusRouteAdapter(Activity activity, Fragment fragment) {
this.activeRoutes = null;
this.inactiveRoutes = null;
this.activity = activity;
this.fragment = fragment;
}
// Create new views
@Override
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
if (viewType == BUS_ROUTE) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_bus_routes, parent, false);
return new BusRouteViewHolder(v, new ViewHolderClickListener() {
public void onClick(View v, int position) {
BusRoute route = getRouteByPosition(position);
if (route != null) {
// Setup intent
Intent intent = new Intent(activity, RouteActivity.class);
Context context = RUDirectApplication.getContext();
intent.putExtra(context.getString(R.string.bus_tag_message), route.getTag());
if (fragment instanceof RoutesFragment) {
intent.putExtra(context.getString(R.string.page_clicked_from_message), "Routes");
}
// Start new activity to show bus stops
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.abc_grow_fade_in_from_bottom, 0);
}
}
});
} else {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_recyclerview_header, parent, false);
return new HeaderViewHolder(v);
}
}
// Replace the contents of a view
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof BusRouteViewHolder) {
BusRoute route = getRouteByPosition(position);
if (route != null) {
final BusRouteViewHolder busRouteViewHolder = (BusRouteViewHolder) viewHolder;
busRouteViewHolder.title.setText(route.getTitle());
busRouteViewHolder.starImage.setActivated(route.isStarred());
busRouteViewHolder.starImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Update the star image
boolean starred = !busRouteViewHolder.starImage.isActivated();
busRouteViewHolder.starImage.setActivated(starred);
// Handle star click
handleStarClick(viewHolder.getLayoutPosition(), starred);
// Update bus data
try {
RUDirectApplication.getDatabaseHelper().getDao()
.createOrUpdate(RUDirectApplication.getBusData());
} catch (SQLException e) {
Log.e(TAG, e.toString(), e);
}
}
});
}
} else {
HeaderViewHolder headerViewHolder = (HeaderViewHolder) viewHolder;
Resources resources = RUDirectApplication.getContext().getResources();
if (position == 0) {
if (inactiveRoutes == null) {
headerViewHolder.title.setText(resources.getString(R.string.all_text));
} else {
headerViewHolder.title.setText(resources.getString(R.string.active_text));
}
} else {
headerViewHolder.title.setText(resources.getString(R.string.inactive_text));
}
}
}
// Return the item count
@Override
public int getItemCount() {
if (activeRoutes != null && inactiveRoutes != null) {
return activeRoutes.size() + inactiveRoutes.size() + 2;
} else if (activeRoutes != null) {
return activeRoutes.size() + 1;
}
return 0;
}
@Override
public int getItemViewType(int position) {
if (position == 0 || position == activeRoutes.size() + 1) {
return HEADER;
} else {
return BUS_ROUTE;
}
}
// Handles what happens when a star is clicked
private void handleStarClick(int position, boolean starred) {
BusRoute route = getRouteByPosition(position);
if (route != null) {
route.setStarred(starred);
// Set the correct route list
ArrayList<BusRoute> routeList;
if (BusData.getActiveRoutes().contains(route)) {
routeList = activeRoutes;
routeList.remove(position - 1);
} else {
routeList = inactiveRoutes;
routeList.remove(position - activeRoutes.size() - 2);
}
// Move bus route to the proper position
int size = routeList.size();
for (int i = 0; i <= size; i++) {
if (i == size
|| (starred && (!routeList.get(i).isStarred() ||
route.getTitle().compareToIgnoreCase(routeList.get(i).getTitle()) < 0))
|| (!starred && !routeList.get(i).isStarred() &&
route.getTitle().compareToIgnoreCase(routeList.get(i).getTitle()) < 0)) {
int newPosition;
if (routeList == activeRoutes) {
newPosition = i + 1;
} else {
newPosition = i + activeRoutes.size() + 2;
}
routeList.add(i, route);
notifyItemMoved(position, newPosition);
notifyItemRangeChanged(Math.min(position, newPosition), Math.abs(position - newPosition) + 1);
break;
}
}
}
}
// Helper method that returns the bus route given the adapter position that was clicked
private BusRoute getRouteByPosition(int position) {
if (position < activeRoutes.size() + 1 && position > 0) {
return activeRoutes.get(position - 1);
} else if (position > activeRoutes.size() + 1
&& position < activeRoutes.size() + inactiveRoutes.size() + 2) {
return inactiveRoutes.get(position - activeRoutes.size() - 2);
} else {
return null;
}
}
// Sets the active bus routes in the adapter
public void setActiveRoutes(ArrayList<BusRoute> activeRoutes) {
this.activeRoutes = activeRoutes;
}
// Sets the other bus routes in the adapter
public void setInactiveRoutes(ArrayList<BusRoute> inactiveRoutes) {
this.inactiveRoutes = inactiveRoutes;
}
}