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.Context; 20c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.Cursor; 21c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.location.Location; 22c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 23c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood/** 24c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Helper class for writing and retrieving data using the TrackerProvider 25c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * content provider 26c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 27c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 28c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodpublic class TrackerDataHelper { 29c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 30c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood private Context mContext; 31c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** formats data output */ 32c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood protected IFormatter mFormatter; 33c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 34c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** formats output as Comma separated value CSV file */ 35c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public static final IFormatter CSV_FORMATTER = new CSVFormatter(); 36c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** formats output as KML file */ 37c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public static final IFormatter KML_FORMATTER = new KMLFormatter(); 38c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** provides no formatting */ 39c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public static final IFormatter NO_FORMATTER = new IFormatter() { 40c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getFooter() { 41c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return ""; 42c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 43c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 44c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getHeader() { 45c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return ""; 46c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 47c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 48c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getOutput(TrackerEntry entry) { 49c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return ""; 50c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 51c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood }; 52c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 53c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 54c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Creates instance 55c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 56c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @param context - content context 57c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @param formatter - formats the output from the get*Output* methods 58c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 59c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public TrackerDataHelper(Context context, IFormatter formatter) { 60c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood mContext = context; 61c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood mFormatter = formatter; 62c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 63c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 64c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 65c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Creates a instance with no output formatting capabilities. Useful for 66c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * clients that require write-only access 67c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 68c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public TrackerDataHelper(Context context) { 69c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood this(context, NO_FORMATTER); 70c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 71c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 72c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 73c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * insert given TrackerEntry into content provider 74c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 75c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood void writeEntry(TrackerEntry entry) { 76c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood mContext.getContentResolver().insert(TrackerProvider.CONTENT_URI, 77c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood entry.getAsContentValues()); 78c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 79c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 80c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 81c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * insert given location into tracker data 82c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 83c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public void writeEntry(Location loc, float distFromNetLoc) { 84c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood writeEntry(TrackerEntry.createEntry(loc, distFromNetLoc)); 85c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 86c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 87c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 88c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * insert given log message into tracker data 89c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 90c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public void writeEntry(String tag, String logMsg) { 91c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood writeEntry(TrackerEntry.createEntry(tag, logMsg)); 92c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 93c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 94c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 95c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Deletes all tracker entries 96c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 97c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public void deleteAll() { 98c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood mContext.getContentResolver().delete(TrackerProvider.CONTENT_URI, null, 99c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood null); 100c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 101c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 102c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 103c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Query tracker data, filtering by given tag 104c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 105c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @param tag 106c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @return Cursor to data 107c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 108c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public Cursor query(String tag, int limit) { 109c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood String selection = (tag == null ? null : TrackerEntry.TAG + "=?"); 110c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood String[] selectionArgs = (tag == null ? null : new String[] {tag}); 111c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood Cursor cursor = mContext.getContentResolver().query( 112c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood TrackerProvider.CONTENT_URI, TrackerEntry.ATTRIBUTES, 113c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood selection, selectionArgs, null); 114c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood if (cursor == null) { 115c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return cursor; 116c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 117c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood int pos = (cursor.getCount() < limit ? 0 : cursor.getCount() - limit); 118c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood cursor.moveToPosition(pos); 119c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return cursor; 120c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 121c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 122c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 123c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Retrieves a cursor that starts at the last limit rows 124c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 125c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @param limit 126c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @return a cursor, null if bad things happened 127c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 128c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public Cursor query(int limit) { 129c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return query(null, limit); 130c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 131c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 132c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 133c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Query tracker data, filtering by given tag. mo limit to number of rows 134c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * returned 135c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 136c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @param tag 137c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @return Cursor to data 138c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 139c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public Cursor query(String tag) { 140c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return query(tag, Integer.MAX_VALUE); 141c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 142c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 143c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 144c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Returns the output header particular to the associated formatter 145c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 146c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getOutputHeader() { 147c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return mFormatter.getHeader(); 148c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 149c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 150c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 151c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Returns the output footer particular to the associated formatter 152c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 153c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getOutputFooter() { 154c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return mFormatter.getFooter(); 155c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 156c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood 157c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood /** 158c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Helper method which converts row referenced by given cursor to a string 159c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * output 160c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * 161c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @param cursor 162c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * @return CharSequence output, null if given cursor is invalid or no more 163c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * data 164c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */ 165c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood public String getNextOutput(Cursor cursor) { 166c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood if (cursor == null || cursor.isAfterLast()) { 167c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return null; 168c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 169c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood String output = mFormatter.getOutput(TrackerEntry.createEntry(cursor)); 170c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood cursor.moveToNext(); 171c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood return output; 172c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood } 173c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood} 174