1c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood/*
28ab8b411b81e4581060a31a97a0cb204a803b2e5Mike Lockwood * Copyright (C) 2008 The Android Open Source Project
3c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood *
4c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * use this file except in compliance with the License. You may obtain a copy of
6c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * the License at
7c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood *
8c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0
9c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood *
10c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Unless required by applicable law or agreed to in writing, software
11c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * License for the specific language governing permissions and limitations under
14c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * the License.
15c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */
16c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
17191d898468d2f4910a684f429bec518320843744Mike Lockwoodpackage com.android.locationtracker.data;
18c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
19c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.ContentValues;
20c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.Cursor;
21c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.location.Location;
22c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
23c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
24c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood/**
25c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Class that holds a tracker entry. An entry can be either a valid location, or
26c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * a simple log msg
27c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood *
28c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * It provides a concrete data structure to represent data stored in the
29c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * TrackerProvider
30c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */
31c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodclass TrackerEntry {
32c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
33c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String TIMESTAMP = "Timestamp";
34c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String TAG = "Tag";
35c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String ENTRY_TYPE = "Type";
36c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
37c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private Location mLocation;
38c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private float mDistFromNetLocation;
39c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private String mLogMsg;
40c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
41c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String ID_COL = "_id";
42c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String ACCURACY = "Accuracy";
43c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String LATITUDE = "Latitude";
44c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String LONGITUDE = "Longitude";
45c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String ALTITUDE = "Altitude";
46c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String SPEED = "Speed";
47c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String BEARING = "Bearing";
48c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String DIST_NET_LOCATION = "DistFromNetLocation";
49c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String LOC_TIME = "LocationTime";
50c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String DEBUG_INFO = "DebugInfo";
51c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
52c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String STRING_DATA = "STRING";
53c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String INT_DATA = "INTEGER";
54c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String REAL_DATA = "REAL";
55c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String BLOB_DATA = "BLOB";
56c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
57c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String[] ATTRIBUTES = {
58c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            ID_COL, TIMESTAMP, TAG, ENTRY_TYPE, ACCURACY, LATITUDE, LONGITUDE,
59c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            ALTITUDE, SPEED, BEARING, DIST_NET_LOCATION, LOC_TIME, DEBUG_INFO};
60c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static final String[] ATTRIBUTES_DATA_TYPE = {
61c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            INT_DATA + " PRIMARY KEY", STRING_DATA, STRING_DATA, STRING_DATA,
62c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            REAL_DATA, REAL_DATA, REAL_DATA, REAL_DATA, REAL_DATA, REAL_DATA,
63c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            REAL_DATA, INT_DATA, STRING_DATA};
64c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
65c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    // location extra keys used to retrieve debug info
66c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final String NETWORK_LOCATION_SOURCE_KEY =
67c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        "networkLocationSource";
68c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final String NETWORK_LOCATION_TYPE_KEY =
69c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        "networkLocationType";
70c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final String[] LOCATION_DEBUG_KEYS = {
71c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            NETWORK_LOCATION_SOURCE_KEY, NETWORK_LOCATION_TYPE_KEY};
72c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
73c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    enum EntryType {
74c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        LOCATION_TYPE, LOG_TYPE
75c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
76c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
77c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private String mTimestamp;
78c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private String mTag;
79c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private EntryType mType;
80c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
81c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private TrackerEntry(String tag, EntryType type) {
82c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mType = type;
83c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mTag = tag;
84c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mLocation = null;
85c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
86c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
87c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private TrackerEntry(Location loc) {
88c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        this(loc.getProvider(), EntryType.LOCATION_TYPE);
89c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mLocation = new Location(loc);
90c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
91c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
92c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    /**
93c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood     * Creates a TrackerEntry from a Location
94c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood     */
95c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static TrackerEntry createEntry(Location loc, float distFromNetLocation) {
96c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        TrackerEntry entry = new TrackerEntry(loc);
97c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
98c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        String timestampVal = DateUtils.getCurrentKMLTimestamp();
99c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        entry.setTimestamp(timestampVal);
100c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        entry.setDistFromNetLocation(distFromNetLocation);
101c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return entry;
102c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
103c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
104c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    /**
105c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood     * Creates a TrackerEntry from a log msg
106c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood     */
107c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static TrackerEntry createEntry(String tag, String msg) {
108c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        TrackerEntry entry = new TrackerEntry(tag, EntryType.LOG_TYPE);
109c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        String timestampVal = DateUtils.getCurrentKMLTimestamp();
110c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        entry.setTimestamp(timestampVal);
111c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        entry.setLogMsg(msg);
112c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return entry;
113c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
114c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
115c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private void setTimestamp(String timestamp) {
116c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mTimestamp = timestamp;
117c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
118c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
119c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    EntryType getType() {
120c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return mType;
121c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
122c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
123c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private void setDistFromNetLocation(float distFromNetLocation) {
124c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mDistFromNetLocation = distFromNetLocation;
125c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
126c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
127c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private void setLogMsg(String msg) {
128c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mLogMsg = msg;
129c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
130c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
131c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private void setLocation(Location location) {
132c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mLocation = location;
133c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
134c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
135c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    String getTimestamp() {
136c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return mTimestamp;
137c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
138c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
139c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    String getTag() {
140c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return mTag;
141c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
142c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
143c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    Location getLocation() {
144c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return mLocation;
145c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
146c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
147c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    String getLogMsg() {
148c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return mLogMsg;
149c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
150c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
151c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    float getDistFromNetLocation() {
152c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return mDistFromNetLocation;
153c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
154c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
155c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static void buildCreationString(StringBuilder builder) {
156c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        if (ATTRIBUTES.length != ATTRIBUTES_DATA_TYPE.length) {
157c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            throw new IllegalArgumentException(
158c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    "Attribute length does not match data type length");
159c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
160c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        for (int i = 0; i < ATTRIBUTES_DATA_TYPE.length; i++) {
161c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (i != 0) {
162c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                builder.append(", ");
163c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
164c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            builder.append(String.format("%s %s", ATTRIBUTES[i],
165c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    ATTRIBUTES_DATA_TYPE[i]));
166c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
167c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
168c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
169c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    ContentValues getAsContentValues() {
170c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        ContentValues cValues = new ContentValues(ATTRIBUTES.length);
171c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        cValues.put(TIMESTAMP, mTimestamp);
172c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        cValues.put(TAG, mTag);
173c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        cValues.put(ENTRY_TYPE, mType.toString());
174c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        if (mType == EntryType.LOCATION_TYPE) {
175c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            cValues.put(LATITUDE, mLocation.getLatitude());
176c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            cValues.put(LONGITUDE, mLocation.getLongitude());
177c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (mLocation.hasAccuracy()) {
178c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                cValues.put(ACCURACY, mLocation.getAccuracy());
179c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
180c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (mLocation.hasAltitude()) {
181c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                cValues.put(ALTITUDE, mLocation.getAltitude());
182c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
183c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (mLocation.hasSpeed()) {
184c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                cValues.put(SPEED, mLocation.getSpeed());
185c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
186c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (mLocation.hasBearing()) {
187c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                cValues.put(BEARING, mLocation.getBearing());
188c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
189c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            cValues.put(DIST_NET_LOCATION, mDistFromNetLocation);
190c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            cValues.put(LOC_TIME, mLocation.getTime());
191c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            StringBuilder debugBuilder = new StringBuilder("");
192c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (mLocation.getExtras() != null) {
193c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                for (String key : LOCATION_DEBUG_KEYS) {
194c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    Object val = mLocation.getExtras().get(key);
195c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    if (val != null) {
196c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                        debugBuilder.append(String.format("%s=%s; ", key, val
197c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                                .toString()));
198c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    }
199c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                }
200c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
201c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            cValues.put(DEBUG_INFO, debugBuilder.toString());
202c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        } else {
203c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            cValues.put(DEBUG_INFO, mLogMsg);
204c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
205c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return cValues;
206c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
207c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
208c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    static TrackerEntry createEntry(Cursor cursor) {
209c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        String timestamp = cursor.getString(cursor.getColumnIndex(TIMESTAMP));
210c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        String tag = cursor.getString(cursor.getColumnIndex(TAG));
211c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        String sType = cursor.getString(cursor.getColumnIndex(ENTRY_TYPE));
212c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        TrackerEntry entry = new TrackerEntry(tag, EntryType.valueOf(sType));
213c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        entry.setTimestamp(timestamp);
214c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        if (entry.getType() == EntryType.LOCATION_TYPE) {
215c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Location location = new Location(tag);
216c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            location.setLatitude(cursor.getFloat(cursor
217c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    .getColumnIndexOrThrow(LATITUDE)));
218c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            location.setLongitude(cursor.getFloat(cursor
219c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                    .getColumnIndexOrThrow(LONGITUDE)));
220c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
221c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Float accuracy = getNullableFloat(cursor, ACCURACY);
222c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (accuracy != null) {
223c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                location.setAccuracy(accuracy);
224c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
225c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Float altitude = getNullableFloat(cursor, ALTITUDE);
226c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (altitude != null) {
227c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                location.setAltitude(altitude);
228c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
229c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Float bearing = getNullableFloat(cursor, BEARING);
230c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (bearing != null) {
231c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                location.setBearing(bearing);
232c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
233c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Float speed = getNullableFloat(cursor, SPEED);
234c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            if (speed != null) {
235c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                location.setSpeed(speed);
236c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            }
237c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            location.setTime(cursor.getLong(cursor.getColumnIndex(LOC_TIME)));
238c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            entry.setLocation(location);
239c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
240c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        entry.setLogMsg(cursor.getString(cursor.getColumnIndex(DEBUG_INFO)));
241c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
242c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return entry;
243c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
244c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
245c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static Float getNullableFloat(Cursor cursor, String colName) {
246c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        Float retValue = null;
247c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        int colIndex = cursor.getColumnIndexOrThrow(colName);
248c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        if (!cursor.isNull(colIndex)) {
249c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            retValue = cursor.getFloat(colIndex);
250c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
251c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return retValue;
252c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
253c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood}
254