1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.deskclock; 18 19 import android.content.ContentProvider; 20 import android.content.ContentValues; 21 import android.content.Context; 22 import android.content.UriMatcher; 23 import android.database.Cursor; 24 import android.database.SQLException; 25 import android.database.sqlite.SQLiteDatabase; 26 import android.database.sqlite.SQLiteQueryBuilder; 27 import android.net.Uri; 28 import android.text.TextUtils; 29 30 public class AlarmProvider extends ContentProvider { 31 private AlarmDatabaseHelper mOpenHelper; 32 33 private static final int ALARMS = 1; 34 private static final int ALARMS_ID = 2; 35 private static final UriMatcher sURLMatcher = new UriMatcher( 36 UriMatcher.NO_MATCH); 37 38 static { 39 sURLMatcher.addURI("com.android.deskclock", "alarm", ALARMS); 40 sURLMatcher.addURI("com.android.deskclock", "alarm/#", ALARMS_ID); 41 } 42 43 public AlarmProvider() { 44 } 45 46 @Override 47 public boolean onCreate() { 48 mOpenHelper = new AlarmDatabaseHelper(getContext()); 49 return true; 50 } 51 52 @Override 53 public Cursor query(Uri url, String[] projectionIn, String selection, 54 String[] selectionArgs, String sort) { 55 SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 56 57 // Generate the body of the query 58 int match = sURLMatcher.match(url); 59 switch (match) { 60 case ALARMS: 61 qb.setTables("alarms"); 62 break; 63 case ALARMS_ID: 64 qb.setTables("alarms"); 65 qb.appendWhere("_id="); 66 qb.appendWhere(url.getPathSegments().get(1)); 67 break; 68 default: 69 throw new IllegalArgumentException("Unknown URL " + url); 70 } 71 72 SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 73 Cursor ret = qb.query(db, projectionIn, selection, selectionArgs, 74 null, null, sort); 75 76 if (ret == null) { 77 if (Log.LOGV) Log.v("Alarms.query: failed"); 78 } else { 79 ret.setNotificationUri(getContext().getContentResolver(), url); 80 } 81 82 return ret; 83 } 84 85 @Override 86 public String getType(Uri url) { 87 int match = sURLMatcher.match(url); 88 switch (match) { 89 case ALARMS: 90 return "vnd.android.cursor.dir/alarms"; 91 case ALARMS_ID: 92 return "vnd.android.cursor.item/alarms"; 93 default: 94 throw new IllegalArgumentException("Unknown URL"); 95 } 96 } 97 98 @Override 99 public int update(Uri url, ContentValues values, String where, String[] whereArgs) { 100 int count; 101 long rowId = 0; 102 int match = sURLMatcher.match(url); 103 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 104 switch (match) { 105 case ALARMS_ID: { 106 String segment = url.getPathSegments().get(1); 107 rowId = Long.parseLong(segment); 108 count = db.update("alarms", values, "_id=" + rowId, null); 109 break; 110 } 111 default: { 112 throw new UnsupportedOperationException( 113 "Cannot update URL: " + url); 114 } 115 } 116 if (Log.LOGV) Log.v("*** notifyChange() rowId: " + rowId + " url " + url); 117 getContext().getContentResolver().notifyChange(url, null); 118 return count; 119 } 120 121 @Override 122 public Uri insert(Uri url, ContentValues initialValues) { 123 if (sURLMatcher.match(url) != ALARMS) { 124 throw new IllegalArgumentException("Cannot insert into URL: " + url); 125 } 126 127 Uri newUrl = mOpenHelper.commonInsert(initialValues); 128 getContext().getContentResolver().notifyChange(newUrl, null); 129 return newUrl; 130 } 131 132 public int delete(Uri url, String where, String[] whereArgs) { 133 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 134 int count; 135 long rowId = 0; 136 switch (sURLMatcher.match(url)) { 137 case ALARMS: 138 count = db.delete("alarms", where, whereArgs); 139 break; 140 case ALARMS_ID: 141 String segment = url.getPathSegments().get(1); 142 rowId = Long.parseLong(segment); 143 if (TextUtils.isEmpty(where)) { 144 where = "_id=" + segment; 145 } else { 146 where = "_id=" + segment + " AND (" + where + ")"; 147 } 148 count = db.delete("alarms", where, whereArgs); 149 break; 150 default: 151 throw new IllegalArgumentException("Cannot delete from URL: " + url); 152 } 153 154 getContext().getContentResolver().notifyChange(url, null); 155 return count; 156 } 157 } 158