diff --git a/app/src/main/java/com/shwifty/tex/dialogs/DialogManager.kt b/app/src/main/java/com/shwifty/tex/dialogs/DialogManager.kt index 7e190e0..3529d3f 100644 --- a/app/src/main/java/com/shwifty/tex/dialogs/DialogManager.kt +++ b/app/src/main/java/com/shwifty/tex/dialogs/DialogManager.kt @@ -7,13 +7,16 @@ import android.widget.ArrayAdapter import android.widget.EditText import android.widget.Spinner import com.afollestad.materialdialogs.MaterialDialog +import com.crashlytics.android.Crashlytics import com.schiwfty.torrentwrapper.models.TorrentFile import com.schiwfty.torrentwrapper.models.TorrentInfo import com.schiwfty.torrentwrapper.repositories.ITorrentRepository +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult import com.schiwfty.torrentwrapper.utils.getFullPath import com.shwifty.tex.R import com.shwifty.tex.models.TorrentSearchCategory import com.shwifty.tex.models.TorrentSearchSortType +import com.shwifty.tex.utils.logTorrentParseError import com.shwifty.tex.views.main.MainEventHandler /** @@ -93,9 +96,9 @@ class DialogManager : IDialogManager { .content(R.string.delete_torrent_dialog_text) .positiveText(R.string.delete) .onPositive { dialog, _ -> - torrentRepository.getTorrentInfo(torrentInfo.info_hash) - .subscribe({ - it?.let { + torrentRepository.downloadTorrentInfo(torrentInfo.info_hash) + .subscribe({ result -> + result.unwrapIfSuccess { val deleted = torrentRepository.deleteTorrentInfoFromStorage(it) if (deleted) { it.fileList.forEach { @@ -105,7 +108,7 @@ class DialogManager : IDialogManager { } else { onError.invoke() } - } + }?.let { result.logTorrentParseError() } }, { it.printStackTrace() }) @@ -113,9 +116,11 @@ class DialogManager : IDialogManager { } .negativeText(R.string.keep) .onNegative { dialog, _ -> - torrentRepository.getTorrentInfo(torrentInfo.info_hash) - .subscribe({ - it?.let { torrentRepository.deleteTorrentInfoFromStorage(it) } + torrentRepository.downloadTorrentInfo(torrentInfo.info_hash) + .subscribe({ result -> + result.unwrapIfSuccess { + torrentRepository.deleteTorrentInfoFromStorage(it) + } ?: let { result.logTorrentParseError() } }, { it.printStackTrace() }) diff --git a/app/src/main/java/com/shwifty/tex/utils/TorrentExtensions.kt b/app/src/main/java/com/shwifty/tex/utils/TorrentExtensions.kt index ddb58a8..428053d 100644 --- a/app/src/main/java/com/shwifty/tex/utils/TorrentExtensions.kt +++ b/app/src/main/java/com/shwifty/tex/utils/TorrentExtensions.kt @@ -1,8 +1,10 @@ package com.shwifty.tex.utils +import com.crashlytics.android.Crashlytics import com.google.android.gms.cast.MediaInfo import com.google.android.gms.cast.MediaMetadata import com.schiwfty.torrentwrapper.models.TorrentFile +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult import com.schiwfty.torrentwrapper.utils.getFullPath import com.schiwfty.torrentwrapper.utils.getShareableDataUrl @@ -18,4 +20,12 @@ fun TorrentFile.buildMediaInfo(mime: String): MediaInfo { .setContentType(mime) .setMetadata(movieMetadata) .build() +} + +fun ParseTorrentResult.logTorrentParseError() { + if (this is ParseTorrentResult.Error) { + val error = this.exception + error.printStackTrace() + Crashlytics.logException(error) + } } \ No newline at end of file diff --git a/app/src/main/java/com/shwifty/tex/views/addtorrent/mvp/AddTorrentPresenter.kt b/app/src/main/java/com/shwifty/tex/views/addtorrent/mvp/AddTorrentPresenter.kt index a08550f..ccde477 100644 --- a/app/src/main/java/com/shwifty/tex/views/addtorrent/mvp/AddTorrentPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/addtorrent/mvp/AddTorrentPresenter.kt @@ -1,11 +1,12 @@ package com.shwifty.tex.views.addtorrent.mvp import android.os.Bundle -import com.schiwfty.torrentwrapper.models.TorrentInfo import com.schiwfty.torrentwrapper.repositories.ITorrentRepository +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult import com.schiwfty.torrentwrapper.utils.findHashFromMagnet import com.schiwfty.torrentwrapper.utils.findNameFromMagnet import com.schiwfty.torrentwrapper.utils.findTrackersFromMagnet +import com.shwifty.tex.utils.logTorrentParseError import com.shwifty.tex.views.base.BasePresenter import java.net.URLDecoder @@ -36,16 +37,20 @@ class AddTorrentPresenter(val torrentRepository: ITorrentRepository) : BasePrese } torrentRepository.getAllTorrentsFromStorage() - .subscribe(object : BaseSubscriber>() { + .subscribe(object : BaseSubscriber>() { override fun onCompleted() { } override fun onStart() { } - override fun onNext(torrents: List) { + override fun onNext(results: List) { var alreadyExists = false - torrents.forEach { if (it.info_hash == torrentHash) alreadyExists = true } + results.forEach { result -> + result.unwrapIfSuccess { + if (it.info_hash == torrentHash) alreadyExists = true + } ?: let { result.logTorrentParseError() } + } this@AddTorrentPresenter.alreadyExisted = alreadyExists fetchTorrent() } @@ -55,10 +60,12 @@ class AddTorrentPresenter(val torrentRepository: ITorrentRepository) : BasePrese override fun notifyBackPressed() { if (!alreadyExisted) { torrentRepository.getAllTorrentsFromStorage() - .subscribe(object : BaseSubscriber>() { - override fun onNext(torrents: List) { - torrents.forEach { - if (it.info_hash == torrentHash) torrentRepository.deleteTorrentInfoFromStorage(it) + .subscribe(object : BaseSubscriber>() { + override fun onNext(torrents: List) { + torrents.forEach { result -> + result.unwrapIfSuccess { + if (it.info_hash == torrentHash) torrentRepository.deleteTorrentInfoFromStorage(it) + } ?: let { result.logTorrentParseError() } } } }) @@ -67,15 +74,12 @@ class AddTorrentPresenter(val torrentRepository: ITorrentRepository) : BasePrese private fun fetchTorrent() { val hash = torrentHash ?: return - torrentRepository.getTorrentInfo(hash) - .subscribe(object : BaseSubscriber() { - override fun onNext(pair: TorrentInfo?) { + torrentRepository.downloadTorrentInfo(hash) + .subscribe(object : BaseSubscriber() { + override fun onNext(result: ParseTorrentResult) { mvpView.setLoading(false) mvpView.notifyTorrentAdded() - } - - override fun onError(e: Throwable?) { - super.onError(e) + if (result is ParseTorrentResult.Error) super.onError(result.exception) } }) .addSubscription() diff --git a/app/src/main/java/com/shwifty/tex/views/all/mvp/AllContract.kt b/app/src/main/java/com/shwifty/tex/views/all/mvp/AllContract.kt index bd91cc7..ffeba1b 100644 --- a/app/src/main/java/com/shwifty/tex/views/all/mvp/AllContract.kt +++ b/app/src/main/java/com/shwifty/tex/views/all/mvp/AllContract.kt @@ -10,6 +10,7 @@ import com.shwifty.tex.views.base.BaseContract interface AllContract { interface View: BaseContract.MvpView { fun showAllTorrents(torrentInfoList: List) + fun showSomeTorrentsCouldNotBeLoaded(torrentCount: Int) } interface Presenter: BaseContract.Presenter { diff --git a/app/src/main/java/com/shwifty/tex/views/all/mvp/AllFragment.kt b/app/src/main/java/com/shwifty/tex/views/all/mvp/AllFragment.kt index 50a4abd..c567ce6 100644 --- a/app/src/main/java/com/shwifty/tex/views/all/mvp/AllFragment.kt +++ b/app/src/main/java/com/shwifty/tex/views/all/mvp/AllFragment.kt @@ -83,4 +83,9 @@ class AllFragment : BaseFragment(), AllContract.View { override fun setLoading(loading: Boolean) { allTorrentsSwipeRefresh.isRefreshing = loading } + + override fun showSomeTorrentsCouldNotBeLoaded(torrentCount: Int) { + showError(getString(R.string.error_all_torrents_some_could_not_be_parsed, torrentCount)) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/shwifty/tex/views/all/mvp/AllPresenter.kt b/app/src/main/java/com/shwifty/tex/views/all/mvp/AllPresenter.kt index 3bf3b6e..482cca6 100644 --- a/app/src/main/java/com/shwifty/tex/views/all/mvp/AllPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/all/mvp/AllPresenter.kt @@ -3,6 +3,8 @@ package com.shwifty.tex.views.all.mvp import android.content.Context import com.schiwfty.torrentwrapper.models.TorrentInfo import com.schiwfty.torrentwrapper.repositories.ITorrentRepository +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult +import com.shwifty.tex.utils.logTorrentParseError import com.shwifty.tex.views.base.BasePresenter /** @@ -16,7 +18,7 @@ class AllPresenter(val torrentRepository: ITorrentRepository) : BasePresenter() { - override fun onNext(pair: TorrentInfo?) { + override fun onNext(result: TorrentInfo?) { mvpView.setLoading(false) refresh() } @@ -26,10 +28,20 @@ class AllPresenter(val torrentRepository: ITorrentRepository) : BasePresenter>() { - override fun onNext(torrentInfos: List) { + .subscribe(object : BaseSubscriber>() { + override fun onNext(results: List) { + val success = results.filter { it is ParseTorrentResult.Success } + val error = results.filter { it is ParseTorrentResult.Error } + if (error.isNotEmpty()) { + mvpView.showSomeTorrentsCouldNotBeLoaded(error.size) + error.forEach { it.logTorrentParseError() } + } mvpView.setLoading(false) - mvpView.showAllTorrents(torrentInfos) + val torrentInfos = mutableListOf() + success.forEach { result -> + result.unwrapIfSuccess { torrentInfos.add(it) } ?: let { result.logTorrentParseError() } + } + mvpView.showAllTorrents(torrentInfos.toList()) } }) } diff --git a/app/src/main/java/com/shwifty/tex/views/downloads/mvp/FileDownloadPresenter.kt b/app/src/main/java/com/shwifty/tex/views/downloads/mvp/FileDownloadPresenter.kt index f6b354e..1ec0bbc 100644 --- a/app/src/main/java/com/shwifty/tex/views/downloads/mvp/FileDownloadPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/downloads/mvp/FileDownloadPresenter.kt @@ -27,7 +27,7 @@ class FileDownloadPresenter(val torrentRepository: ITorrentRepository) : BasePre torrentRepository.torrentFileDeleteListener .subscribe(object : BaseSubscriber() { - override fun onNext(pair: TorrentFile?) { + override fun onNext(result: TorrentFile?) { mvpView.setLoading(false) refresh() } diff --git a/app/src/main/java/com/shwifty/tex/views/showtorrent/mvp/TorrentInfoPresenter.kt b/app/src/main/java/com/shwifty/tex/views/showtorrent/mvp/TorrentInfoPresenter.kt index 3f5dca4..4029191 100644 --- a/app/src/main/java/com/shwifty/tex/views/showtorrent/mvp/TorrentInfoPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/showtorrent/mvp/TorrentInfoPresenter.kt @@ -2,13 +2,14 @@ package com.shwifty.tex.views.showtorrent.mvp import android.os.Bundle import android.view.MenuItem -import com.schiwfty.torrentwrapper.confluence.Confluence import com.schiwfty.torrentwrapper.models.TorrentInfo import com.schiwfty.torrentwrapper.repositories.ITorrentRepository +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult import com.schiwfty.torrentwrapper.utils.findHashFromMagnet import com.schiwfty.torrentwrapper.utils.findNameFromMagnet import com.schiwfty.torrentwrapper.utils.findTrackersFromMagnet import com.shwifty.tex.R +import com.shwifty.tex.utils.logTorrentParseError import com.shwifty.tex.views.addtorrent.mvp.AddTorrentActivity import com.shwifty.tex.views.base.BasePresenter import java.net.URLDecoder @@ -38,7 +39,7 @@ class TorrentInfoPresenter(val torrentRepository: ITorrentRepository) : BasePres torrentRepository.torrentInfoDeleteListener .subscribe(object : BaseSubscriber() { - override fun onNext(pair: TorrentInfo?) { + override fun onNext(result: TorrentInfo?) { mvpView.setLoading(false) mvpView.dismiss() } @@ -48,15 +49,17 @@ class TorrentInfoPresenter(val torrentRepository: ITorrentRepository) : BasePres override fun fetchTorrent() { val hash = torrentHash - torrentRepository.getTorrentInfo(hash) - .subscribe(object : BaseSubscriber(){ - override fun onNext(pair: TorrentInfo?) { + torrentRepository.downloadTorrentInfo(hash) + .subscribe(object : BaseSubscriber() { + override fun onNext(result: ParseTorrentResult) { mvpView.setLoading(false) - torrentInfo = pair - torrentName = pair?.name - pair?.info_hash?.let { torrentHash = it } - torrentTrackers = pair?.announceList mvpView.notifyTorrentAdded() + result.unwrapIfSuccess { + torrentInfo = it + torrentName = it.name + torrentHash = it.info_hash + torrentTrackers = it.announceList + } ?: let { result.logTorrentParseError() } } }) .addSubscription() diff --git a/app/src/main/java/com/shwifty/tex/views/splash/mvp/SplashPresenter.kt b/app/src/main/java/com/shwifty/tex/views/splash/mvp/SplashPresenter.kt index 5ce9b6b..9451c41 100644 --- a/app/src/main/java/com/shwifty/tex/views/splash/mvp/SplashPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/splash/mvp/SplashPresenter.kt @@ -50,9 +50,9 @@ class SplashPresenter : BasePresenter(), SplashContract.Pre torrentRepository.getStatus() .retry() .subscribe(object : BaseSubscriber() { - override fun onNext(pair: String?) { + override fun onNext(result: String?) { mvpView.setLoading(false) - pair?.let { + result?.let { subscriptions.unsubscribe() mvpView.showSuccess(R.string.splash_start_confluence_success) mvpView.progressToMain() diff --git a/app/src/main/java/com/shwifty/tex/views/torrentdetails/mvp/TorrentDetailsPresenter.kt b/app/src/main/java/com/shwifty/tex/views/torrentdetails/mvp/TorrentDetailsPresenter.kt index 5e7d526..f31edde 100644 --- a/app/src/main/java/com/shwifty/tex/views/torrentdetails/mvp/TorrentDetailsPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/torrentdetails/mvp/TorrentDetailsPresenter.kt @@ -1,8 +1,9 @@ package com.shwifty.tex.views.torrentdetails.mvp import android.os.Bundle -import com.schiwfty.torrentwrapper.models.TorrentInfo import com.schiwfty.torrentwrapper.repositories.ITorrentRepository +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult +import com.shwifty.tex.utils.logTorrentParseError import com.shwifty.tex.views.base.BasePresenter /** @@ -20,11 +21,13 @@ class TorrentDetailsPresenter(val torrentRepository: ITorrentRepository) : BaseP } override fun loadTorrent(torrentHash: String) { - torrentRepository.getTorrentInfo(torrentHash) - .subscribe(object : BaseSubscriber() { - override fun onNext(pair: TorrentInfo?) { + torrentRepository.downloadTorrentInfo(torrentHash) + .subscribe(object : BaseSubscriber() { + override fun onNext(result: ParseTorrentResult) { mvpView.setLoading(false) - pair?.let { mvpView.setupViewFromTorrentInfo(it) } + result.unwrapIfSuccess { + mvpView.setupViewFromTorrentInfo(it) + } ?: let { result.logTorrentParseError() } } }) .addSubscription() diff --git a/app/src/main/java/com/shwifty/tex/views/torrentfiles/mvp/TorrentFilesPresenter.kt b/app/src/main/java/com/shwifty/tex/views/torrentfiles/mvp/TorrentFilesPresenter.kt index 5ab43b8..b85141a 100644 --- a/app/src/main/java/com/shwifty/tex/views/torrentfiles/mvp/TorrentFilesPresenter.kt +++ b/app/src/main/java/com/shwifty/tex/views/torrentfiles/mvp/TorrentFilesPresenter.kt @@ -1,10 +1,10 @@ package com.shwifty.tex.views.torrentfiles.mvp import android.os.Bundle -import com.schiwfty.torrentwrapper.confluence.Confluence import com.schiwfty.torrentwrapper.models.TorrentFile -import com.schiwfty.torrentwrapper.models.TorrentInfo import com.schiwfty.torrentwrapper.repositories.ITorrentRepository +import com.schiwfty.torrentwrapper.utils.ParseTorrentResult +import com.shwifty.tex.utils.logTorrentParseError import com.shwifty.tex.views.base.BasePresenter import com.shwifty.tex.views.main.MainEventHandler import com.shwifty.tex.views.torrentfiles.list.TorrentFilesAdapter @@ -23,11 +23,11 @@ class TorrentFilesPresenter(val torrentRepository: ITorrentRepository) : BasePre } override fun loadTorrent(torrentHash: String) { - torrentRepository.getTorrentInfo(torrentHash) - .subscribe(object : BaseSubscriber() { - override fun onNext(pair: TorrentInfo?) { + torrentRepository.downloadTorrentInfo(torrentHash) + .subscribe(object : BaseSubscriber() { + override fun onNext(result: ParseTorrentResult) { mvpView.setLoading(false) - pair?.let { mvpView.setupViewFromTorrentInfo(it) } + result.unwrapIfSuccess { mvpView.setupViewFromTorrentInfo(it) } ?: let { result.logTorrentParseError() } } }) .addSubscription() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e95ccc..4a3a531 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,7 +42,7 @@ Error, No activity found to open this file Error, A problem occurred trying to open the torrent Oops, Looks like our search server is down - + %1$d torrents could not be loaded, those torrent files have been deleted. Please manually redownload them File Name diff --git a/release-apks/2.0.9.apk b/release-apks/2.0.9.apk new file mode 100644 index 0000000..3ecb934 Binary files /dev/null and b/release-apks/2.0.9.apk differ diff --git a/torrentwrapper/torrentwrapper.aar b/torrentwrapper/torrentwrapper.aar index 5b0f16b..5229b79 100644 Binary files a/torrentwrapper/torrentwrapper.aar and b/torrentwrapper/torrentwrapper.aar differ