package com.gaiagps.iburn; import android.content.Context; import android.support.annotation.NonNull; import android.text.TextUtils; import com.gaiagps.iburn.database.ArtTable; import com.gaiagps.iburn.database.DataProvider; import com.gaiagps.iburn.database.PlayaDatabase; import com.squareup.sqlbrite.SqlBrite; import java.io.File; import java.util.ArrayList; import okhttp3.OkHttpClient; import rx.Observable; import rx.schedulers.Schedulers; import timber.log.Timber; /** * Created by dbro on 8/20/16. */ public class AudioTourDownloader { /** * Download all audio tours to the cache directory specified by {@link AudioTourManager} */ public void downloadAudioTours(@NonNull Context context) { final OkHttpClient http = new OkHttpClient(); DataProvider.getInstance(context) .flatMap(provider -> provider.observeTable(PlayaDatabase.ART, new String[]{ArtTable.audioTourUrl}, ArtTable.audioTourUrl + " IS NOT NULL")) .observeOn(Schedulers.io()) .first() .map(SqlBrite.Query::run) .flatMap(cursor -> { ArrayList<String> toDownloadUrls = new ArrayList<>(); if (cursor != null && cursor.moveToFirst()) { do { String audioTourUrl = cursor.getString(cursor.getColumnIndex(ArtTable.audioTourUrl)); File audioTourCacheFile = AudioTourManager.getCachedFileForRemoteMediaPath(context, audioTourUrl); if (!TextUtils.isEmpty(audioTourUrl) && !audioTourCacheFile.exists()) { toDownloadUrls.add(audioTourUrl); } } while (cursor.moveToNext()); return Observable.from(toDownloadUrls); } return Observable.empty(); }) .subscribe(toDownloadUrl -> { boolean didCache = AudioTourManager.cacheRemoteMediaPath(context, http, toDownloadUrl); Timber.d("Downloaded %s with success %b", toDownloadUrl, didCache); }, throwable -> Timber.e(throwable, "Failed to download audio tours")); } }