From 3c35a601a16f6dd8ef0c901b84817ae815a9dfad Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Tue, 14 Mar 2023 09:15:09 +0100 Subject: [PATCH] fixed queued downloads not clearing & added yt-dlp version in settings --- .../ytdlnis/database/dao/DownloadDao.kt | 3 + .../database/repository/DownloadRepository.kt | 4 + .../database/viewmodel/DownloadViewModel.kt | 4 + .../ui/downloads/DownloadQueueActivity.kt | 22 +----- .../ui/more/settings/SettingsFragment.kt | 29 ++++++- .../com/deniscerri/ytdlnis/util/UpdateUtil.kt | 75 +++++++++---------- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/more_preferences.xml | 12 --- app/src/main/res/xml/root_preferences.xml | 15 ++++ 9 files changed, 93 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt index 363472ee..1f9333e4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt @@ -43,6 +43,9 @@ interface DownloadDao { @Query("DELETE FROM downloads WHERE status='Error'") suspend fun deleteErrored() + @Query("DELETE FROM downloads WHERE status='Queued'") + suspend fun deleteQueued() + @Query("DELETE FROM downloads WHERE status='Processing' AND id=:id") suspend fun deleteSingleProcessing(id: Long) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt index d5c20b97..9e1e88c7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt @@ -48,6 +48,10 @@ class DownloadRepository(private val downloadDao: DownloadDao) { downloadDao.deleteErrored() } + suspend fun deleteQueued(){ + downloadDao.deleteQueued() + } + suspend fun deleteSingleProcessing(item: DownloadItem){ downloadDao.deleteSingleProcessing(item.id) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt index 02cb39b7..5c6a007f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt @@ -246,6 +246,10 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application repository.deleteErrored() } + fun deleteQueued() = viewModelScope.launch(Dispatchers.IO) { + repository.deleteQueued() + } + fun cloneDownloadItem(item: DownloadItem) : DownloadItem { val string = Gson().toJson(item, DownloadItem::class.java) return Gson().fromJson(string, DownloadItem::class.java) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt index 1b9d44be..192c31eb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt @@ -4,8 +4,10 @@ import android.content.Context import android.os.Bundle import android.view.MenuItem import android.view.View +import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.size import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 @@ -45,19 +47,6 @@ class DownloadQueueActivity : AppCompatActivity(){ } val fragments = mutableListOf(ActiveDownloadsFragment(), QueuedDownloadsFragment(), CancelledDownloadsFragment(), ErroredDownloadsFragment()) -// -// lifecycleScope.launch{ -// withContext(Dispatchers.IO){ -// val active = commandTemplateDao.getTotalNumber() -// if(nr > 0){ -// fragments.add(DownloadCommandFragment(resultItem)) -// }else{ -// (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isEnabled = false -// (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 0.3f -// } -// } -// } - fragmentAdapter = DownloadListFragmentAdapter( supportFragmentManager, @@ -87,10 +76,6 @@ class DownloadQueueActivity : AppCompatActivity(){ }) initMenu() -// downloadViewModel.activeDownloads.observe(this){ -// if (it.isEmpty()) tabLayout.getTabAt(0)!!.view.visibility = View.GONE -// else tabLayout.getTabAt(0)!!.view.visibility = View.VISIBLE -// } } private fun initMenu() { @@ -99,6 +84,7 @@ class DownloadQueueActivity : AppCompatActivity(){ when(m.itemId){ R.id.clear_queue -> { cancelAllDownloads() + downloadViewModel.deleteQueued() } R.id.clear_cancelled -> { downloadViewModel.deleteCancelled() @@ -116,7 +102,7 @@ class DownloadQueueActivity : AppCompatActivity(){ } private fun cancelAllDownloads() { - workManager.cancelAllWork(); + workManager.cancelAllWork() } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt index 0a729b7e..b309f64e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt @@ -11,6 +11,7 @@ import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat +import androidx.lifecycle.lifecycleScope import androidx.preference.* import androidx.work.WorkInfo import androidx.work.WorkManager @@ -19,6 +20,8 @@ import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.UpdateUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.yausername.youtubedl_android.YoutubeDL +import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import java.util.* @@ -54,6 +57,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private var updateApp: SwitchPreferenceCompat? = null private var exportPreferences : Preference? = null private var importPreferences : Preference? = null + private var ytdlVersion: Preference? = null private var version: Preference? = null @@ -113,6 +117,8 @@ class SettingsFragment : PreferenceFragmentCompat() { updateApp = findPreference("update_app") exportPreferences = findPreference("export_preferences") importPreferences = findPreference("import_preferences") + ytdlVersion = findPreference("ytdl-version") + ytdlVersion!!.summary = preferences.getString("ytdl-version", "NULL") version = findPreference("version") version!!.summary = BuildConfig.VERSION_NAME @@ -398,7 +404,28 @@ class SettingsFragment : PreferenceFragmentCompat() { } updateYTDL!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { - updateUtil!!.updateYoutubeDL() + lifecycleScope.launch { + when (updateUtil!!.updateYoutubeDL()) { + YoutubeDL.UpdateStatus.DONE -> { + Toast.makeText( + context, + requireContext().getString(R.string.ytld_update_success), + Toast.LENGTH_LONG + ).show() + YoutubeDL.getInstance().version(context)?.let { + editor.putString("ytdl-version", it) + editor.apply() + ytdlVersion!!.summary = it + } + } + YoutubeDL.UpdateStatus.ALREADY_UP_TO_DATE -> Toast.makeText( + context, + requireContext().getString(R.string.you_are_in_latest_version), + Toast.LENGTH_LONG + ).show() + else -> Toast.makeText(context, this.toString(), Toast.LENGTH_LONG).show() + } + } true } updateNightlyYTDL!!.onPreferenceChangeListener = diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt index 24731e5a..18174236 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt @@ -18,6 +18,8 @@ import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import org.json.JSONException import org.json.JSONObject import java.io.BufferedReader @@ -143,56 +145,47 @@ class UpdateUtil(var context: Context) { } } - fun updateYoutubeDL() { - val sharedPreferences = - context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) - if (updatingYTDL) { - Toast.makeText( - context, - context.getString(R.string.ytdl_already_updating), - Toast.LENGTH_LONG - ).show() - return - } - Toast.makeText( - context, - context.getString(R.string.ytdl_updating_started), - Toast.LENGTH_SHORT - ).show() - updatingYTDL = true - val disposable = Observable.fromCallable { - YoutubeDL.getInstance().updateYoutubeDL( - context, if (sharedPreferences.getBoolean("nightly_ytdl", false) ) ytdlpNightly else null - ) - } - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ status: UpdateStatus -> - when (status) { - UpdateStatus.DONE -> - Toast.makeText( - context, - context.getString(R.string.ytld_update_success), - Toast.LENGTH_LONG - ).show() - UpdateStatus.ALREADY_UP_TO_DATE -> Toast.makeText( + suspend fun updateYoutubeDL() : UpdateStatus? = + withContext(Dispatchers.IO){ + val sharedPreferences = + context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + val editor = sharedPreferences.edit() + if (updatingYTDL) { + withContext(Dispatchers.Main){ + Toast.makeText( context, - context.getString(R.string.you_are_in_latest_version), + context.getString(R.string.ytdl_already_updating), Toast.LENGTH_LONG ).show() - else -> Toast.makeText(context, status.toString(), Toast.LENGTH_LONG).show() } - updatingYTDL = false - } as ((UpdateStatus?) -> Unit)?) { e: Throwable? -> - if (BuildConfig.DEBUG) Log.e(tag, context.getString(R.string.ytdl_update_failed), e) + UpdateStatus.ALREADY_UP_TO_DATE + } + withContext(Dispatchers.Main){ Toast.makeText( context, - context.getString(R.string.ytdl_update_failed), - Toast.LENGTH_LONG + context.getString(R.string.ytdl_updating_started), + Toast.LENGTH_SHORT ).show() + } + updatingYTDL = true + + + YoutubeDL.getInstance().updateYoutubeDL( + context, if (sharedPreferences.getBoolean("nightly_ytdl", false) ) ytdlpNightly else null + ).apply { updatingYTDL = false } - compositeDisposable.add(disposable) + +// .onFailure { +// if (BuildConfig.DEBUG) Log.e(tag, context.getString(R.string.ytdl_update_failed), e) +// Toast.makeText( +// context, +// context.getString(R.string.ytdl_update_failed), +// Toast.LENGTH_LONG +// ).show() +// updatingYTDL = false +// } + //} } companion object { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 662e7085..a6646815 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,4 +225,5 @@ Delete cached files from crashed/errored/cancelled downloads Temporary files cleared Download worker is running. Try again later + yt-dlp Version \ No newline at end of file diff --git a/app/src/main/res/xml/more_preferences.xml b/app/src/main/res/xml/more_preferences.xml index b4735006..b02bf99d 100644 --- a/app/src/main/res/xml/more_preferences.xml +++ b/app/src/main/res/xml/more_preferences.xml @@ -6,18 +6,6 @@ app:enabled="false" android:layout="@layout/fragment_more"/> - - - - - + + + + +