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