aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/com/android/tv/MainActivity.java5
-rw-r--r--src/com/android/tv/TimeShiftManager.java7
-rw-r--r--src/com/android/tv/data/ChannelDataManager.java6
-rw-r--r--src/com/android/tv/data/Program.java7
-rw-r--r--src/com/android/tv/data/ProgramDataManager.java19
-rw-r--r--src/com/android/tv/data/epg/EpgFetchHelper.java8
-rw-r--r--src/com/android/tv/dvr/DvrDataManagerImpl.java8
-rw-r--r--src/com/android/tv/dvr/provider/DvrDbSync.java3
-rw-r--r--src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java2
-rw-r--r--src/com/android/tv/util/AsyncDbTask.java54
-rw-r--r--src/com/android/tv/util/TvProviderUtils.java33
-rw-r--r--src/com/android/tv/util/Utils.java3
-rw-r--r--tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java25
13 files changed, 104 insertions, 76 deletions
diff --git a/src/com/android/tv/MainActivity.java b/src/com/android/tv/MainActivity.java
index 8ce67a6c..2c9f778c 100644
--- a/src/com/android/tv/MainActivity.java
+++ b/src/com/android/tv/MainActivity.java
@@ -22,7 +22,6 @@ import android.app.SearchManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
@@ -1497,7 +1496,6 @@ public class MainActivity extends Activity
if (programUriFromIntent != null && channelIdFromIntent != Channel.INVALID_ID) {
new AsyncQueryProgramTask(
TvSingletons.getSingletons(this).getDbExecutor(),
- getContentResolver(),
programUriFromIntent,
Program.PROJECTION,
null,
@@ -1564,14 +1562,13 @@ public class MainActivity extends Activity
public AsyncQueryProgramTask(
Executor executor,
- ContentResolver contentResolver,
Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String orderBy,
long channelId) {
- super(executor, contentResolver, uri, projection, selection, selectionArgs, orderBy);
+ super(executor, MainActivity.this, uri, projection, selection, selectionArgs, orderBy);
mChannelIdFromIntent = channelId;
}
diff --git a/src/com/android/tv/TimeShiftManager.java b/src/com/android/tv/TimeShiftManager.java
index bb3574d7..54ffe0ed 100644
--- a/src/com/android/tv/TimeShiftManager.java
+++ b/src/com/android/tv/TimeShiftManager.java
@@ -17,7 +17,6 @@
package com.android.tv;
import android.annotation.SuppressLint;
-import android.content.ContentResolver;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
@@ -978,7 +977,7 @@ public class TimeShiftManager {
}
if (mChannel != null) {
mProgramLoadTask =
- new LoadProgramsForCurrentChannelTask(mContext.getContentResolver(), next);
+ new LoadProgramsForCurrentChannelTask(next);
mProgramLoadTask.executeOnDbThread();
}
}
@@ -1225,10 +1224,10 @@ public class TimeShiftManager {
private class LoadProgramsForCurrentChannelTask
extends AsyncDbTask.LoadProgramsForChannelTask {
- LoadProgramsForCurrentChannelTask(ContentResolver contentResolver, Range<Long> period) {
+ LoadProgramsForCurrentChannelTask(Range<Long> period) {
super(
TvSingletons.getSingletons(mContext).getDbExecutor(),
- contentResolver,
+ mContext,
mChannel.getId(),
period);
}
diff --git a/src/com/android/tv/data/ChannelDataManager.java b/src/com/android/tv/data/ChannelDataManager.java
index 1dfcf125..862d671d 100644
--- a/src/com/android/tv/data/ChannelDataManager.java
+++ b/src/com/android/tv/data/ChannelDataManager.java
@@ -515,7 +515,7 @@ public class ChannelDataManager {
if (mChannelsUpdateTask != null) {
mChannelsUpdateTask.cancel(true);
}
- mChannelsUpdateTask = new QueryAllChannelsTask(mContentResolver);
+ mChannelsUpdateTask = new QueryAllChannelsTask();
mChannelsUpdateTask.executeOnDbThread();
}
@@ -616,8 +616,8 @@ public class ChannelDataManager {
private final class QueryAllChannelsTask extends AsyncDbTask.AsyncChannelQueryTask {
- QueryAllChannelsTask(ContentResolver contentResolver) {
- super(mDbExecutor, contentResolver);
+ QueryAllChannelsTask() {
+ super(mDbExecutor, mContext);
}
@Override
diff --git a/src/com/android/tv/data/Program.java b/src/com/android/tv/data/Program.java
index cdc8079b..0f0bbece 100644
--- a/src/com/android/tv/data/Program.java
+++ b/src/com/android/tv/data/Program.java
@@ -17,7 +17,6 @@
package com.android.tv.data;
import android.annotation.SuppressLint;
-import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
@@ -34,7 +33,6 @@ import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import android.util.Log;
-
import com.android.tv.common.BuildConfig;
import com.android.tv.common.TvContentRatingCache;
import com.android.tv.common.util.CollectionUtils;
@@ -43,7 +41,6 @@ import com.android.tv.data.api.Channel;
import com.android.tv.util.TvProviderUtils;
import com.android.tv.util.Utils;
import com.android.tv.util.images.ImageLoader;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -484,7 +481,7 @@ public final class Program extends BaseProgram implements Comparable<Program>, P
@SuppressLint("InlinedApi")
@SuppressWarnings("deprecation")
@WorkerThread
- public static ContentValues toContentValues(Program program, ContentResolver resolver) {
+ public static ContentValues toContentValues(Program program, Context context) {
ContentValues values = new ContentValues();
values.put(TvContract.Programs.COLUMN_CHANNEL_ID, program.getChannelId());
if (!TextUtils.isEmpty(program.getPackageName())) {
@@ -505,7 +502,7 @@ public final class Program extends BaseProgram implements Comparable<Program>, P
putValue(values, TvContract.Programs.COLUMN_SEASON_NUMBER, program.getSeasonNumber());
putValue(values, TvContract.Programs.COLUMN_EPISODE_NUMBER, program.getEpisodeNumber());
}
- if (TvProviderUtils.updateDbColumnsIfNeeded(resolver)) {
+ if (TvProviderUtils.updateDbColumnsIfNeeded(context)) {
putValue(values, COLUMN_SERIES_ID, program.getSeriesId());
}
diff --git a/src/com/android/tv/data/ProgramDataManager.java b/src/com/android/tv/data/ProgramDataManager.java
index fbaf530e..a6f54b4a 100644
--- a/src/com/android/tv/data/ProgramDataManager.java
+++ b/src/com/android/tv/data/ProgramDataManager.java
@@ -91,6 +91,7 @@ public class ProgramDataManager implements MemoryManageable {
private static final int MSG_UPDATE_ONE_CURRENT_PROGRAM = 1001;
private static final int MSG_UPDATE_PREFETCH_PROGRAM = 1002;
+ private final Context mContext;
private final Clock mClock;
private final ContentResolver mContentResolver;
private final Executor mDbExecutor;
@@ -126,6 +127,7 @@ public class ProgramDataManager implements MemoryManageable {
@MainThread
public ProgramDataManager(Context context) {
this(
+ context,
TvSingletons.getSingletons(context).getDbExecutor(),
context.getContentResolver(),
Clock.SYSTEM,
@@ -135,11 +137,13 @@ public class ProgramDataManager implements MemoryManageable {
@VisibleForTesting
ProgramDataManager(
+ Context context,
Executor executor,
ContentResolver contentResolver,
Clock time,
Looper looper,
RemoteConfig remoteConfig) {
+ mContext = context;
mDbExecutor = executor;
mClock = time;
mContentResolver = contentResolver;
@@ -452,7 +456,7 @@ public class ProgramDataManager implements MemoryManageable {
}
clearTask(mProgramUpdateTaskMap);
mHandler.removeMessages(MSG_UPDATE_ONE_CURRENT_PROGRAM);
- mProgramsUpdateTask = new ProgramsUpdateTask(mContentResolver, mClock.currentTimeMillis());
+ mProgramsUpdateTask = new ProgramsUpdateTask(mClock.currentTimeMillis());
mProgramsUpdateTask.executeOnDbThread();
}
@@ -500,7 +504,7 @@ public class ProgramDataManager implements MemoryManageable {
programMap.clear();
String[] projection = Program.PROJECTION;
- if (TvProviderUtils.updateDbColumnsIfNeeded(mContentResolver)) {
+ if (TvProviderUtils.updateDbColumnsIfNeeded(mContext)) {
if (Utils.isProgramsUri(uri)) {
projection = TvProviderUtils.addExtraColumnsToProjection(projection);
}
@@ -586,10 +590,10 @@ public class ProgramDataManager implements MemoryManageable {
}
private class ProgramsUpdateTask extends AsyncDbTask.AsyncQueryTask<List<Program>> {
- public ProgramsUpdateTask(ContentResolver contentResolver, long time) {
+ public ProgramsUpdateTask(long time) {
super(
mDbExecutor,
- contentResolver,
+ mContext,
Programs.CONTENT_URI
.buildUpon()
.appendQueryParameter(PARAM_START_TIME, String.valueOf(time))
@@ -653,11 +657,10 @@ public class ProgramDataManager implements MemoryManageable {
private class UpdateCurrentProgramForChannelTask extends AsyncDbTask.AsyncQueryTask<Program> {
private final long mChannelId;
- private UpdateCurrentProgramForChannelTask(
- ContentResolver contentResolver, long channelId, long time) {
+ private UpdateCurrentProgramForChannelTask(long channelId, long time) {
super(
mDbExecutor,
- contentResolver,
+ mContext,
TvContract.buildProgramsUriForChannel(channelId, time, time),
Program.PROJECTION,
null,
@@ -703,7 +706,7 @@ public class ProgramDataManager implements MemoryManageable {
}
UpdateCurrentProgramForChannelTask task =
new UpdateCurrentProgramForChannelTask(
- mContentResolver, channelId, mClock.currentTimeMillis());
+ channelId, mClock.currentTimeMillis());
mProgramUpdateTaskMap.put(channelId, task);
task.executeOnDbThread();
break;
diff --git a/src/com/android/tv/data/epg/EpgFetchHelper.java b/src/com/android/tv/data/epg/EpgFetchHelper.java
index 794f0d96..c3b8f966 100644
--- a/src/com/android/tv/data/epg/EpgFetchHelper.java
+++ b/src/com/android/tv/data/epg/EpgFetchHelper.java
@@ -27,12 +27,10 @@ import android.preference.PreferenceManager;
import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import android.util.Log;
-
import com.android.tv.common.CommonConstants;
import com.android.tv.common.util.Clock;
import com.android.tv.data.Program;
import com.android.tv.util.TvProviderUtils;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -106,7 +104,7 @@ class EpgFetchHelper {
TvContract.buildProgramUri(oldProgram.getId()))
.withValues(Program.toContentValues(
newProgram,
- context.getContentResolver()))
+ context))
.build());
oldProgramsIndex++;
newProgramsIndex++;
@@ -134,7 +132,7 @@ class EpgFetchHelper {
ContentProviderOperation.newInsert(Programs.CONTENT_URI)
.withValues(Program.toContentValues(
newProgram,
- context.getContentResolver()))
+ context))
.build());
}
// Throttle the batch operation not to cause TransactionTooLargeException.
@@ -166,7 +164,7 @@ class EpgFetchHelper {
private static List<Program> queryPrograms(
Context context, long channelId, long startTimeMs, long endTimeMs) {
String[] projection = Program.PROJECTION;
- if (TvProviderUtils.updateDbColumnsIfNeeded(context.getContentResolver())) {
+ if (TvProviderUtils.updateDbColumnsIfNeeded(context)) {
projection = TvProviderUtils.addExtraColumnsToProjection(projection);
}
try (Cursor c =
diff --git a/src/com/android/tv/dvr/DvrDataManagerImpl.java b/src/com/android/tv/dvr/DvrDataManagerImpl.java
index 2b4ecbf5..376a7390 100644
--- a/src/com/android/tv/dvr/DvrDataManagerImpl.java
+++ b/src/com/android/tv/dvr/DvrDataManagerImpl.java
@@ -107,7 +107,7 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
@Override
public void onChange(boolean selfChange, final @Nullable Uri uri) {
RecordedProgramsQueryTask task =
- new RecordedProgramsQueryTask(mContext.getContentResolver(), uri);
+ new RecordedProgramsQueryTask(uri);
task.executeOnDbThread();
mPendingTasks.add(task);
}
@@ -308,7 +308,7 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
dvrQueryScheduleTask.executeOnDbThread();
mPendingTasks.add(dvrQueryScheduleTask);
RecordedProgramsQueryTask mRecordedProgramQueryTask =
- new RecordedProgramsQueryTask(mContext.getContentResolver(), null);
+ new RecordedProgramsQueryTask(null);
mRecordedProgramQueryTask.executeOnDbThread();
ContentResolver cr = mContext.getContentResolver();
cr.registerContentObserver(RecordedPrograms.CONTENT_URI, true, mContentObserver);
@@ -1046,8 +1046,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager {
private final class RecordedProgramsQueryTask extends AsyncRecordedProgramQueryTask {
private final Uri mUri;
- public RecordedProgramsQueryTask(ContentResolver contentResolver, Uri uri) {
- super(mDbExecutor, contentResolver, uri == null ? RecordedPrograms.CONTENT_URI : uri);
+ public RecordedProgramsQueryTask(Uri uri) {
+ super(mDbExecutor, mContext, uri == null ? RecordedPrograms.CONTENT_URI : uri);
mUri = uri;
}
diff --git a/src/com/android/tv/dvr/provider/DvrDbSync.java b/src/com/android/tv/dvr/provider/DvrDbSync.java
index 42bc8bcc..7658ca45 100644
--- a/src/com/android/tv/dvr/provider/DvrDbSync.java
+++ b/src/com/android/tv/dvr/provider/DvrDbSync.java
@@ -277,7 +277,6 @@ public class DvrDbSync {
}
}
} else {
- long currentTimeMs = System.currentTimeMillis();
ScheduledRecording.Builder builder =
ScheduledRecording.buildFrom(schedule)
.setEndTimeMs(program.getEndTimeUtcMillis())
@@ -361,7 +360,7 @@ public class DvrDbSync {
private final long mProgramId;
QueryProgramTask(long programId) {
- super(mDbExecutor, mContext.getContentResolver(), programId);
+ super(mDbExecutor, mContext, programId);
mProgramId = programId;
}
diff --git a/src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java b/src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java
index b7d9f3b3..cd8adca0 100644
--- a/src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java
+++ b/src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java
@@ -186,7 +186,7 @@ public abstract class EpisodicProgramLoadTask {
SqlParams sqlParams = createSqlParams();
return new AsyncProgramQueryTask(
TvSingletons.getSingletons(mContext).getDbExecutor(),
- mContext.getContentResolver(),
+ mContext,
sqlParams.uri,
sqlParams.selection,
sqlParams.selectionArgs,
diff --git a/src/com/android/tv/util/AsyncDbTask.java b/src/com/android/tv/util/AsyncDbTask.java
index aafd8a5a..9f909450 100644
--- a/src/com/android/tv/util/AsyncDbTask.java
+++ b/src/com/android/tv/util/AsyncDbTask.java
@@ -17,6 +17,7 @@
package com.android.tv.util;
import android.content.ContentResolver;
+import android.content.Context;
import android.database.Cursor;
import android.media.tv.TvContract;
import android.media.tv.TvContract.Programs;
@@ -27,7 +28,6 @@ import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
import android.util.Log;
import android.util.Range;
-
import com.android.tv.TvSingletons;
import com.android.tv.common.BuildConfig;
import com.android.tv.common.SoftPreconditions;
@@ -35,7 +35,7 @@ import com.android.tv.data.ChannelImpl;
import com.android.tv.data.Program;
import com.android.tv.data.api.Channel;
import com.android.tv.dvr.data.RecordedProgram;
-
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
@@ -69,7 +69,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
* @param <Result> the type of result returned by {@link #onQuery(Cursor)}
*/
public abstract static class AsyncQueryTask<Result> extends AsyncDbTask<Void, Void, Result> {
- private final ContentResolver mContentResolver;
+ private final WeakReference<Context> mContextReference;
private final Uri mUri;
private final String mSelection;
private final String[] mSelectionArgs;
@@ -78,14 +78,14 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public AsyncQueryTask(
Executor executor,
- ContentResolver contentResolver,
+ Context context,
Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String orderBy) {
super(executor);
- mContentResolver = contentResolver;
+ mContextReference = new WeakReference<>(context);
mUri = uri;
mProjection = projection;
mSelection = selection;
@@ -112,7 +112,11 @@ public abstract class AsyncDbTask<Params, Progress, Result>
// This is guaranteed to never call onPostExecute because the task is canceled.
return null;
}
- if (TvProviderUtils.updateDbColumnsIfNeeded(mContentResolver)) {
+ Context context = mContextReference.get();
+ if (context == null) {
+ return null;
+ }
+ if (TvProviderUtils.updateDbColumnsIfNeeded(context)) {
if (Utils.isProgramsUri(mUri)) {
mProjection = TvProviderUtils.addExtraColumnsToProjection(mProjection);
}
@@ -121,7 +125,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
Log.v(TAG, "Starting query for " + this);
}
try (Cursor c =
- mContentResolver.query(
+ context.getContentResolver().query(
mUri, mProjection, mSelection, mSelectionArgs, mOrderBy)) {
if (c != null && !isCancelled()) {
Result result = onQuery(c);
@@ -171,7 +175,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public AsyncQueryListTask(
Executor executor,
- ContentResolver contentResolver,
+ Context context,
Uri uri,
String[] projection,
String selection,
@@ -179,7 +183,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
String orderBy) {
this(
executor,
- contentResolver,
+ context,
uri,
projection,
selection,
@@ -190,14 +194,14 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public AsyncQueryListTask(
Executor executor,
- ContentResolver contentResolver,
+ Context context,
Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String orderBy,
CursorFilter filter) {
- super(executor, contentResolver, uri, projection, selection, selectionArgs, orderBy);
+ super(executor, context, uri, projection, selection, selectionArgs, orderBy);
mFilter = filter;
}
@@ -244,13 +248,13 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public AsyncQueryItemTask(
Executor executor,
- ContentResolver contentResolver,
+ Context context,
Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String orderBy) {
- super(executor, contentResolver, uri, projection, selection, selectionArgs, orderBy);
+ super(executor, context, uri, projection, selection, selectionArgs, orderBy);
}
@Override
@@ -290,10 +294,10 @@ public abstract class AsyncDbTask<Params, Progress, Result>
/** Gets an {@link List} of {@link Channel}s from {@link TvContract.Channels#CONTENT_URI}. */
public abstract static class AsyncChannelQueryTask extends AsyncQueryListTask<Channel> {
- public AsyncChannelQueryTask(Executor executor, ContentResolver contentResolver) {
+ public AsyncChannelQueryTask(Executor executor, Context context) {
super(
executor,
- contentResolver,
+ context,
TvContract.Channels.CONTENT_URI,
ChannelImpl.PROJECTION,
null,
@@ -309,10 +313,10 @@ public abstract class AsyncDbTask<Params, Progress, Result>
/** Gets an {@link List} of {@link Program}s from {@link TvContract.Programs#CONTENT_URI}. */
public abstract static class AsyncProgramQueryTask extends AsyncQueryListTask<Program> {
- public AsyncProgramQueryTask(Executor executor, ContentResolver contentResolver) {
+ public AsyncProgramQueryTask(Executor executor, Context context) {
super(
executor,
- contentResolver,
+ context,
Programs.CONTENT_URI,
Program.PROJECTION,
null,
@@ -322,7 +326,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public AsyncProgramQueryTask(
Executor executor,
- ContentResolver contentResolver,
+ Context context,
Uri uri,
String selection,
String[] selectionArgs,
@@ -330,7 +334,7 @@ public abstract class AsyncDbTask<Params, Progress, Result>
CursorFilter filter) {
super(
executor,
- contentResolver,
+ context,
uri,
Program.PROJECTION,
selection,
@@ -349,8 +353,8 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public abstract static class AsyncRecordedProgramQueryTask
extends AsyncQueryListTask<RecordedProgram> {
public AsyncRecordedProgramQueryTask(
- Executor executor, ContentResolver contentResolver, Uri uri) {
- super(executor, contentResolver, uri, RecordedProgram.PROJECTION, null, null, null);
+ Executor executor, Context context, Uri uri) {
+ super(executor, context, uri, RecordedProgram.PROJECTION, null, null, null);
}
@Override
@@ -378,12 +382,12 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public LoadProgramsForChannelTask(
Executor executor,
- ContentResolver contentResolver,
+ Context context,
long channelId,
@Nullable Range<Long> period) {
super(
executor,
- contentResolver,
+ context,
period == null
? TvContract.buildProgramsUriForChannel(channelId)
: TvContract.buildProgramsUriForChannel(
@@ -409,10 +413,10 @@ public abstract class AsyncDbTask<Params, Progress, Result>
public static class AsyncQueryProgramTask extends AsyncQueryItemTask<Program> {
public AsyncQueryProgramTask(
- Executor executor, ContentResolver contentResolver, long programId) {
+ Executor executor, Context context, long programId) {
super(
executor,
- contentResolver,
+ context,
TvContract.buildProgramUri(programId),
Program.PROJECTION,
null,
diff --git a/src/com/android/tv/util/TvProviderUtils.java b/src/com/android/tv/util/TvProviderUtils.java
index ea57cd19..37e6eb5d 100644
--- a/src/com/android/tv/util/TvProviderUtils.java
+++ b/src/com/android/tv/util/TvProviderUtils.java
@@ -16,13 +16,12 @@
package com.android.tv.util;
-import android.content.ContentResolver;
+import android.content.Context;
import android.os.Build;
+import android.preference.PreferenceManager;
import android.support.annotation.RequiresApi;
import android.support.annotation.WorkerThread;
-
import com.android.tv.data.Program;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -35,8 +34,10 @@ public class TvProviderUtils {
private static final int VERSION = 1;
public static final String EXTRA_PROGRAM_COLUMN = Program.COLUMN_SERIES_ID;
+ public static final String PREF_KEY_TV_PROVIDER_DB_CUSTOMIZATION_VERSION_CODE =
+ "tv_provider_db_customization.version_code";
- private static boolean sIsLatestVersion;
+ private static Boolean sIsLatestVersion;
/**
* Updates database columns if necessary.
@@ -45,10 +46,16 @@ public class TvProviderUtils {
* otherwise.
*/
@WorkerThread
- public static boolean updateDbColumnsIfNeeded(ContentResolver contentResolver) {
+ public static synchronized boolean updateDbColumnsIfNeeded(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return false;
}
+ if (sIsLatestVersion == null) {
+ int version =
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .getInt(PREF_KEY_TV_PROVIDER_DB_CUSTOMIZATION_VERSION_CODE, 0);
+ setIsLatestVersion(version == VERSION);
+ }
if (sIsLatestVersion) {
return true;
}
@@ -56,6 +63,15 @@ public class TvProviderUtils {
return false;
}
+ public static synchronized boolean isLatestVersion() {
+ return Boolean.TRUE.equals(sIsLatestVersion)
+ && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
+ }
+
+ private static synchronized void setIsLatestVersion(boolean isLatestVersion) {
+ sIsLatestVersion = isLatestVersion;
+ }
+
public static String[] addExtraColumnsToProjection(String[] projection) {
List<String> projectionList = new ArrayList<>(Arrays.asList(projection));
if (!projectionList.contains(EXTRA_PROGRAM_COLUMN)) {
@@ -64,11 +80,4 @@ public class TvProviderUtils {
projection = projectionList.toArray(projection);
return projection;
}
- public static synchronized boolean isLatestVersion() {
- return sIsLatestVersion && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
- }
-
- private static synchronized void onUpgraded() {
- sIsLatestVersion = true;
- }
}
diff --git a/src/com/android/tv/util/Utils.java b/src/com/android/tv/util/Utils.java
index b36a63a2..3d3d81b5 100644
--- a/src/com/android/tv/util/Utils.java
+++ b/src/com/android/tv/util/Utils.java
@@ -328,7 +328,7 @@ public class Utils {
ContentResolver resolver = context.getContentResolver();
String[] projection = Program.PROJECTION;
- if (TvProviderUtils.updateDbColumnsIfNeeded(context.getContentResolver())) {
+ if (TvProviderUtils.updateDbColumnsIfNeeded(context)) {
if (Utils.isProgramsUri(uri)) {
projection = TvProviderUtils.addExtraColumnsToProjection(projection);
}
@@ -716,7 +716,6 @@ public class Utils {
if (fullFormat) {
return new Date(timeMillis).toString();
} else {
- long currentTime = System.currentTimeMillis();
return (String)
DateUtils.formatSameDayTime(
timeMillis,
diff --git a/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java b/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java
index 96c1f7a1..7ce96103 100644
--- a/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java
+++ b/tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java
@@ -25,12 +25,14 @@ import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
+import android.content.res.AssetFileDescriptor;
import android.database.ContentObserver;
import android.database.Cursor;
import android.media.tv.TvContract;
import android.media.tv.TvContract.Channels;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Bundle;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.test.MoreAsserts;
@@ -44,6 +46,7 @@ import com.android.tv.data.api.Channel;
import com.android.tv.testing.constants.Constants;
import com.android.tv.testing.data.ChannelInfo;
import com.android.tv.util.TvInputManagerHelper;
+import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -98,9 +101,20 @@ public class ChannelDataManagerTest {
Mockito.mock(TvInputManagerHelper.class);
Mockito.when(mockHelper.hasTvInputInfo(Matchers.anyString()))
.thenReturn(true);
+ Context mockContext = Mockito.mock(Context.class);
+ Mockito.when(mockContext.getContentResolver())
+ .thenReturn(mContentResolver);
+ Mockito.when(mockContext.checkSelfPermission(Matchers.anyString()))
+ .thenAnswer(
+ invocation -> {
+ Object[] args = invocation.getArguments();
+ return getTargetContext()
+ .checkSelfPermission(((String) args[0]));
+ });
+
mChannelDataManager =
new ChannelDataManager(
- getTargetContext(),
+ mockContext,
mockHelper,
AsyncTask.SERIAL_EXECUTOR,
mContentResolver);
@@ -417,6 +431,15 @@ public class ChannelDataManagerTest {
}
}
+ @Override
+ public AssetFileDescriptor openTypedAssetFile(Uri url, String mimeType, Bundle opts) {
+ try {
+ return getTargetContext().getContentResolver().openAssetFileDescriptor(url, "r");
+ } catch (FileNotFoundException e) {
+ return null;
+ }
+ }
+
/**
* Implementation of {@link ContentProvider#query}. This assumes that {@link
* ChannelDataManager} queries channels with empty {@code selection}. (i.e. channels are