15fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/*
25fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
35fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
45fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
55fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * you may not use this file except in compliance with the License.
65fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * You may obtain a copy of the License at
75fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
85fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
95fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * See the License for the specific language governing permissions and
145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * limitations under the License.
155fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */
165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
17fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandlerpackage com.android.deskclock;
185fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
195fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.ContentProvider;
205fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.ContentValues;
215fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.Context;
225fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.UriMatcher;
235fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.database.Cursor;
245fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.database.SQLException;
255fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
265fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.database.sqlite.SQLiteQueryBuilder;
275fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.net.Uri;
285fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.text.TextUtils;
295fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
305fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectpublic class AlarmProvider extends ContentProvider {
311a7925761a5db1b424d976ba03fb335e821b7db3Patrick Scott    private AlarmDatabaseHelper mOpenHelper;
325fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
335fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private static final int ALARMS = 1;
345fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private static final int ALARMS_ID = 2;
355fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private static final UriMatcher sURLMatcher = new UriMatcher(
365fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            UriMatcher.NO_MATCH);
375fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
385fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    static {
39fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandler        sURLMatcher.addURI("com.android.deskclock", "alarm", ALARMS);
40fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandler        sURLMatcher.addURI("com.android.deskclock", "alarm/#", ALARMS_ID);
415fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
425fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
435fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public AlarmProvider() {
445fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
455fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
475fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public boolean onCreate() {
481a7925761a5db1b424d976ba03fb335e821b7db3Patrick Scott        mOpenHelper = new AlarmDatabaseHelper(getContext());
495fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return true;
505fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
515fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
525fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
535fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public Cursor query(Uri url, String[] projectionIn, String selection,
545fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            String[] selectionArgs, String sort) {
555fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
565fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
575fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        // Generate the body of the query
585fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int match = sURLMatcher.match(url);
595fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        switch (match) {
605fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS:
615fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                qb.setTables("alarms");
625fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                break;
635fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS_ID:
645fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                qb.setTables("alarms");
655fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                qb.appendWhere("_id=");
665fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                qb.appendWhere(url.getPathSegments().get(1));
675fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                break;
685fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            default:
695fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                throw new IllegalArgumentException("Unknown URL " + url);
705fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
715fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
725fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
735fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
745fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                              null, null, sort);
755fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
765fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (ret == null) {
775fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            if (Log.LOGV) Log.v("Alarms.query: failed");
785fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        } else {
795fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            ret.setNotificationUri(getContext().getContentResolver(), url);
805fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
815fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
825fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return ret;
835fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
845fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
855fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
865fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public String getType(Uri url) {
875fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int match = sURLMatcher.match(url);
885fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        switch (match) {
895fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS:
905fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                return "vnd.android.cursor.dir/alarms";
915fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS_ID:
925fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                return "vnd.android.cursor.item/alarms";
935fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            default:
945fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                throw new IllegalArgumentException("Unknown URL");
955fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
965fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
975fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
985fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
995fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
1005fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int count;
1015fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long rowId = 0;
1025fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int match = sURLMatcher.match(url);
1035fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
1045fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        switch (match) {
1055fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS_ID: {
1065fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                String segment = url.getPathSegments().get(1);
1075fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                rowId = Long.parseLong(segment);
1085fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                count = db.update("alarms", values, "_id=" + rowId, null);
1095fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                break;
1105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            }
1115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            default: {
1125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                throw new UnsupportedOperationException(
1135fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                        "Cannot update URL: " + url);
1145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            }
1155fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
1165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (Log.LOGV) Log.v("*** notifyChange() rowId: " + rowId + " url " + url);
1175fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        getContext().getContentResolver().notifyChange(url, null);
1185fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return count;
1195fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1205fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1215fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
1225fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public Uri insert(Uri url, ContentValues initialValues) {
1235fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (sURLMatcher.match(url) != ALARMS) {
1245fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            throw new IllegalArgumentException("Cannot insert into URL: " + url);
1255fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
1265fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1271a7925761a5db1b424d976ba03fb335e821b7db3Patrick Scott        Uri newUrl = mOpenHelper.commonInsert(initialValues);
1285fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        getContext().getContentResolver().notifyChange(newUrl, null);
1295fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return newUrl;
1305fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1315fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1325fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public int delete(Uri url, String where, String[] whereArgs) {
1335fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
1345fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int count;
1355fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long rowId = 0;
1365fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        switch (sURLMatcher.match(url)) {
1375fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS:
1385fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                count = db.delete("alarms", where, whereArgs);
1395fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                break;
1405fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            case ALARMS_ID:
1415fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                String segment = url.getPathSegments().get(1);
1425fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                rowId = Long.parseLong(segment);
1435fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                if (TextUtils.isEmpty(where)) {
1445fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                    where = "_id=" + segment;
1455fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                } else {
1465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                    where = "_id=" + segment + " AND (" + where + ")";
1475fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                }
1485fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                count = db.delete("alarms", where, whereArgs);
1495fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                break;
1505fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            default:
1515fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                throw new IllegalArgumentException("Cannot delete from URL: " + url);
1525fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
1535fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1545fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        getContext().getContentResolver().notifyChange(url, null);
1555fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return count;
1565fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1575fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project}
158