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.ContentProvider;
20c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.ContentUris;
21c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.ContentValues;
22c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.content.Context;
23c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.Cursor;
24c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.sqlite.SQLiteDatabase;
25c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.database.sqlite.SQLiteOpenHelper;
26c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.net.Uri;
27c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodimport android.util.Log;
28c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
29c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood/**
30c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * Content provider for location tracking.
31c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood *
32c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * It is recommended to use the TrackerDataHelper class to access this data
33c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood * rather than this class directly
34c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood */
35c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwoodpublic class TrackerProvider extends ContentProvider {
36c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
37c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public static final Uri CONTENT_URI = Uri
38191d898468d2f4910a684f429bec518320843744Mike Lockwood            .parse("content://com.android.locationtracker");
39c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
40c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final String DB_NAME = "tracking.db";
41c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final String TABLE_NAME = "tracking";
42c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final int DB_VERSION = 1;
43c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
44c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static final String LOG_TAG = "TrackerProvider";
45c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
46c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    /**
47c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood     * This class helps open, create, and upgrade the database file.
48c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood     */
49c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private static class DatabaseHelper extends SQLiteOpenHelper {
50c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
51c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        DatabaseHelper(Context context) {
52c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            super(context, DB_NAME, null, DB_VERSION);
53c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
54c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
55c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        @Override
56c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        public void onCreate(SQLiteDatabase db) {
57c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            StringBuilder queryBuilder = new StringBuilder();
58c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            queryBuilder.append(String.format("CREATE TABLE %s (", TABLE_NAME));
59c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            TrackerEntry.buildCreationString(queryBuilder);
60c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
61c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            queryBuilder.append(");");
62c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            db.execSQL(queryBuilder.toString());
63c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            db.setVersion(DB_VERSION);
64c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
65c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
66c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        @Override
67c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
68c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            // TODO: reimplement this when dB version changes
69c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Log.w(LOG_TAG, "Upgrading database from version " + oldVersion
70c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                            + " to " + newVersion
71c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                            + ", which will destroy all old data");
72c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
73c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            onCreate(db);
74c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
75c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
76c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
77c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    private DatabaseHelper mOpenHelper;
78c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
79c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    @Override
80c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public boolean onCreate() {
81c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        mOpenHelper = new DatabaseHelper(getContext());
82c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return true;
83c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
84c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
85c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    @Override
86c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public int delete(Uri uri, String selection, String[] selectionArgs) {
87c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
88c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        int result = db.delete(TABLE_NAME, selection, selectionArgs);
89c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        getContext().getContentResolver().notifyChange(uri, null);
90c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return result;
91c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
92c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
93c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    @Override
94c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public String getType(Uri uri) {
95c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        throw new UnsupportedOperationException();
96c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
97c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
98c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    @Override
99c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public Uri insert(Uri uri, ContentValues values) {
100c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
101c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        long rowId = db.insert(TABLE_NAME, null, values);
102c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        if (rowId > 0) {
103c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            Uri addedUri = ContentUris.withAppendedId(CONTENT_URI, rowId);
104c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            getContext().getContentResolver().notifyChange(addedUri, null);
105c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            return addedUri;
106c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        }
107c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return null;
108c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
109c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
110c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    @Override
111c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public Cursor query(Uri uri, String[] projection, String selection,
112c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            String[] selectionArgs, String sortOrder) {
113c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
114c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        // TODO: extract limit from URI ?
115c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        Cursor cursor = db.query(TABLE_NAME, projection, selection,
116c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood                selectionArgs, null, null, sortOrder);
117c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        getContext().getContentResolver().notifyChange(uri, null);
118c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        return cursor;
119c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
120c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood
121c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    @Override
122c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    public int update(Uri uri, ContentValues values, String selection,
123c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood            String[] selectionArgs) {
124c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood        throw new UnsupportedOperationException();
125c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood    }
126c9d3be3f0e10b62fa6d4899ce827866299d41783Mike Lockwood}
127