| /* |
| * 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; |
| } |
| } |