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