package com.truckmuncher.app.customer; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import com.truckmuncher.app.data.Contract; import com.truckmuncher.app.data.PublicContract; import com.truckmuncher.app.data.sql.WhereClause; import timber.log.Timber; import static com.truckmuncher.app.data.sql.WhereClause.Operator.EQUALS; // TODO this class is way more complex than it needs to be at this point final class TruckDataLoaderHandler implements LoaderManager.LoaderCallbacks<Cursor> { private final Context context; private final String truckId; private final DataDestination dataDestination; private final OnTriedToLoadInvalidTruckListener invalidTruckListener; TruckDataLoaderHandler(Context context, DataDestination dataDestination, String truckId, OnTriedToLoadInvalidTruckListener invalidTruckListener) { this.context = context; this.truckId = truckId; this.dataDestination = dataDestination; this.invalidTruckListener = invalidTruckListener; } public void load() { dataDestination.getLoaderManager().initLoader(DataDestination.LOADER_TRUCK, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (id) { case DataDestination.LOADER_TRUCK: { WhereClause whereClause = new WhereClause.Builder() .where(PublicContract.Truck.ID, EQUALS, truckId) .build(); return new CursorLoader(context, Contract.TRUCK_PROPERTIES_URI, TruckQuery.PROJECTION, whereClause.selection, whereClause.selectionArgs, null); } case DataDestination.LOADER_MENU: { WhereClause whereClause = new WhereClause.Builder() .where(PublicContract.Menu.TRUCK_ID, EQUALS, truckId) .build(); String[] projection = MenuAdapter.Query.PROJECTION; Uri uri = Contract.syncFromNetwork(PublicContract.MENU_URI); return new CursorLoader(context, uri, projection, whereClause.selection, whereClause.selectionArgs, null); } default: throw new IllegalArgumentException("Unknown loader id: " + id); } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { switch (loader.getId()) { case DataDestination.LOADER_TRUCK: onTruckDataLoaded(data); break; case DataDestination.LOADER_MENU: dataDestination.onMenuDataLoaded(data); break; } } private void onTruckDataLoaded(Cursor cursor) { if (cursor.moveToFirst()) { // Wait to load the menu until we have a truck so that we for sure have the category color dataDestination.getLoaderManager().initLoader(DataDestination.LOADER_MENU, null, this); String primaryColor = cursor.getString(TruckQuery.COLOR_PRIMARY); dataDestination.onTruckDataLoaded(primaryColor); } else { // Invalid truck Timber.w("Tried to load an invalid truck with id %s", truckId); invalidTruckListener.onTriedToLoadInvalidTruck(); } } @Override public void onLoaderReset(Loader<Cursor> loader) { switch (loader.getId()) { case DataDestination.LOADER_MENU: dataDestination.onMenuDataLoaded(null); break; } } interface DataDestination { int LOADER_TRUCK = 0; int LOADER_MENU = 1; void onTruckDataLoaded(String menuBackgroundColor); void onMenuDataLoaded(Cursor data); LoaderManager getLoaderManager(); } interface TruckQuery { String[] PROJECTION = new String[]{ PublicContract.Truck.COLOR_PRIMARY }; int COLOR_PRIMARY = 0; } public interface OnTriedToLoadInvalidTruckListener { void onTriedToLoadInvalidTruck(); } }