/* * Copyright (C) 2008 The Android Open Source Project * * 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.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; } }