blob: b0be3038beb316f4c66e3b68284c950062c4ad26 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tv.common;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
/**
* A content provider for storing common preferences. It's used across TV app and tuner TV inputs.
*/
public class CommonPreferenceProvider extends ContentProvider {
/** The authority of the provider */
public static final String AUTHORITY = CommonConstants.BASE_PACKAGE + ".common.preferences";
private static final String PATH_PREFERENCES = "preferences";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "usbtuner_preferences.db";
private static final String PREFERENCES_TABLE = "preferences";
private static final int MATCH_PREFERENCE = 1;
private static final int MATCH_PREFERENCE_KEY = 2;
private static final UriMatcher sUriMatcher;
private DatabaseOpenHelper mDatabaseOpenHelper;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(AUTHORITY, "preferences", MATCH_PREFERENCE);
sUriMatcher.addURI(AUTHORITY, "preferences/*", MATCH_PREFERENCE_KEY);
}
/**
* Builds a Uri that points to a specific preference.
*
* @param key a key of the preference to point to
*/
public static Uri buildPreferenceUri(String key) {
return Preferences.CONTENT_URI.buildUpon().appendPath(key).build();
}
/** Columns definitions for the preferences table. */
public interface Preferences {
/** The content:// style for the preferences table. */
Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + PATH_PREFERENCES);
/** The MIME type of a directory of preferences. */
String CONTENT_TYPE = "vnd.android.cursor.dir/preferences";
/** The MIME type of a single preference. */
String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/preferences";
/**
* The ID of this preference.
*
* <p>This is auto-incremented.
*
* <p>Type: INTEGER
*/
String _ID = "_id";
/**
* The key of this preference.
*
* <p>Should be unique.
*
* <p>Type: TEXT
*/
String COLUMN_KEY = "key";
/**
* The value of this preference.
*
* <p>Type: TEXT
*/
String COLUMN_VALUE = "value";
}
private static class DatabaseOpenHelper extends SQLiteOpenHelper {
public DatabaseOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"CREATE TABLE "
+ PREFERENCES_TABLE
+ " ("
+ Preferences._ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ Preferences.COLUMN_KEY
+ " TEXT NOT NULL,"
+ Preferences.COLUMN_VALUE
+ " TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// No-op
}
}
@Override
public boolean onCreate() {
mDatabaseOpenHelper = new DatabaseOpenHelper(getContext());
return true;
}
@Override
public Cursor query(
Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String sortOrder) {
int match = sUriMatcher.match(uri);
if (match != MATCH_PREFERENCE && match != MATCH_PREFERENCE_KEY) {
throw new UnsupportedOperationException();
}
SQLiteDatabase db = mDatabaseOpenHelper.getReadableDatabase();
Cursor cursor =
db.query(
PREFERENCES_TABLE,
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case MATCH_PREFERENCE:
return Preferences.CONTENT_TYPE;
case MATCH_PREFERENCE_KEY:
return Preferences.CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
/**
* Inserts a preference row into the preference table.
*
* <p>If a key is already exists in the table, it removes the old row and inserts a new row.
*
* @param uri the URL of the table to insert into
* @param values the initial values for the newly inserted row
* @return the URL of the newly created row
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
if (sUriMatcher.match(uri) != MATCH_PREFERENCE) {
throw new UnsupportedOperationException();
}
return insertRow(uri, values);
}
private Uri insertRow(Uri uri, ContentValues values) {
SQLiteDatabase db = mDatabaseOpenHelper.getWritableDatabase();
// Remove the old row.
db.delete(
PREFERENCES_TABLE,
Preferences.COLUMN_KEY + " like ?",
new String[] {values.getAsString(Preferences.COLUMN_KEY)});
long rowId = db.insert(PREFERENCES_TABLE, null, values);
if (rowId > 0) {
Uri rowUri = buildPreferenceUri(values.getAsString(Preferences.COLUMN_KEY));
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
throw new SQLiteException("Failed to insert row into " + uri);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
}