package co.smartreceipts.android.model.impl.columns.distance; import android.content.Context; import android.support.annotation.NonNull; import java.util.ArrayList; import java.util.List; import co.smartreceipts.android.R; import co.smartreceipts.android.model.Column; import co.smartreceipts.android.model.ColumnDefinitions; import co.smartreceipts.android.model.Distance; import co.smartreceipts.android.model.impl.columns.AbstractColumnImpl; import co.smartreceipts.android.model.impl.columns.BlankColumn; import co.smartreceipts.android.persistence.DatabaseHelper; import co.smartreceipts.android.persistence.PersistenceManager; import co.smartreceipts.android.settings.UserPreferenceManager; import co.smartreceipts.android.sync.model.SyncState; import co.smartreceipts.android.sync.model.impl.DefaultSyncState; import wb.android.flex.Flex; /** * Provides specific definitions for all {@link co.smartreceipts.android.model.Receipt} {@link co.smartreceipts.android.model.Column} * objects */ public final class DistanceColumnDefinitions implements ColumnDefinitions<Distance> { private enum ActualDefinition { LOCATION(R.string.distance_location_field), PRICE(R.string.distance_price_field), DISTANCE(R.string.distance_distance_field), CURRENCY(R.string.dialog_currency_field), RATE(R.string.distance_rate_field), DATE(R.string.distance_date_field), COMMENT(R.string.distance_comment_field); private final int mStringResId; ActualDefinition(int stringResId) { mStringResId = stringResId; } public final int getStringResId() { return mStringResId; } } private final Context mContext; private final DatabaseHelper mDB; private final UserPreferenceManager mPreferences; private final Flex mFlex; private final ActualDefinition[] mActualDefinitions; private final boolean mAllowSpecialCharacters; public DistanceColumnDefinitions(@NonNull Context context, @NonNull PersistenceManager persistenceManager, Flex flex, boolean allowSpecialCharacters) { this(context, persistenceManager.getDatabase(), persistenceManager.getPreferenceManager(), flex, allowSpecialCharacters); } public DistanceColumnDefinitions(@NonNull Context context, @NonNull DatabaseHelper db, @NonNull UserPreferenceManager preferences, Flex flex, boolean allowSpecialCharacters) { mContext = context; mDB = db; mPreferences = preferences; mFlex = flex; mAllowSpecialCharacters = allowSpecialCharacters; mActualDefinitions = ActualDefinition.values(); } @Override public Column<Distance> getColumn(int id, @NonNull String definitionName, @NonNull SyncState syncState) { for (int i = 0; i < mActualDefinitions.length; i++) { final ActualDefinition definition = mActualDefinitions[i]; if (definitionName.equals(getColumnNameFromStringResId(definition.getStringResId()))) { return getColumnFromClass(id, definition, definitionName, syncState); } } return null; } @NonNull @Override public List<Column<Distance>> getAllColumns() { final ArrayList<AbstractColumnImpl<Distance>> columns = new ArrayList<>(mActualDefinitions.length); for (int i = 0; i < mActualDefinitions.length; i++) { final ActualDefinition definition = mActualDefinitions[i]; final AbstractColumnImpl<Distance> column = getColumnFromClass(Column.UNKNOWN_ID, definition, getColumnNameFromStringResId(definition.getStringResId()), new DefaultSyncState()); if (column != null) { columns.add(column); } } return new ArrayList<Column<Distance>>(columns); } @NonNull @Override public Column<Distance> getDefaultInsertColumn() { // Hack for the distance default until we let users dynamically set columns return new BlankColumn<>(Column.UNKNOWN_ID, mContext.getString(R.string.column_item_blank), new DefaultSyncState()); } private AbstractColumnImpl<Distance> getColumnFromClass(int id, @NonNull ActualDefinition definition, @NonNull String definitionName, @NonNull SyncState syncState) { switch (definition) { case LOCATION: return new DistanceLocationColumn(id, definitionName, syncState, mContext); case PRICE: return new DistancePriceColumn(id, definitionName, syncState, mAllowSpecialCharacters); case DISTANCE: return new DistanceDistanceColumn(id, definitionName, syncState); case CURRENCY: return new DistanceCurrencyColumn(id, definitionName, syncState); case RATE: return new DistanceRateColumn(id, definitionName, syncState); case DATE: return new DistanceDateColumn(id, definitionName, syncState, mContext, mPreferences); case COMMENT: return new DistanceCommentColumn(id, definitionName, syncState); default: throw new IllegalArgumentException("Unknown definition type: " + definition); } } private String getColumnNameFromStringResId(int stringResId) { if (mFlex != null) { return mFlex.getString(mContext, stringResId); } else { return mContext.getString(stringResId); } } }