diff options
Diffstat (limited to 'tests/LocationTracker/src/com/google/android/locationtracker/data/TrackerEntry.java')
-rw-r--r-- | tests/LocationTracker/src/com/google/android/locationtracker/data/TrackerEntry.java | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/tests/LocationTracker/src/com/google/android/locationtracker/data/TrackerEntry.java b/tests/LocationTracker/src/com/google/android/locationtracker/data/TrackerEntry.java new file mode 100644 index 0000000..91e6dcc --- /dev/null +++ b/tests/LocationTracker/src/com/google/android/locationtracker/data/TrackerEntry.java @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.android.locationtracker.data; + +import android.content.ContentValues; +import android.database.Cursor; +import android.location.Location; + + +/** + * Class that holds a tracker entry. An entry can be either a valid location, or + * a simple log msg + * + * It provides a concrete data structure to represent data stored in the + * TrackerProvider + */ +class TrackerEntry { + + static final String TIMESTAMP = "Timestamp"; + static final String TAG = "Tag"; + static final String ENTRY_TYPE = "Type"; + + private Location mLocation; + private float mDistFromNetLocation; + private String mLogMsg; + + static final String ID_COL = "_id"; + static final String ACCURACY = "Accuracy"; + static final String LATITUDE = "Latitude"; + static final String LONGITUDE = "Longitude"; + static final String ALTITUDE = "Altitude"; + static final String SPEED = "Speed"; + static final String BEARING = "Bearing"; + static final String DIST_NET_LOCATION = "DistFromNetLocation"; + static final String LOC_TIME = "LocationTime"; + static final String DEBUG_INFO = "DebugInfo"; + + static final String STRING_DATA = "STRING"; + static final String INT_DATA = "INTEGER"; + static final String REAL_DATA = "REAL"; + static final String BLOB_DATA = "BLOB"; + + static final String[] ATTRIBUTES = { + ID_COL, TIMESTAMP, TAG, ENTRY_TYPE, ACCURACY, LATITUDE, LONGITUDE, + ALTITUDE, SPEED, BEARING, DIST_NET_LOCATION, LOC_TIME, DEBUG_INFO}; + static final String[] ATTRIBUTES_DATA_TYPE = { + INT_DATA + " PRIMARY KEY", STRING_DATA, STRING_DATA, STRING_DATA, + REAL_DATA, REAL_DATA, REAL_DATA, REAL_DATA, REAL_DATA, REAL_DATA, + REAL_DATA, INT_DATA, STRING_DATA}; + + // location extra keys used to retrieve debug info + private static final String NETWORK_LOCATION_SOURCE_KEY = + "networkLocationSource"; + private static final String NETWORK_LOCATION_TYPE_KEY = + "networkLocationType"; + private static final String[] LOCATION_DEBUG_KEYS = { + NETWORK_LOCATION_SOURCE_KEY, NETWORK_LOCATION_TYPE_KEY}; + + enum EntryType { + LOCATION_TYPE, LOG_TYPE + } + + private String mTimestamp; + private String mTag; + private EntryType mType; + + private TrackerEntry(String tag, EntryType type) { + mType = type; + mTag = tag; + mLocation = null; + } + + private TrackerEntry(Location loc) { + this(loc.getProvider(), EntryType.LOCATION_TYPE); + mLocation = new Location(loc); + } + + /** + * Creates a TrackerEntry from a Location + */ + static TrackerEntry createEntry(Location loc, float distFromNetLocation) { + TrackerEntry entry = new TrackerEntry(loc); + + String timestampVal = DateUtils.getCurrentKMLTimestamp(); + entry.setTimestamp(timestampVal); + entry.setDistFromNetLocation(distFromNetLocation); + return entry; + } + + /** + * Creates a TrackerEntry from a log msg + */ + static TrackerEntry createEntry(String tag, String msg) { + TrackerEntry entry = new TrackerEntry(tag, EntryType.LOG_TYPE); + String timestampVal = DateUtils.getCurrentKMLTimestamp(); + entry.setTimestamp(timestampVal); + entry.setLogMsg(msg); + return entry; + } + + private void setTimestamp(String timestamp) { + mTimestamp = timestamp; + } + + EntryType getType() { + return mType; + } + + private void setDistFromNetLocation(float distFromNetLocation) { + mDistFromNetLocation = distFromNetLocation; + } + + private void setLogMsg(String msg) { + mLogMsg = msg; + } + + private void setLocation(Location location) { + mLocation = location; + } + + String getTimestamp() { + return mTimestamp; + } + + String getTag() { + return mTag; + } + + Location getLocation() { + return mLocation; + } + + String getLogMsg() { + return mLogMsg; + } + + float getDistFromNetLocation() { + return mDistFromNetLocation; + } + + static void buildCreationString(StringBuilder builder) { + if (ATTRIBUTES.length != ATTRIBUTES_DATA_TYPE.length) { + throw new IllegalArgumentException( + "Attribute length does not match data type length"); + } + for (int i = 0; i < ATTRIBUTES_DATA_TYPE.length; i++) { + if (i != 0) { + builder.append(", "); + } + builder.append(String.format("%s %s", ATTRIBUTES[i], + ATTRIBUTES_DATA_TYPE[i])); + } + } + + ContentValues getAsContentValues() { + ContentValues cValues = new ContentValues(ATTRIBUTES.length); + cValues.put(TIMESTAMP, mTimestamp); + cValues.put(TAG, mTag); + cValues.put(ENTRY_TYPE, mType.toString()); + if (mType == EntryType.LOCATION_TYPE) { + cValues.put(LATITUDE, mLocation.getLatitude()); + cValues.put(LONGITUDE, mLocation.getLongitude()); + if (mLocation.hasAccuracy()) { + cValues.put(ACCURACY, mLocation.getAccuracy()); + } + if (mLocation.hasAltitude()) { + cValues.put(ALTITUDE, mLocation.getAltitude()); + } + if (mLocation.hasSpeed()) { + cValues.put(SPEED, mLocation.getSpeed()); + } + if (mLocation.hasBearing()) { + cValues.put(BEARING, mLocation.getBearing()); + } + cValues.put(DIST_NET_LOCATION, mDistFromNetLocation); + cValues.put(LOC_TIME, mLocation.getTime()); + StringBuilder debugBuilder = new StringBuilder(""); + if (mLocation.getExtras() != null) { + for (String key : LOCATION_DEBUG_KEYS) { + Object val = mLocation.getExtras().get(key); + if (val != null) { + debugBuilder.append(String.format("%s=%s; ", key, val + .toString())); + } + } + } + cValues.put(DEBUG_INFO, debugBuilder.toString()); + } else { + cValues.put(DEBUG_INFO, mLogMsg); + } + return cValues; + } + + static TrackerEntry createEntry(Cursor cursor) { + String timestamp = cursor.getString(cursor.getColumnIndex(TIMESTAMP)); + String tag = cursor.getString(cursor.getColumnIndex(TAG)); + String sType = cursor.getString(cursor.getColumnIndex(ENTRY_TYPE)); + TrackerEntry entry = new TrackerEntry(tag, EntryType.valueOf(sType)); + entry.setTimestamp(timestamp); + if (entry.getType() == EntryType.LOCATION_TYPE) { + Location location = new Location(tag); + location.setLatitude(cursor.getFloat(cursor + .getColumnIndexOrThrow(LATITUDE))); + location.setLongitude(cursor.getFloat(cursor + .getColumnIndexOrThrow(LONGITUDE))); + + Float accuracy = getNullableFloat(cursor, ACCURACY); + if (accuracy != null) { + location.setAccuracy(accuracy); + } + Float altitude = getNullableFloat(cursor, ALTITUDE); + if (altitude != null) { + location.setAltitude(altitude); + } + Float bearing = getNullableFloat(cursor, BEARING); + if (bearing != null) { + location.setBearing(bearing); + } + Float speed = getNullableFloat(cursor, SPEED); + if (speed != null) { + location.setSpeed(speed); + } + location.setTime(cursor.getLong(cursor.getColumnIndex(LOC_TIME))); + entry.setLocation(location); + } + entry.setLogMsg(cursor.getString(cursor.getColumnIndex(DEBUG_INFO))); + + return entry; + } + + private static Float getNullableFloat(Cursor cursor, String colName) { + Float retValue = null; + int colIndex = cursor.getColumnIndexOrThrow(colName); + if (!cursor.isNull(colIndex)) { + retValue = cursor.getFloat(colIndex); + } + return retValue; + } +} |