1 /* 2 * Copyright (C) 2011 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.providers.contacts; 18 19 import static com.android.providers.contacts.util.DbQueryUtils.concatenateClauses; 20 21 import android.content.ContentUris; 22 import android.content.ContentValues; 23 import android.content.Context; 24 import android.database.Cursor; 25 import android.database.sqlite.SQLiteDatabase; 26 import android.database.sqlite.SQLiteOpenHelper; 27 import android.database.sqlite.SQLiteQueryBuilder; 28 import android.net.Uri; 29 import android.os.ParcelFileDescriptor; 30 import android.provider.VoicemailContract.Status; 31 32 import com.android.common.content.ProjectionMap; 33 import com.android.providers.contacts.VoicemailContentProvider.UriData; 34 35 /** 36 * Implementation of {@link VoicemailTable.Delegate} for the voicemail status table. 37 */ 38 public class VoicemailStatusTable implements VoicemailTable.Delegate { 39 private static final ProjectionMap sStatusProjectionMap = new ProjectionMap.Builder() 40 .add(Status._ID) 41 .add(Status.CONFIGURATION_STATE) 42 .add(Status.DATA_CHANNEL_STATE) 43 .add(Status.NOTIFICATION_CHANNEL_STATE) 44 .add(Status.SETTINGS_URI) 45 .add(Status.SOURCE_PACKAGE) 46 .add(Status.VOICEMAIL_ACCESS_URI) 47 .build(); 48 49 private final String mTableName; 50 private final Context mContext; 51 private final SQLiteOpenHelper mDbHelper; 52 private final VoicemailTable.DelegateHelper mDelegateHelper; 53 54 public VoicemailStatusTable(String tableName, Context context, SQLiteOpenHelper dbHelper, 55 VoicemailTable.DelegateHelper delegateHelper) { 56 mTableName = tableName; 57 mContext = context; 58 mDbHelper = dbHelper; 59 mDelegateHelper = delegateHelper; 60 } 61 62 @Override 63 public Uri insert(UriData uriData, ContentValues values) { 64 SQLiteDatabase db = mDbHelper.getWritableDatabase(); 65 ContentValues copiedValues = new ContentValues(values); 66 mDelegateHelper.checkAndAddSourcePackageIntoValues(uriData, copiedValues); 67 long rowId = getDatabaseModifier(db).insert(mTableName, null, copiedValues); 68 if (rowId > 0) { 69 Uri newUri = ContentUris.withAppendedId(uriData.getUri(), rowId); 70 return newUri; 71 } else { 72 return null; 73 } 74 } 75 76 @Override 77 public int delete(UriData uriData, String selection, String[] selectionArgs) { 78 SQLiteDatabase db = mDbHelper.getWritableDatabase(); 79 String combinedClause = concatenateClauses(selection, uriData.getWhereClause()); 80 return getDatabaseModifier(db).delete(mTableName, combinedClause, 81 selectionArgs); 82 } 83 84 @Override 85 public Cursor query(UriData uriData, String[] projection, String selection, 86 String[] selectionArgs, String sortOrder) { 87 SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 88 qb.setTables(mTableName); 89 qb.setProjectionMap(sStatusProjectionMap); 90 qb.setStrict(true); 91 92 String combinedClause = concatenateClauses(selection, uriData.getWhereClause()); 93 SQLiteDatabase db = mDbHelper.getReadableDatabase(); 94 Cursor c = qb.query(db, projection, combinedClause, selectionArgs, null, null, sortOrder); 95 if (c != null) { 96 c.setNotificationUri(mContext.getContentResolver(), Status.CONTENT_URI); 97 } 98 return c; 99 } 100 101 @Override 102 public int update(UriData uriData, ContentValues values, String selection, 103 String[] selectionArgs) { 104 SQLiteDatabase db = mDbHelper.getWritableDatabase(); 105 String combinedClause = concatenateClauses(selection, uriData.getWhereClause()); 106 return getDatabaseModifier(db).update(mTableName, values, combinedClause, 107 selectionArgs); 108 } 109 110 @Override 111 public String getType(UriData uriData) { 112 if (uriData.hasId()) { 113 return Status.ITEM_TYPE; 114 } else { 115 return Status.DIR_TYPE; 116 } 117 } 118 119 @Override 120 public ParcelFileDescriptor openFile(UriData uriData, String mode) { 121 throw new UnsupportedOperationException("File operation is not supported for status table"); 122 } 123 124 private DatabaseModifier getDatabaseModifier(SQLiteDatabase db) { 125 return new DbModifierWithNotification(mTableName, db, mContext); 126 } 127 } 128