package com.bitmovin.bitcodin.Job; import com.bitmovin.bitcodin.Settings; import com.bitmovin.bitcodin.Thumbnail.ThumbnailLoader; import com.bitmovin.bitcodin.Thumbnail.ThumbnailManager; import com.bitmovin.bitcodin.api.BitcodinApi; import com.bitmovin.bitcodin.api.job.JobDetails; import com.bitmovin.bitcodin.api.job.JobList; import com.bitmovin.bitcodin.api.job.JobStatus; import java.util.ArrayList; import java.util.List; @SuppressWarnings("FieldCanBeLocal") public class JobLoader { private BitcodinApi mBitcodinApi; private JobLoaderListener mJobLoaderCallback; private ArrayList<BitcodinJob> mBitcodinJobs; private ThumbnailLoader mThumbnailLoader; private long numJobs; private int page; private boolean isLoading; private Thread loaderThread; private Runnable loaderRunnable; public JobLoader(BitcodinApi mBitcodinApi, JobLoaderListener jobLoadedCallback, ThumbnailManager mThumbnailManager) { this.mBitcodinApi = mBitcodinApi; this.mJobLoaderCallback = jobLoadedCallback; this.mThumbnailLoader = new ThumbnailLoader(mThumbnailManager); this.mBitcodinJobs = new ArrayList<>(); this.numJobs = -1; this.isLoading = false; } public boolean loadPage(int page) { if (!isLoading) { this.mBitcodinJobs.clear(); this.isLoading = true; this.page = page; this.numJobs = -1; this.loaderRunnable = new Runnable() { @Override public void run() { loadJobs(); } }; this.loaderThread = new Thread(this.loaderRunnable); this.loaderThread.start(); return true; } else { return false; } } private void loadJobs() { try { ApiLoader mLoader = new ApiLoader(this.mBitcodinApi); mLoader.setPage(this.page); int jobIdx = 0; if (this.numJobs < 0) { this.mJobLoaderCallback.onNumJobsAvailable(mLoader.getNumJobs(), mLoader.getNumJobsPerPage()); this.numJobs = mLoader.getNumJobs(); } while (mLoader.hasNext()) { JobDetails mJob = mLoader.getNext(); if (mJob.status == JobStatus.FINISHED) { if (!Settings.DASH_ONLY || (mJob.manifestUrls.mpdUrl != null && !mJob.manifestUrls.mpdUrl.equals(""))) { this.mBitcodinJobs.add(new BitcodinJob(mJob, this.mThumbnailLoader)); } } jobIdx++; this.mJobLoaderCallback.onProgressChanged((double) jobIdx / (double) mLoader.getNumJobsPerPage()); } this.mBitcodinJobs.trimToSize(); this.mJobLoaderCallback.onJobLoaded(this.mBitcodinJobs); this.isLoading = false; } catch (Exception ex) { ex.printStackTrace(); this.mJobLoaderCallback.onJobLoaded(null); } } private class ApiLoader { private BitcodinApi mBitcodinApi; private long numJobs; private long numJobsPerPage; private int page; private List<JobDetails> currentJobs; public ApiLoader(BitcodinApi mBitcodinApi) { this.mBitcodinApi = mBitcodinApi; this.currentJobs = new ArrayList<>(); } public void setPage(int page) { this.currentJobs = new ArrayList<>(); this.page = page; try { JobList mJobList = this.mBitcodinApi.listJobs(this.page); this.currentJobs = mJobList.jobs; this.numJobsPerPage = mJobList.perPage; this.numJobs = mJobList.totalCount; } catch (Exception ex) { ex.printStackTrace(); } } JobDetails getNext() { return this.currentJobs.remove(0); } boolean hasNext() { return this.currentJobs.size() > 0; } long getNumJobs() { return this.numJobs; } long getNumJobsPerPage() { return this.numJobsPerPage; } } }