aboutsummaryrefslogtreecommitdiff
path: root/common/src/com/android/tv/common/CommonPreferenceProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/com/android/tv/common/CommonPreferenceProvider.java')
-rw-r--r--common/src/com/android/tv/common/CommonPreferenceProvider.java215
1 files changed, 215 insertions, 0 deletions
diff --git a/common/src/com/android/tv/common/CommonPreferenceProvider.java b/common/src/com/android/tv/common/CommonPreferenceProvider.java
new file mode 100644
index 00000000..b0be3038
--- /dev/null
+++ b/common/src/com/android/tv/common/CommonPreferenceProvider.java
@@ -0,0 +1,215 @@
+/*
+ * 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();
+ }
+}