109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/* 209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Copyright (c) 2008-2009, Motorola, Inc. 309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * All rights reserved. 509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Redistribution and use in source and binary forms, with or without 709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * modification, are permitted provided that the following conditions are met: 809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions of source code must retain the above copyright notice, 1009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer. 1109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 1209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions in binary form must reproduce the above copyright notice, 1309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer in the documentation 1409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * and/or other materials provided with the distribution. 1509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 1609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Neither the name of the Motorola, Inc. nor the names of its contributors 1709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * may be used to endorse or promote products derived from this software 1809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * without specific prior written permission. 1909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * 2009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * POSSIBILITY OF SUCH DAMAGE. 3109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 3209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 3309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypackage com.android.bluetooth.opp; 3409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 3509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.ContentProvider; 3609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.ContentValues; 3709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.Context; 3809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.Intent; 3909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.database.Cursor; 4009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.database.SQLException; 4109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.UriMatcher; 4209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.database.sqlite.SQLiteDatabase; 4309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.database.sqlite.SQLiteOpenHelper; 4409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.database.sqlite.SQLiteQueryBuilder; 4509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.net.Uri; 4609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.provider.LiveFolders; 4709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.util.Log; 4809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 49d6eaf19f39e163e16d22e29907edec402b30622eNick Pellyimport java.util.ArrayList; 5009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport java.util.HashMap; 51d6eaf19f39e163e16d22e29907edec402b30622eNick Pellyimport java.util.List; 5209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 5309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/** 546769b59d715ea98bd72eafcfea9acd2714a887daTao Liejun * This provider allows application to interact with Bluetooth OPP manager 5509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 5609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 5709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypublic final class BluetoothOppProvider extends ContentProvider { 5809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 59ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly private static final String TAG = "BluetoothOppProvider"; 60ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly private static final boolean D = Constants.DEBUG; 61ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly private static final boolean V = Constants.VERBOSE; 621ac5507790a87810061a19dadec36eb328a222eaTao Liejun 6309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** Database filename */ 6409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final String DB_NAME = "btopp.db"; 6509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 6609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** Current database version */ 6709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final int DB_VERSION = 1; 6809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 6909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** Database version from which upgrading is a nop */ 7009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final int DB_VERSION_NOP_UPGRADE_FROM = 0; 7109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 7209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** Database version to which upgrading is a nop */ 7309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final int DB_VERSION_NOP_UPGRADE_TO = 1; 7409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 7509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** Name of table in the database */ 7609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final String DB_TABLE = "btopp"; 7709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 7809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** MIME type for the entire share list */ 7909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final String SHARE_LIST_TYPE = "vnd.android.cursor.dir/vnd.android.btopp"; 8009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 8109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** MIME type for an individual share */ 8209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final String SHARE_TYPE = "vnd.android.cursor.item/vnd.android.btopp"; 8309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 8409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** URI matcher used to recognize URIs sent by applications */ 8509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); 8609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 8709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** URI matcher constant for the URI of the entire share list */ 8809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final int SHARES = 1; 8909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 9009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** URI matcher constant for the URI of an individual share */ 9109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final int SHARES_ID = 2; 9209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 9309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** URI matcher constant for the URI of live folder */ 9409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final int LIVE_FOLDER_RECEIVED_FILES = 3; 9509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly static { 9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sURIMatcher.addURI("com.android.bluetooth.opp", "btopp", SHARES); 9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sURIMatcher.addURI("com.android.bluetooth.opp", "btopp/#", SHARES_ID); 9809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sURIMatcher.addURI("com.android.bluetooth.opp", "live_folders/received", 9909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly LIVE_FOLDER_RECEIVED_FILES); 10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 10109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 10209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final HashMap<String, String> LIVE_FOLDER_PROJECTION_MAP; 10309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly static { 10409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly LIVE_FOLDER_PROJECTION_MAP = new HashMap<String, String>(); 10509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly LIVE_FOLDER_PROJECTION_MAP.put(LiveFolders._ID, BluetoothShare._ID + " AS " 10609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + LiveFolders._ID); 10709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly LIVE_FOLDER_PROJECTION_MAP.put(LiveFolders.NAME, BluetoothShare.FILENAME_HINT + " AS " 10809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + LiveFolders.NAME); 10909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 11009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** The database that lies underneath this content provider */ 11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private SQLiteOpenHelper mOpenHelper = null; 11309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 11409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** 11509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Creates and updated database on demand when opening it. Helper class to 11609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * create database the first time the provider is initialized and upgrade it 11709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * when a new version of the provider needs an updated version of the 11809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * database. 11909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 12009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private final class DatabaseHelper extends SQLiteOpenHelper { 12109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 12209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public DatabaseHelper(final Context context) { 12309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly super(context, DB_NAME, null, DB_VERSION); 12409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 12509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 12609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** 12709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Creates database the first time we try to open it. 12809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 12909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 13009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public void onCreate(final SQLiteDatabase db) { 131ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (V) Log.v(TAG, "populating new database"); 13209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly createTable(db); 13309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 13409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 13509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly //TODO: use this function to check garbage transfer left in db, for example, 13609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // a crash incoming file 13709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /* 13809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * (not a javadoc comment) Checks data integrity when opening the 13909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * database. 14009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 14109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /* 14209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * @Override public void onOpen(final SQLiteDatabase db) { 14309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * super.onOpen(db); } 14409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 14509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 14609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly /** 14709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Updates the database format when a content provider is used with a 14809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * database that was created with a different format. 14909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */ 15009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // Note: technically, this could also be a downgrade, so if we want 15109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // to gracefully handle upgrades we should be careful about 15209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // what to do on downgrades. 15309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 15409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public void onUpgrade(final SQLiteDatabase db, int oldV, final int newV) { 15509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (oldV == DB_VERSION_NOP_UPGRADE_FROM) { 15609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (newV == DB_VERSION_NOP_UPGRADE_TO) { // that's a no-op 15709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // upgrade. 15809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return; 15909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 16009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // NOP_FROM and NOP_TO are identical, just in different 16109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // codelines. Upgrading 16209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly // from NOP_FROM is the same as upgrading from NOP_TO. 16309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly oldV = DB_VERSION_NOP_UPGRADE_TO; 16409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 1651ac5507790a87810061a19dadec36eb328a222eaTao Liejun Log.i(TAG, "Upgrading downloads database from version " + oldV + " to " 16609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + newV + ", which will destroy all old data"); 16709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly dropTable(db); 16809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly createTable(db); 16909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 17009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 17109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 17209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 17309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private void createTable(SQLiteDatabase db) { 17409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly try { 17509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly db.execSQL("CREATE TABLE " + DB_TABLE + "(" + BluetoothShare._ID 17609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + " INTEGER PRIMARY KEY AUTOINCREMENT," + BluetoothShare.URI + " TEXT, " 17709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + BluetoothShare.FILENAME_HINT + " TEXT, " + BluetoothShare._DATA + " TEXT, " 17809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + BluetoothShare.MIMETYPE + " TEXT, " + BluetoothShare.DIRECTION + " INTEGER, " 17909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + BluetoothShare.DESTINATION + " TEXT, " + BluetoothShare.VISIBILITY 18009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + " INTEGER, " + BluetoothShare.USER_CONFIRMATION + " INTEGER, " 18109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + BluetoothShare.STATUS + " INTEGER, " + BluetoothShare.TOTAL_BYTES 18209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + " INTEGER, " + BluetoothShare.CURRENT_BYTES + " INTEGER, " 18309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + BluetoothShare.TIMESTAMP + " INTEGER," + Constants.MEDIA_SCANNED 18409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + " INTEGER); "); 18509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } catch (SQLException ex) { 1861ac5507790a87810061a19dadec36eb328a222eaTao Liejun Log.e(TAG, "couldn't create table in downloads database"); 18709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw ex; 18809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 18909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 19009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 19109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private void dropTable(SQLiteDatabase db) { 19209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly try { 19309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); 19409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } catch (SQLException ex) { 1951ac5507790a87810061a19dadec36eb328a222eaTao Liejun Log.e(TAG, "couldn't drop table in downloads database"); 19609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw ex; 19709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 19809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 19909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 20009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 20109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public String getType(Uri uri) { 20209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly int match = sURIMatcher.match(uri); 20309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly switch (match) { 20409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES: { 20509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return SHARE_LIST_TYPE; 20609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 20709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES_ID: { 20809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return SHARE_TYPE; 20909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 21009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly default: { 211ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "calling getType on an unknown URI: " + uri); 21209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw new IllegalArgumentException("Unknown URI: " + uri); 21309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 21409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 21509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 21609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 21709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final void copyString(String key, ContentValues from, ContentValues to) { 21809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly String s = from.getAsString(key); 21909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (s != null) { 22009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly to.put(key, s); 22109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 22209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 22309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 22409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly private static final void copyInteger(String key, ContentValues from, ContentValues to) { 22509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Integer i = from.getAsInteger(key); 22609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (i != null) { 22709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly to.put(key, i); 22809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 22909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 23009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 23109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 23209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public Uri insert(Uri uri, ContentValues values) { 23309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 23409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 23509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (sURIMatcher.match(uri) != SHARES) { 236ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "calling insert on an unknown/invalid URI: " + uri); 23709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw new IllegalArgumentException("Unknown/Invalid URI " + uri); 23809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 23909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 24009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly ContentValues filteredValues = new ContentValues(); 24109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 24209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly copyString(BluetoothShare.URI, values, filteredValues); 24309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly copyString(BluetoothShare.FILENAME_HINT, values, filteredValues); 24409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly copyString(BluetoothShare.MIMETYPE, values, filteredValues); 24509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly copyString(BluetoothShare.DESTINATION, values, filteredValues); 24609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 24709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly copyInteger(BluetoothShare.VISIBILITY, values, filteredValues); 24809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly copyInteger(BluetoothShare.TOTAL_BYTES, values, filteredValues); 24909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 25009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (values.getAsInteger(BluetoothShare.VISIBILITY) == null) { 25109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly filteredValues.put(BluetoothShare.VISIBILITY, BluetoothShare.VISIBILITY_VISIBLE); 25209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 25309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Integer dir = values.getAsInteger(BluetoothShare.DIRECTION); 25409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Integer con = values.getAsInteger(BluetoothShare.USER_CONFIRMATION); 255d6eaf19f39e163e16d22e29907edec402b30622eNick Pelly String address = values.getAsString(BluetoothShare.DESTINATION); 25609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 25709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (values.getAsInteger(BluetoothShare.DIRECTION) == null) { 25809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly dir = BluetoothShare.DIRECTION_OUTBOUND; 25909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 26009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (dir == BluetoothShare.DIRECTION_OUTBOUND && con == null) { 26109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly con = BluetoothShare.USER_CONFIRMATION_AUTO_CONFIRMED; 26209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 26309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (dir == BluetoothShare.DIRECTION_INBOUND && con == null) { 2648099f5e7bfa7227ba674b5f0076f331e737bafd7Martijn Coenen con = BluetoothShare.USER_CONFIRMATION_PENDING; 26509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 26609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly filteredValues.put(BluetoothShare.USER_CONFIRMATION, con); 26709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly filteredValues.put(BluetoothShare.DIRECTION, dir); 26809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 26909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly filteredValues.put(BluetoothShare.STATUS, BluetoothShare.STATUS_PENDING); 27009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly filteredValues.put(Constants.MEDIA_SCANNED, 0); 27109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 27209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Long ts = values.getAsLong(BluetoothShare.TIMESTAMP); 27309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (ts == null) { 27409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly ts = System.currentTimeMillis(); 27509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 27609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly filteredValues.put(BluetoothShare.TIMESTAMP, ts); 27709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 27809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Context context = getContext(); 27909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly context.startService(new Intent(context, BluetoothOppService.class)); 28009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 28109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly long rowID = db.insert(DB_TABLE, null, filteredValues); 28209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 28309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Uri ret = null; 28409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 28509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (rowID != -1) { 28609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly context.startService(new Intent(context, BluetoothOppService.class)); 28709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly ret = Uri.parse(BluetoothShare.CONTENT_URI + "/" + rowID); 28809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly context.getContentResolver().notifyChange(uri, null); 28909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 290ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "couldn't insert into btopp database"); 29109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 29209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 29309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return ret; 29409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 29509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 29609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 29709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public boolean onCreate() { 29809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly mOpenHelper = new DatabaseHelper(getContext()); 29909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return true; 30009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 30109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 30209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 30309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 30409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly String sortOrder) { 30509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 30609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 30709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 30809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 30909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly int match = sURIMatcher.match(uri); 31009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly switch (match) { 31109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES: { 31209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.setTables(DB_TABLE); 31309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly break; 31409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 31509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES_ID: { 31609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.setTables(DB_TABLE); 31709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.appendWhere(BluetoothShare._ID + "="); 31809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.appendWhere(uri.getPathSegments().get(1)); 31909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly break; 32009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 32109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case LIVE_FOLDER_RECEIVED_FILES: { 32209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.setTables(DB_TABLE); 32309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.setProjectionMap(LIVE_FOLDER_PROJECTION_MAP); 32409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly qb.appendWhere(BluetoothShare.DIRECTION + "=" + BluetoothShare.DIRECTION_INBOUND 32509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly + " AND " + BluetoothShare.STATUS + "=" + BluetoothShare.STATUS_SUCCESS); 326239bc526513429995c61c4148c105725c395b1a9Jackson Fan sortOrder = "_id DESC, " + sortOrder; 32709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly break; 32809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 32909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly default: { 330ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "querying unknown URI: " + uri); 33109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw new IllegalArgumentException("Unknown URI: " + uri); 33209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 33309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 33409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 335ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (V) { 33609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly java.lang.StringBuilder sb = new java.lang.StringBuilder(); 33709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("starting query, database is "); 33809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (db != null) { 33909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("not "); 34009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 34109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("null; "); 34209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (projection == null) { 34309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("projection is null; "); 34409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else if (projection.length == 0) { 34509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("projection is empty; "); 34609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 34709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly for (int i = 0; i < projection.length; ++i) { 34809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("projection["); 34909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append(i); 35009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("] is "); 35109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append(projection[i]); 35209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("; "); 35309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 35409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 35509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("selection is "); 35609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append(selection); 35709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("; "); 35809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (selectionArgs == null) { 35909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("selectionArgs is null; "); 36009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else if (selectionArgs.length == 0) { 36109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("selectionArgs is empty; "); 36209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 36309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly for (int i = 0; i < selectionArgs.length; ++i) { 36409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("selectionArgs["); 36509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append(i); 36609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("] is "); 36709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append(selectionArgs[i]); 36809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("; "); 36909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 37009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 37109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("sort is "); 37209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append(sortOrder); 37309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly sb.append("."); 3741ac5507790a87810061a19dadec36eb328a222eaTao Liejun Log.v(TAG, sb.toString()); 37509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 37609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 37709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly Cursor ret = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder); 37809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 37909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (ret != null) { 38009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly ret.setNotificationUri(getContext().getContentResolver(), uri); 381ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (V) Log.v(TAG, "created cursor " + ret + " on behalf of ");// + 38209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 383ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "query failed in downloads database"); 38409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 38509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 38609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return ret; 38709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 38809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 38909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 39009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 39109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 39209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 39309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly int count; 39409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly long rowId = 0; 39509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 39609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly int match = sURIMatcher.match(uri); 39709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly switch (match) { 39809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES: 39909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES_ID: { 40009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly String myWhere; 40109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (selection != null) { 40209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (match == SHARES) { 40309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere = "( " + selection + " )"; 40409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 40509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere = "( " + selection + " ) AND "; 40609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 40709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 40809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere = ""; 40909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 41009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (match == SHARES_ID) { 41109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly String segment = uri.getPathSegments().get(1); 41209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly rowId = Long.parseLong(segment); 41309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere += " ( " + BluetoothShare._ID + " = " + rowId + " ) "; 41409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 41509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 41609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (values.size() > 0) { 41709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly count = db.update(DB_TABLE, values, myWhere, selectionArgs); 41809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 41909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly count = 0; 42009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 42109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly break; 42209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 42309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly default: { 424ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "updating unknown/invalid URI: " + uri); 42509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw new UnsupportedOperationException("Cannot update URI: " + uri); 42609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 42709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 42809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly getContext().getContentResolver().notifyChange(uri, null); 42909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 43009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return count; 43109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 43209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 43309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly @Override 43409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly public int delete(Uri uri, String selection, String[] selectionArgs) { 43509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 43609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly int count; 43709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly int match = sURIMatcher.match(uri); 43809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly switch (match) { 43909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES: 44009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly case SHARES_ID: { 44109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly String myWhere; 44209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (selection != null) { 44309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (match == SHARES) { 44409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere = "( " + selection + " )"; 44509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 44609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere = "( " + selection + " ) AND "; 44709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 44809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } else { 44909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere = ""; 45009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 45109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly if (match == SHARES_ID) { 45209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly String segment = uri.getPathSegments().get(1); 45309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly long rowId = Long.parseLong(segment); 45409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly myWhere += " ( " + BluetoothShare._ID + " = " + rowId + " ) "; 45509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 45609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly 45709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly count = db.delete(DB_TABLE, myWhere, selectionArgs); 45809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly break; 45909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 46009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly default: { 461ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly if (D) Log.d(TAG, "deleting unknown/invalid URI: " + uri); 46209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly throw new UnsupportedOperationException("Cannot delete URI: " + uri); 46309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 46409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 46509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly getContext().getContentResolver().notifyChange(uri, null); 46609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly return count; 46709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly } 46809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly} 469