diff options
-rw-r--r-- | src/com/android/tv/MainActivity.java | 5 | ||||
-rw-r--r-- | src/com/android/tv/TimeShiftManager.java | 7 | ||||
-rw-r--r-- | src/com/android/tv/data/ChannelDataManager.java | 6 | ||||
-rw-r--r-- | src/com/android/tv/data/Program.java | 7 | ||||
-rw-r--r-- | src/com/android/tv/data/ProgramDataManager.java | 19 | ||||
-rw-r--r-- | src/com/android/tv/data/epg/EpgFetchHelper.java | 8 | ||||
-rw-r--r-- | src/com/android/tv/dvr/DvrDataManagerImpl.java | 8 | ||||
-rw-r--r-- | src/com/android/tv/dvr/provider/DvrDbSync.java | 3 | ||||
-rw-r--r-- | src/com/android/tv/dvr/provider/EpisodicProgramLoadTask.java | 2 | ||||
-rw-r--r-- | src/com/android/tv/util/AsyncDbTask.java | 54 | ||||
-rw-r--r-- | src/com/android/tv/util/TvProviderUtils.java | 33 | ||||
-rw-r--r-- | src/com/android/tv/util/Utils.java | 3 | ||||
-rw-r--r-- | tests/unit/src/com/android/tv/data/ChannelDataManagerTest.java | 25 |
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 |