org.teleportr.Ride.java Source code

Java tutorial

Introduction

Here is the source code for org.teleportr.Ride.java

Source

/**
 * Fahrgemeinschaft / Ridesharing App
 * Copyright (c) 2013 by it's authors.
 * Some rights reserved. See LICENSE..
 *
 */

package org.teleportr;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.net.Uri.Builder;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

public class Ride implements Parcelable {

    private static final String COLON = ": ";
    private static final String ARROW = " -> ";
    public static final String _ID = "_id";
    public static final String TYPE = "type";
    public static final String FROM_ID = "from_id";
    public static final String TO_ID = "to_id";
    public static final String DEP = "dep";
    public static final String ARR = "arr";
    public static final String WHO = "who";
    public static final String MODE = "mode";
    public static final String DIRTY = "dirty";
    public static final String OPERATOR = "operator";
    public static final String PARENT_ID = "parent_id";
    public static final String DETAILS = "details";
    public static final String REFRESH = "refresh";
    public static final String ACTIVE = "active";
    public static final String MARKED = "marked";
    public static final String SEATS = "seats";
    public static final String PRICE = "price";
    public static final String REF = "ref";
    public static final String EMPTY = "";
    public static final short SEARCH = 42;
    public static final short OFFER = 47;
    public static final short FLAG_DELETED = -2;
    public static final short FLAG_DRAFT = -1;
    public static final short FLAG_CLEAN = 0;
    public static final short FLAG_FOR_CREATE = 1;
    public static final short FLAG_FOR_UPDATE = 2;
    public static final short FLAG_FOR_DELETE = 3;

    public static enum Mode {
        CAR, TRAIN
    }

    Context ctx;
    ContentValues cv;
    ArrayList<ContentValues> subrides;
    JSONObject details;

    public Ride() {
        cv = new ContentValues();
    }

    public Ride set(String key, String value) {
        try {
            getDetails().put(key, value);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return this;
    }

    public Ride from(Uri from) {
        return from(Integer.parseInt(from.getLastPathSegment()));
    }

    public Ride from(Place from) {
        return from(from.id);
    }

    public Ride from(int from_id) {
        cv.put(FROM_ID, from_id);
        if (subrides != null && subrides.size() > 0) {
            subrides.get(0).put(FROM_ID, from_id);
        }
        return this;
    }

    public Ride removeVias() {
        subrides = null;
        return this;
    }

    public Ride via(Uri via) {
        return to(Integer.parseInt(via.getLastPathSegment()));
    }

    public Ride via(Place via) {
        return via(via.id);
    }

    public Ride via(long via_id) {
        if (subrides == null) {
            subrides = new ArrayList<ContentValues>();
            ContentValues sub = new ContentValues();
            sub.put(FROM_ID, cv.getAsLong(FROM_ID));
            sub.put(TO_ID, via_id);
            subrides.add(sub);
        } else {
            subrides.get(subrides.size() - 1).put(TO_ID, via_id);
        }
        ContentValues sub = new ContentValues();
        sub.put(FROM_ID, via_id);
        if (getToId() != 0)
            sub.put(TO_ID, getToId());
        subrides.add(sub);
        return this;
    }

    public Ride to(Uri to) {
        return to(Integer.parseInt(to.getLastPathSegment()));
    }

    public Ride to(Place to) {
        return to(to.id);
    }

    public Ride to(long to_id) {
        cv.put(TO_ID, to_id);
        if (subrides != null && subrides.size() > 0) {
            subrides.get(subrides.size() - 1).put(TO_ID, to_id);
        }
        return this;
    }

    public Ride dep(Date dep) {
        return dep(dep.getTime());
    }

    public Ride dep(long dep) {
        cv.put(DEP, dep);
        return this;
    }

    public Ride arr(Date arr) {
        return arr(arr.getTime());
    }

    public Ride arr(long arr) {
        cv.put(ARR, arr);
        return this;
    }

    public Ride mode(Mode mode) {
        cv.put(MODE, mode.name());
        return this;
    }

    public Ride who(String who) {
        cv.put(WHO, who);
        return this;
    }

    public Ride type(int type) {
        cv.put(TYPE, type);
        return this;
    }

    public Ride ref(String ref) {
        if (ref == null)
            cv.remove(REF);
        else
            cv.put(REF, ref);
        return this;
    }

    public Ride price(long price) {
        cv.put(PRICE, price);
        return this;
    }

    public Ride seats(long seats) {
        cv.put(SEATS, seats);
        return this;
    }

    public Ride marked() {
        cv.put(MARKED, 1);
        return this;
    }

    public Ride activate() {
        cv.put(ACTIVE, 1);
        return this;
    }

    public Ride deactivate() {
        cv.put(ACTIVE, 0);
        return this;
    }

    public Ride dirty() {
        if (!cv.containsKey(DIRTY) || cv.getAsShort(DIRTY) == FLAG_DRAFT) {
            cv.put(DIRTY, FLAG_FOR_CREATE);
        } else if (cv.getAsShort(DIRTY) == FLAG_CLEAN) {
            cv.put(DIRTY, FLAG_FOR_UPDATE);
        }
        return this;
    }

    public Uri delete() {
        if (!cv.containsKey(DIRTY) || getRef() == null // should not be possible
                || cv.getAsShort(DIRTY) == FLAG_FOR_CREATE || cv.getAsShort(DIRTY) == FLAG_DRAFT) {
            cv.put(DIRTY, FLAG_DELETED);
        } else if (cv.getAsShort(DIRTY) == FLAG_CLEAN) {
            cv.put(DIRTY, FLAG_FOR_DELETE);
        }
        return store(ctx);
    }

    public Uri duplicate() {
        cv.remove(_ID);
        cv.remove(REF);
        cv.remove(DIRTY);
        cv.remove(MARKED);
        return store(ctx);
    }

    public Uri store(Context ctx) {
        if (!cv.containsKey(MODE))
            mode(Mode.CAR);
        if (!cv.containsKey(ACTIVE))
            activate();
        if (!cv.containsKey(PRICE))
            price(-1);
        if (!cv.containsKey(DIRTY))
            cv.put(DIRTY, FLAG_DRAFT);
        if (details != null)
            cv.put(DETAILS, details.toString());
        Uri ride;
        cv.put(PARENT_ID, 0);
        ride = ctx.getContentResolver().insert(RidesProvider.getRidesUri(ctx), cv);
        Integer id = Integer.valueOf(ride.getLastPathSegment());
        System.out.println("STORED " + id);
        if (subrides != null) {
            for (ContentValues v : subrides) {
                v.put(PARENT_ID, id);
                ctx.getContentResolver().insert(RidesProvider.getRidesUri(ctx), v);
                //                System.out.println("  SUB  " + Integer.valueOf(ride.getLastPathSegment()));
            }
        }
        return ride;
    }

    public static final class COLUMNS {
        public static final short ID = 0;
        public static final short TYPE = 1;
        public static final short FROM_ID = 2;
        public static final short FROM_NAME = 3;
        public static final short FROM_ADDRESS = 4;
        public static final short TO_ID = 5;
        public static final short TO_NAME = 6;
        public static final short TO_ADDRESS = 7;
        public static final short DEPARTURE = 8;
        public static final short ARRIVAL = 9;
        public static final short MODE = 10;
        public static final short OPERATOR = 11;
        public static final short WHO = 12;
        public static final short DETAILS = 13;
        public static final short DISTANCE = 14;
        public static final short PRICE = 15;
        public static final short SEATS = 16;
        public static final short MARKED = 17;
        public static final short DIRTY = 18;
        public static final short ACTIVE = 19;
        public static final short PARENT_ID = 20;
        public static final short REF = 21;
    }

    public Ride(Context ctx) {
        this();
        this.ctx = ctx;
    }

    public void setContext(Context ctx) {
        this.ctx = ctx;
    }

    public Ride(int id, Context ctx) {
        this(RidesProvider.getRideUri(ctx, id), ctx);
    }

    public Ride(Uri uri, Context ctx) {
        this(ctx);
        Cursor c = ctx.getContentResolver().query(uri, null, null, null, null);
        c.moveToFirst();
        load(c, ctx);
        c.close();
    }

    public Ride(Cursor cursor, Context ctx) {
        this(ctx);
        load(cursor, ctx);
    }

    private void load(Cursor cursor, Context ctx) {
        cv.put(_ID, cursor.getLong(COLUMNS.ID));
        type(cursor.getInt(COLUMNS.TYPE));
        from(cursor.getInt(COLUMNS.FROM_ID));
        to(cursor.getInt(COLUMNS.TO_ID));
        dep(cursor.getLong(COLUMNS.DEPARTURE));
        arr(cursor.getLong(COLUMNS.ARRIVAL));
        price(cursor.getInt(COLUMNS.PRICE));
        seats(cursor.getInt(COLUMNS.SEATS));
        cv.put(DIRTY, cursor.getInt(COLUMNS.DIRTY));
        if (cursor.getShort(COLUMNS.MARKED) == 1)
            marked();
        if (cursor.getShort(COLUMNS.ACTIVE) == 1)
            activate();
        String val = cursor.getString(COLUMNS.WHO);
        if (val != null && !val.equals(EMPTY))
            who(val);
        val = cursor.getString(COLUMNS.REF);
        if (val != null && !val.equals(EMPTY))
            ref(val);
        else
            Log.e(RidesProvider.TAG, "REF is NULL! " + this);
        try {
            details = new JSONObject(cursor.getString(COLUMNS.DETAILS));
            mode(Mode.valueOf(cursor.getString(COLUMNS.MODE)));
        } catch (Exception e) {
        }
        Cursor sub_cursor = ctx.getContentResolver().query(RidesProvider.getSubRidesUri(ctx, cursor.getInt(0)),
                null, null, null, null);
        subrides = new ArrayList<ContentValues>();
        for (int i = 0; i < sub_cursor.getCount(); i++) {
            sub_cursor.moveToPosition(i);
            subrides.add(new Ride(sub_cursor, ctx).cv);
        }
        sub_cursor.close();
        this.ctx = ctx;
    }

    public String get(String key) {
        try {
            return getDetails().getString(key);
        } catch (JSONException e) {
            return null;
        }
    }

    public List<Ride> getSubrides() {
        ArrayList<Ride> subs = new ArrayList<Ride>();
        for (ContentValues v : subrides) {
            Ride r = new Ride(ctx);
            r.cv = v;
            subs.add(r);
        }
        return subs;
    }

    public Place getFrom() {
        if (getFromId() > 0)
            return new Place(getFromId(), ctx);
        else
            return null;
    }

    public Place getTo() {
        if (getToId() > 0)
            return new Place(getToId(), ctx);
        else
            return null;
    }

    public List<Place> getVias() {
        ArrayList<Place> vias = new ArrayList<Place>();
        if (subrides != null) {
            for (int i = 1; i < subrides.size(); i++) {
                vias.add(new Place(subrides.get(i).getAsInteger(FROM_ID), ctx));
            }
        }
        return vias;
    }

    public List<Place> getPlaces() {
        ArrayList<Place> places = new ArrayList<Place>();
        if (subrides != null && subrides.size() > 0) {
            for (int i = 0; i < subrides.size(); i++) {
                places.add(new Place(subrides.get(i).getAsInteger(FROM_ID), ctx));
            }
            places.add(getTo());
        } else {
            places.add(getFrom());
            places.add(getTo());
        }
        return places;
    }

    public int getFromId() {
        if (cv.containsKey(FROM_ID))
            return cv.getAsInteger(FROM_ID);
        else
            return -3;
    }

    public int getToId() {
        if (cv.containsKey(TO_ID))
            return cv.getAsInteger(TO_ID);
        else
            return -3;
    }

    public long getDep() {
        if (cv.containsKey(DEP))
            return cv.getAsLong(DEP);
        else
            return System.currentTimeMillis();
    }

    public long getArr() {
        if (cv.containsKey(ARR))
            return cv.getAsLong(ARR);
        else
            return System.currentTimeMillis();
    }

    public short getType() {
        if (cv.containsKey(TYPE))
            return cv.getAsShort(TYPE);
        else
            return SEARCH;
    }

    public Mode getMode() {
        if (cv.containsKey(MODE))
            return Mode.valueOf(cv.getAsString(MODE));
        else
            return Mode.CAR;
    }

    public String getWho() {
        if (cv.containsKey(WHO))
            return cv.getAsString(WHO);
        else
            return EMPTY;
    }

    public int getPrice() {
        if (cv.containsKey(PRICE))
            return cv.getAsInteger(PRICE);
        else
            return 0;
    }

    public int getSeats() {
        if (cv.containsKey(SEATS))
            return cv.getAsInteger(SEATS);
        else
            return 0;
    }

    public int getId() {
        if (cv.containsKey(_ID))
            return cv.getAsInteger(_ID);
        else
            return 0;
    }

    public String getRef() {
        if (cv.containsKey(REF))
            return cv.getAsString(REF);
        else
            return null;
    }

    public boolean isMarked() {
        return cv.containsKey(MARKED) && cv.getAsShort(MARKED) == 1;
    }

    public boolean isActive() {
        return cv.containsKey(ACTIVE) && cv.getAsShort(ACTIVE) == 1;
    }

    public JSONObject getDetails() {
        if (details == null)
            details = new JSONObject();
        return details;
    }

    public Uri toUri() {
        Builder b = RidesProvider.getRidesUri(ctx).buildUpon();
        if (cv.containsKey(Ride.FROM_ID))
            b.appendQueryParameter(Ride.FROM_ID, cv.getAsString(Ride.FROM_ID));
        if (cv.containsKey(Ride.TO_ID))
            b.appendQueryParameter(Ride.TO_ID, cv.getAsString(Ride.TO_ID));
        if (cv.containsKey(Ride.DEP))
            b.appendQueryParameter(Ride.DEP, cv.getAsString(Ride.DEP));
        if (cv.containsKey(Ride.ARR))
            b.appendQueryParameter(Ride.ARR, cv.getAsString(Ride.ARR));
        return b.build();
    }

    @Override
    public String toString() {
        StringBuffer b = new StringBuffer();
        if (getFrom() != null)
            b.append(getFrom().getName().substring(0, 3));
        if (getTo() != null)
            b.append(ARROW).append(getTo().getName().substring(0, 3));
        if (cv.containsKey(DEP))
            b.append(COLON).append(df.format(getDep())).toString();
        return b.toString();
    }

    private static final SimpleDateFormat df = new SimpleDateFormat("EEE dd.MM.", Locale.GERMANY);

    @Override
    public int hashCode() {
        int prim = 59;
        int hash = 17;
        hash = hash + prim * (int) (getFromId() >>> 32);
        hash = hash + prim * (int) (getToId() >>> 32);
        hash = hash + prim * (int) (getDep() >>> 32);
        return hash;
    }

    public static JSONObject getDetails(Cursor cursor) {
        try {
            return new JSONObject(cursor.getString(COLUMNS.DETAILS));
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String getDetails(Cursor cursor, String key) {
        try {
            return getDetails(cursor).getString(key);
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        if (details != null) {
            cv.put(DETAILS, details.toString());
        }
        out.writeParcelable(cv, 0);
    }

    public static final Parcelable.Creator<Ride> CREATOR = new Parcelable.Creator<Ride>() {

        @Override
        public Ride createFromParcel(Parcel in) {
            Ride ride = new Ride();
            ride.cv = in.readParcelable(getClass().getClassLoader());
            try {
                if (ride.cv.containsKey(DETAILS))
                    ride.details = new JSONObject(ride.cv.getAsString(DETAILS));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return ride;
        }

        @Override
        public Ride[] newArray(int size) {
            return new Ride[size];
        }
    };

}