diff options
Diffstat (limited to 'src/com/android/tv/dvr/DvrDataManagerImpl.java')
-rw-r--r-- | src/com/android/tv/dvr/DvrDataManagerImpl.java | 439 |
1 files changed, 245 insertions, 194 deletions
diff --git a/src/com/android/tv/dvr/DvrDataManagerImpl.java b/src/com/android/tv/dvr/DvrDataManagerImpl.java index 6094ca72..2b4ecbf5 100644 --- a/src/com/android/tv/dvr/DvrDataManagerImpl.java +++ b/src/com/android/tv/dvr/DvrDataManagerImpl.java @@ -38,10 +38,12 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; import android.util.Range; - -import com.android.tv.TvApplication; +import com.android.tv.TvSingletons; import com.android.tv.common.SoftPreconditions; -import com.android.tv.dvr.DvrStorageStatusManager.OnStorageMountChangedListener; +import com.android.tv.common.recording.RecordingStorageStatusManager; +import com.android.tv.common.recording.RecordingStorageStatusManager.OnStorageMountChangedListener; +import com.android.tv.common.util.Clock; +import com.android.tv.common.util.CommonUtils; import com.android.tv.dvr.data.IdGenerator; import com.android.tv.dvr.data.RecordedProgram; import com.android.tv.dvr.data.ScheduledRecording; @@ -59,12 +61,9 @@ import com.android.tv.dvr.provider.DvrDbSync; import com.android.tv.dvr.recorder.SeriesRecordingScheduler; import com.android.tv.util.AsyncDbTask; import com.android.tv.util.AsyncDbTask.AsyncRecordedProgramQueryTask; -import com.android.tv.util.Clock; import com.android.tv.util.Filter; import com.android.tv.util.TvInputManagerHelper; import com.android.tv.util.TvUriMatcher; -import com.android.tv.util.Utils; - import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -73,10 +72,9 @@ import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.Executor; -/** - * DVR Data manager to handle recordings and schedules. - */ +/** DVR Data manager to handle recordings and schedules. */ @MainThread @TargetApi(Build.VERSION_CODES.N) public class DvrDataManagerImpl extends BaseDvrDataManager { @@ -98,52 +96,54 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { private final HashMap<Long, SeriesRecording> mSeriesRecordingsForRemovedInput = new HashMap<>(); private final Context mContext; - private final ContentObserver mContentObserver = new ContentObserver(new Handler( - Looper.getMainLooper())) { - @Override - public void onChange(boolean selfChange) { - onChange(selfChange, null); - } + private Executor mDbExecutor; + private final ContentObserver mContentObserver = + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + onChange(selfChange, null); + } - @Override - public void onChange(boolean selfChange, final @Nullable Uri uri) { - RecordedProgramsQueryTask task = new RecordedProgramsQueryTask( - mContext.getContentResolver(), uri); - task.executeOnDbThread(); - mPendingTasks.add(task); - } - }; + @Override + public void onChange(boolean selfChange, final @Nullable Uri uri) { + RecordedProgramsQueryTask task = + new RecordedProgramsQueryTask(mContext.getContentResolver(), uri); + task.executeOnDbThread(); + mPendingTasks.add(task); + } + }; private boolean mDvrLoadFinished; private boolean mRecordedProgramLoadFinished; private final Set<AsyncTask> mPendingTasks = new ArraySet<>(); private DvrDbSync mDbSync; - private DvrStorageStatusManager mStorageStatusManager; + private RecordingStorageStatusManager mStorageStatusManager; - private final TvInputCallback mInputCallback = new TvInputCallback() { - @Override - public void onInputAdded(String inputId) { - if (DEBUG) Log.d(TAG, "onInputAdded " + inputId); - if (!isInputAvailable(inputId)) { - if (DEBUG) Log.d(TAG, "Not available for recording"); - return; - } - unhideInput(inputId); - } + private final TvInputCallback mInputCallback = + new TvInputCallback() { + @Override + public void onInputAdded(String inputId) { + if (DEBUG) Log.d(TAG, "onInputAdded " + inputId); + if (!isInputAvailable(inputId)) { + if (DEBUG) Log.d(TAG, "Not available for recording"); + return; + } + unhideInput(inputId); + } - @Override - public void onInputRemoved(String inputId) { - if (DEBUG) Log.d(TAG, "onInputRemoved " + inputId); - hideInput(inputId); - } - }; + @Override + public void onInputRemoved(String inputId) { + if (DEBUG) Log.d(TAG, "onInputRemoved " + inputId); + hideInput(inputId); + } + }; private final OnStorageMountChangedListener mStorageMountChangedListener = new OnStorageMountChangedListener() { @Override public void onStorageMountChanged(boolean storageMounted) { for (TvInputInfo input : mInputManager.getTvInputInfos(true, true)) { - if (Utils.isBundledInput(input.getId())) { + if (CommonUtils.isBundledInput(input.getId())) { if (storageMounted) { unhideInput(input.getId()); } else { @@ -154,8 +154,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } }; - private static <T> List<T> moveElements(HashMap<Long, T> from, HashMap<Long, T> to, - Filter<T> filter) { + private static <T> List<T> moveElements( + HashMap<Long, T> from, HashMap<Long, T> to, Filter<T> filter) { List<T> moved = new ArrayList<>(); Iterator<Entry<Long, T>> iter = from.entrySet().iterator(); while (iter.hasNext()) { @@ -172,119 +172,139 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { public DvrDataManagerImpl(Context context, Clock clock) { super(context, clock); mContext = context; - mInputManager = TvApplication.getSingletons(context).getTvInputManagerHelper(); - mStorageStatusManager = TvApplication.getSingletons(context).getDvrStorageStatusManager(); + TvSingletons tvSingletons = TvSingletons.getSingletons(context); + mInputManager = tvSingletons.getTvInputManagerHelper(); + mStorageStatusManager = tvSingletons.getRecordingStorageStatusManager(); + mDbExecutor = tvSingletons.getDbExecutor(); } public void start() { mInputManager.addCallback(mInputCallback); mStorageStatusManager.addListener(mStorageMountChangedListener); - AsyncDvrQuerySeriesRecordingTask dvrQuerySeriesRecordingTask - = new AsyncDvrQuerySeriesRecordingTask(mContext) { - @Override - protected void onCancelled(List<SeriesRecording> seriesRecordings) { - mPendingTasks.remove(this); - } + AsyncDvrQuerySeriesRecordingTask dvrQuerySeriesRecordingTask = + new AsyncDvrQuerySeriesRecordingTask(mContext) { + @Override + protected void onCancelled(List<SeriesRecording> seriesRecordings) { + mPendingTasks.remove(this); + } - @Override - protected void onPostExecute(List<SeriesRecording> seriesRecordings) { - mPendingTasks.remove(this); - long maxId = 0; - HashSet<String> seriesIds = new HashSet<>(); - for (SeriesRecording r : seriesRecordings) { - if (SoftPreconditions.checkState(!seriesIds.contains(r.getSeriesId()), TAG, - "Skip loading series recording with duplicate series ID: " + r)) { - seriesIds.add(r.getSeriesId()); - if (isInputAvailable(r.getInputId())) { - mSeriesRecordings.put(r.getId(), r); - mSeriesId2SeriesRecordings.put(r.getSeriesId(), r); - } else { - mSeriesRecordingsForRemovedInput.put(r.getId(), r); + @Override + protected void onPostExecute(List<SeriesRecording> seriesRecordings) { + mPendingTasks.remove(this); + long maxId = 0; + HashSet<String> seriesIds = new HashSet<>(); + for (SeriesRecording r : seriesRecordings) { + if (SoftPreconditions.checkState( + !seriesIds.contains(r.getSeriesId()), + TAG, + "Skip loading series recording with duplicate series ID: " + + r)) { + seriesIds.add(r.getSeriesId()); + if (isInputAvailable(r.getInputId())) { + mSeriesRecordings.put(r.getId(), r); + mSeriesId2SeriesRecordings.put(r.getSeriesId(), r); + } else { + mSeriesRecordingsForRemovedInput.put(r.getId(), r); + } + } + if (maxId < r.getId()) { + maxId = r.getId(); + } } + IdGenerator.SERIES_RECORDING.setMaxId(maxId); } - if (maxId < r.getId()) { - maxId = r.getId(); - } - } - IdGenerator.SERIES_RECORDING.setMaxId(maxId); - } - }; + }; dvrQuerySeriesRecordingTask.executeOnDbThread(); mPendingTasks.add(dvrQuerySeriesRecordingTask); - AsyncDvrQueryScheduleTask dvrQueryScheduleTask - = new AsyncDvrQueryScheduleTask(mContext) { - @Override - protected void onCancelled(List<ScheduledRecording> scheduledRecordings) { - mPendingTasks.remove(this); - } + AsyncDvrQueryScheduleTask dvrQueryScheduleTask = + new AsyncDvrQueryScheduleTask(mContext) { + @Override + protected void onCancelled(List<ScheduledRecording> scheduledRecordings) { + mPendingTasks.remove(this); + } - @SuppressLint("SwitchIntDef") - @Override - protected void onPostExecute(List<ScheduledRecording> result) { - mPendingTasks.remove(this); - long maxId = 0; - List<SeriesRecording> seriesRecordingsToAdd = new ArrayList<>(); - List<ScheduledRecording> toUpdate = new ArrayList<>(); - List<ScheduledRecording> toDelete = new ArrayList<>(); - for (ScheduledRecording r : result) { - if (!isInputAvailable(r.getInputId())) { - mScheduledRecordingsForRemovedInput.put(r.getId(), r); - } else if (r.getState() == ScheduledRecording.STATE_RECORDING_DELETED) { - getDeletedScheduleMap().put(r.getProgramId(), r); - } else { - mScheduledRecordings.put(r.getId(), r); - if (r.getProgramId() != ScheduledRecording.ID_NOT_SET) { - mProgramId2ScheduledRecordings.put(r.getProgramId(), r); - } - // Adjust the state of the schedules before DB loading is finished. - switch (r.getState()) { - case ScheduledRecording.STATE_RECORDING_IN_PROGRESS: - if (r.getEndTimeMs() <= mClock.currentTimeMillis()) { - toUpdate.add(ScheduledRecording.buildFrom(r) - .setState(ScheduledRecording.STATE_RECORDING_FAILED) - .build()); - } else { - toUpdate.add(ScheduledRecording.buildFrom(r) - .setState( - ScheduledRecording.STATE_RECORDING_NOT_STARTED) - .build()); + @SuppressLint("SwitchIntDef") + @Override + protected void onPostExecute(List<ScheduledRecording> result) { + mPendingTasks.remove(this); + long maxId = 0; + int reasonNotStarted = + ScheduledRecording + .FAILED_REASON_PROGRAM_ENDED_BEFORE_RECORDING_STARTED; + List<ScheduledRecording> toUpdate = new ArrayList<>(); + List<ScheduledRecording> toDelete = new ArrayList<>(); + for (ScheduledRecording r : result) { + if (!isInputAvailable(r.getInputId())) { + mScheduledRecordingsForRemovedInput.put(r.getId(), r); + } else if (r.getState() == ScheduledRecording.STATE_RECORDING_DELETED) { + getDeletedScheduleMap().put(r.getProgramId(), r); + } else { + mScheduledRecordings.put(r.getId(), r); + if (r.getProgramId() != ScheduledRecording.ID_NOT_SET) { + mProgramId2ScheduledRecordings.put(r.getProgramId(), r); } - break; - case ScheduledRecording.STATE_RECORDING_NOT_STARTED: - if (r.getEndTimeMs() <= mClock.currentTimeMillis()) { - toUpdate.add(ScheduledRecording.buildFrom(r) - .setState(ScheduledRecording.STATE_RECORDING_FAILED) - .build()); + // Adjust the state of the schedules before DB loading is finished. + switch (r.getState()) { + case ScheduledRecording.STATE_RECORDING_IN_PROGRESS: + if (r.getEndTimeMs() <= mClock.currentTimeMillis()) { + int reason = + ScheduledRecording.FAILED_REASON_NOT_FINISHED; + toUpdate.add( + ScheduledRecording.buildFrom(r) + .setState( + ScheduledRecording + .STATE_RECORDING_FAILED) + .setFailedReason(reason) + .build()); + } else { + toUpdate.add( + ScheduledRecording.buildFrom(r) + .setState( + ScheduledRecording + .STATE_RECORDING_NOT_STARTED) + .build()); + } + break; + case ScheduledRecording.STATE_RECORDING_NOT_STARTED: + if (r.getEndTimeMs() <= mClock.currentTimeMillis()) { + toUpdate.add( + ScheduledRecording.buildFrom(r) + .setState( + ScheduledRecording + .STATE_RECORDING_FAILED) + .setFailedReason(reasonNotStarted) + .build()); + } + break; + case ScheduledRecording.STATE_RECORDING_CANCELED: + toDelete.add(r); + break; + default: // fall out } - break; - case ScheduledRecording.STATE_RECORDING_CANCELED: - toDelete.add(r); - break; + } + if (maxId < r.getId()) { + maxId = r.getId(); + } + } + if (!toUpdate.isEmpty()) { + updateScheduledRecording(ScheduledRecording.toArray(toUpdate)); + } + if (!toDelete.isEmpty()) { + removeScheduledRecording(ScheduledRecording.toArray(toDelete)); + } + IdGenerator.SCHEDULED_RECORDING.setMaxId(maxId); + if (mRecordedProgramLoadFinished) { + validateSeriesRecordings(); + } + mDvrLoadFinished = true; + notifyDvrScheduleLoadFinished(); + if (isInitialized()) { + mDbSync = new DvrDbSync(mContext, DvrDataManagerImpl.this); + mDbSync.start(); + SeriesRecordingScheduler.getInstance(mContext).start(); } } - if (maxId < r.getId()) { - maxId = r.getId(); - } - } - if (!toUpdate.isEmpty()) { - updateScheduledRecording(ScheduledRecording.toArray(toUpdate)); - } - if (!toDelete.isEmpty()) { - removeScheduledRecording(ScheduledRecording.toArray(toDelete)); - } - IdGenerator.SCHEDULED_RECORDING.setMaxId(maxId); - if (mRecordedProgramLoadFinished) { - validateSeriesRecordings(); - } - mDvrLoadFinished = true; - notifyDvrScheduleLoadFinished(); - if (isInitialized()) { - mDbSync = new DvrDbSync(mContext, DvrDataManagerImpl.this); - mDbSync.start(); - SeriesRecordingScheduler.getInstance(mContext).start(); - } - } - }; + }; dvrQueryScheduleTask.executeOnDbThread(); mPendingTasks.add(dvrQueryScheduleTask); RecordedProgramsQueryTask mRecordedProgramQueryTask = @@ -341,8 +361,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { mRecordedProgramsForRemovedInput.clear(); notifyRecordedProgramsRemoved(RecordedProgram.toArray(oldRecordedPrograms)); } else { - HashMap<Long, RecordedProgram> oldRecordedPrograms - = new HashMap<>(mRecordedPrograms); + HashMap<Long, RecordedProgram> oldRecordedPrograms = + new HashMap<>(mRecordedPrograms); mRecordedPrograms.clear(); mRecordedProgramsForRemovedInput.clear(); List<RecordedProgram> addedRecordedPrograms = new ArrayList<>(); @@ -492,7 +512,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } @VisibleForTesting - static long getNextStartTimeAfter(List<ScheduledRecording> scheduledRecordings, long startTime) { + static long getNextStartTimeAfter( + List<ScheduledRecording> scheduledRecordings, long startTime) { int start = 0; int end = scheduledRecordings.size() - 1; while (start <= end) { @@ -503,13 +524,14 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { end = mid - 1; } } - return start < scheduledRecordings.size() ? scheduledRecordings.get(start).getStartTimeMs() + return start < scheduledRecordings.size() + ? scheduledRecordings.get(start).getStartTimeMs() : NEXT_START_TIME_NOT_FOUND; } @Override - public List<ScheduledRecording> getScheduledRecordings(Range<Long> period, - @RecordingState int state) { + public List<ScheduledRecording> getScheduledRecordings( + Range<Long> period, @RecordingState int state) { List<ScheduledRecording> result = new ArrayList<>(); for (ScheduledRecording r : mScheduledRecordings.values()) { if (r.isOverLapping(period) && r.getState() == state) { @@ -595,8 +617,11 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { r.setId(IdGenerator.SERIES_RECORDING.newId()); mSeriesRecordings.put(r.getId(), r); SeriesRecording previousSeries = mSeriesId2SeriesRecordings.put(r.getSeriesId(), r); - SoftPreconditions.checkArgument(previousSeries == null, TAG, "Attempt to add series" - + " recording with the duplicate series ID: " + r.getSeriesId()); + SoftPreconditions.checkArgument( + previousSeries == null, + TAG, + "Attempt to add series" + " recording with the duplicate series ID: %s", + r.getSeriesId()); } if (mDvrLoadFinished) { notifySeriesRecordingAdded(seriesRecordings); @@ -620,20 +645,23 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { mProgramId2ScheduledRecordings.remove(r.getProgramId()); if (r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET && (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED - || r.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) { + || r.getState() == ScheduledRecording.STATE_RECORDING_IN_PROGRESS)) { seriesRecordingIdsToCheck.add(r.getSeriesRecordingId()); } boolean isScheduleForRemovedInput = mScheduledRecordingsForRemovedInput.remove(r.getProgramId()) != null; // If it belongs to the series recording and it's not started yet, just mark delete // instead of deleting it. - if (!isScheduleForRemovedInput && !forceRemove + if (!isScheduleForRemovedInput + && !forceRemove && r.getSeriesRecordingId() != SeriesRecording.ID_NOT_SET && (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED - || r.getState() == ScheduledRecording.STATE_RECORDING_CANCELED)) { + || r.getState() == ScheduledRecording.STATE_RECORDING_CANCELED)) { SoftPreconditions.checkState(r.getProgramId() != ScheduledRecording.ID_NOT_SET); - ScheduledRecording deleted = ScheduledRecording.buildFrom(r) - .setState(ScheduledRecording.STATE_RECORDING_DELETED).build(); + ScheduledRecording deleted = + ScheduledRecording.buildFrom(r) + .setState(ScheduledRecording.STATE_RECORDING_DELETED) + .build(); getDeletedScheduleMap().put(deleted.getProgramId(), deleted); schedulesNotToDelete.add(deleted); } else { @@ -655,12 +683,12 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } } if (!schedulesToDelete.isEmpty()) { - new AsyncDeleteScheduleTask(mContext).executeOnDbThread( - ScheduledRecording.toArray(schedulesToDelete)); + new AsyncDeleteScheduleTask(mContext) + .executeOnDbThread(ScheduledRecording.toArray(schedulesToDelete)); } if (!schedulesNotToDelete.isEmpty()) { - new AsyncUpdateScheduleTask(mContext).executeOnDbThread( - ScheduledRecording.toArray(schedulesNotToDelete)); + new AsyncUpdateScheduleTask(mContext) + .executeOnDbThread(ScheduledRecording.toArray(schedulesNotToDelete)); } } @@ -680,8 +708,10 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { if (r.getState() == ScheduledRecording.STATE_RECORDING_NOT_STARTED) { toDelete.add(r); } else { - toUpdate.add(ScheduledRecording.buildFrom(r) - .setSeriesRecordingId(SeriesRecording.ID_NOT_SET).build()); + toUpdate.add( + ScheduledRecording.buildFrom(r) + .setSeriesRecordingId(SeriesRecording.ID_NOT_SET) + .build()); } } } @@ -709,7 +739,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { List<ScheduledRecording> toUpdate = new ArrayList<>(); Set<Long> seriesRecordingIdsToCheck = new HashSet<>(); for (ScheduledRecording r : schedules) { - if (!SoftPreconditions.checkState(mScheduledRecordings.containsKey(r.getId()), TAG, + if (!SoftPreconditions.checkState( + mScheduledRecordings.containsKey(r.getId()), + TAG, "Recording not found for: " + r)) { continue; } @@ -720,8 +752,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { long programId = r.getProgramId(); if (oldScheduledRecording.getProgramId() != programId && oldScheduledRecording.getProgramId() != ScheduledRecording.ID_NOT_SET) { - ScheduledRecording oldValueForProgramId = mProgramId2ScheduledRecordings - .get(oldScheduledRecording.getProgramId()); + ScheduledRecording oldValueForProgramId = + mProgramId2ScheduledRecordings.get(oldScheduledRecording.getProgramId()); if (oldValueForProgramId.getId() == r.getId()) { // Only remove the old ScheduledRecording if it has the same ID as the new one. mProgramId2ScheduledRecordings.remove(oldScheduledRecording.getProgramId()); @@ -755,14 +787,17 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { @Override public void updateSeriesRecording(final SeriesRecording... seriesRecordings) { for (SeriesRecording r : seriesRecordings) { - if (!SoftPreconditions.checkArgument(mSeriesRecordings.containsKey(r.getId()), TAG, - "Non Existing Series ID: " + r)) { + if (!SoftPreconditions.checkArgument( + mSeriesRecordings.containsKey(r.getId()), + TAG, + "Non Existing Series ID: %s", + r)) { continue; } SeriesRecording old1 = mSeriesRecordings.put(r.getId(), r); SeriesRecording old2 = mSeriesId2SeriesRecordings.put(r.getSeriesId(), r); - SoftPreconditions.checkArgument(old1.equals(old2), TAG, "Series ID cannot be" - + " updated: " + r); + SoftPreconditions.checkArgument( + old1.equals(old2), TAG, "Series ID cannot be updated: %s", r); } if (mDvrLoadFinished) { notifySeriesRecordingChanged(seriesRecordings); @@ -772,7 +807,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { private boolean isInputAvailable(String inputId) { return mInputManager.hasTvInputInfo(inputId) - && (!Utils.isBundledInput(inputId) || mStorageStatusManager.isStorageMounted()); + && (!CommonUtils.isBundledInput(inputId) + || mStorageStatusManager.isStorageMounted()); } private void removeDeletedSchedules(ScheduledRecording... addedSchedules) { @@ -784,8 +820,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } } if (!schedulesToDelete.isEmpty()) { - new AsyncDeleteScheduleTask(mContext).executeOnDbThread( - ScheduledRecording.toArray(schedulesToDelete)); + new AsyncDeleteScheduleTask(mContext) + .executeOnDbThread(ScheduledRecording.toArray(schedulesToDelete)); } } @@ -805,15 +841,17 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } } if (!schedulesToDelete.isEmpty()) { - new AsyncDeleteScheduleTask(mContext).executeOnDbThread( - ScheduledRecording.toArray(schedulesToDelete)); + new AsyncDeleteScheduleTask(mContext) + .executeOnDbThread(ScheduledRecording.toArray(schedulesToDelete)); } } private void unhideInput(String inputId) { if (DEBUG) Log.d(TAG, "unhideInput " + inputId); List<ScheduledRecording> movedSchedules = - moveElements(mScheduledRecordingsForRemovedInput, mScheduledRecordings, + moveElements( + mScheduledRecordingsForRemovedInput, + mScheduledRecordings, new Filter<ScheduledRecording>() { @Override public boolean filter(ScheduledRecording r) { @@ -821,7 +859,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } }); List<RecordedProgram> movedRecordedPrograms = - moveElements(mRecordedProgramsForRemovedInput, mRecordedPrograms, + moveElements( + mRecordedProgramsForRemovedInput, + mRecordedPrograms, new Filter<RecordedProgram>() { @Override public boolean filter(RecordedProgram r) { @@ -830,7 +870,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { }); List<SeriesRecording> removedSeriesRecordings = new ArrayList<>(); List<SeriesRecording> movedSeriesRecordings = - moveElements(mSeriesRecordingsForRemovedInput, mSeriesRecordings, + moveElements( + mSeriesRecordingsForRemovedInput, + mSeriesRecordings, new Filter<SeriesRecording>() { @Override public boolean filter(SeriesRecording r) { @@ -856,8 +898,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { for (SeriesRecording r : removedSeriesRecordings) { mSeriesRecordingsForRemovedInput.remove(r.getId()); } - new AsyncDeleteSeriesRecordingTask(mContext).executeOnDbThread( - SeriesRecording.toArray(removedSeriesRecordings)); + new AsyncDeleteSeriesRecordingTask(mContext) + .executeOnDbThread(SeriesRecording.toArray(removedSeriesRecordings)); // Notify after all the data are moved. if (!movedSchedules.isEmpty()) { notifyScheduledRecordingAdded(ScheduledRecording.toArray(movedSchedules)); @@ -873,7 +915,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { private void hideInput(String inputId) { if (DEBUG) Log.d(TAG, "hideInput " + inputId); List<ScheduledRecording> movedSchedules = - moveElements(mScheduledRecordings, mScheduledRecordingsForRemovedInput, + moveElements( + mScheduledRecordings, + mScheduledRecordingsForRemovedInput, new Filter<ScheduledRecording>() { @Override public boolean filter(ScheduledRecording r) { @@ -881,7 +925,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } }); List<SeriesRecording> movedSeriesRecordings = - moveElements(mSeriesRecordings, mSeriesRecordingsForRemovedInput, + moveElements( + mSeriesRecordings, + mSeriesRecordingsForRemovedInput, new Filter<SeriesRecording>() { @Override public boolean filter(SeriesRecording r) { @@ -889,7 +935,9 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } }); List<RecordedProgram> movedRecordedPrograms = - moveElements(mRecordedPrograms, mRecordedProgramsForRemovedInput, + moveElements( + mRecordedPrograms, + mRecordedProgramsForRemovedInput, new Filter<RecordedProgram>() { @Override public boolean filter(RecordedProgram r) { @@ -931,7 +979,8 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { public void forgetStorage(String inputId) { List<ScheduledRecording> schedulesToDelete = new ArrayList<>(); for (Iterator<ScheduledRecording> i = - mScheduledRecordingsForRemovedInput.values().iterator(); i.hasNext(); ) { + mScheduledRecordingsForRemovedInput.values().iterator(); + i.hasNext(); ) { ScheduledRecording r = i.next(); if (inputId.equals(r.getInputId())) { schedulesToDelete.add(r); @@ -939,32 +988,34 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { } } List<SeriesRecording> seriesRecordingsToDelete = new ArrayList<>(); - for (Iterator<SeriesRecording> i = - mSeriesRecordingsForRemovedInput.values().iterator(); i.hasNext(); ) { + for (Iterator<SeriesRecording> i = mSeriesRecordingsForRemovedInput.values().iterator(); + i.hasNext(); ) { SeriesRecording r = i.next(); if (inputId.equals(r.getInputId())) { seriesRecordingsToDelete.add(r); i.remove(); } } - for (Iterator<RecordedProgram> i = - mRecordedProgramsForRemovedInput.values().iterator(); i.hasNext(); ) { + for (Iterator<RecordedProgram> i = mRecordedProgramsForRemovedInput.values().iterator(); + i.hasNext(); ) { if (inputId.equals(i.next().getInputId())) { i.remove(); } } - new AsyncDeleteScheduleTask(mContext).executeOnDbThread( - ScheduledRecording.toArray(schedulesToDelete)); - new AsyncDeleteSeriesRecordingTask(mContext).executeOnDbThread( - SeriesRecording.toArray(seriesRecordingsToDelete)); - new AsyncDbTask<Void, Void, Void>() { + new AsyncDeleteScheduleTask(mContext) + .executeOnDbThread(ScheduledRecording.toArray(schedulesToDelete)); + new AsyncDeleteSeriesRecordingTask(mContext) + .executeOnDbThread(SeriesRecording.toArray(seriesRecordingsToDelete)); + new AsyncDbTask<Void, Void, Void>(mDbExecutor) { @Override protected Void doInBackground(Void... params) { ContentResolver resolver = mContext.getContentResolver(); - String args[] = { inputId }; + String[] args = {inputId}; try { - resolver.delete(RecordedPrograms.CONTENT_URI, - RecordedPrograms.COLUMN_INPUT_ID + " = ?", args); + resolver.delete( + RecordedPrograms.CONTENT_URI, + RecordedPrograms.COLUMN_INPUT_ID + " = ?", + args); } catch (SQLiteException e) { Log.e(TAG, "Failed to delete recorded programs for inputId: " + inputId, e); } @@ -996,7 +1047,7 @@ public class DvrDataManagerImpl extends BaseDvrDataManager { private final Uri mUri; public RecordedProgramsQueryTask(ContentResolver contentResolver, Uri uri) { - super(contentResolver, uri == null ? RecordedPrograms.CONTENT_URI : uri); + super(mDbExecutor, contentResolver, uri == null ? RecordedPrograms.CONTENT_URI : uri); mUri = uri; } |