From ed0a01f5fc03c511711b1faa2b34249a8f9d61b5 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Mon, 24 Apr 2023 22:31:21 +0200 Subject: [PATCH] added quick download mode --- .../main/java/com/deniscerri/ytdlnis/App.kt | 1 - .../ytdlnis/adapter/ActiveDownloadAdapter.kt | 4 +- .../ytdlnis/adapter/CookieAdapter.kt | 3 + .../ytdlnis/adapter/GenericDownloadAdapter.kt | 2 +- .../ytdlnis/adapter/TemplatesAdapter.kt | 4 + .../database/viewmodel/DownloadViewModel.kt | 16 ++ .../ytdlnis/receiver/ShareActivity.kt | 40 ++-- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 33 ++- .../downloadcard/DownloadBottomSheetDialog.kt | 41 +++- .../SelectPlaylistItemsBottomSheetDialog.kt | 2 +- .../downloads/CancelledDownloadsFragment.kt | 6 +- .../ui/downloads/ErroredDownloadsFragment.kt | 6 +- .../ytdlnis/ui/downloads/HistoryFragment.kt | 4 +- .../ui/downloads/QueuedDownloadsFragment.kt | 4 +- .../ui/more/settings/SettingsFragment.kt | 10 + .../main/res/layout/download_bottom_sheet.xml | 218 ++++++++++-------- app/src/main/res/values-night/colors.xml | 2 +- app/src/main/res/values-night/themes.xml | 2 - app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/root_preferences.xml | 8 + 21 files changed, 265 insertions(+), 145 deletions(-) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/App.kt b/app/src/main/java/com/deniscerri/ytdlnis/App.kt index caa5c7eb..a88a010e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/App.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/App.kt @@ -26,7 +26,6 @@ class App : Application() { override fun onCreate() { super.onCreate() - DynamicColors.applyToActivitiesIfAvailable(this) createNotificationChannels() PreferenceManager.setDefaultValues( this, diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt index 044685d1..0707abc1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt @@ -77,7 +77,7 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: if (title.length > 100) { title = title.substring(0, 40) + "..." } - itemTitle.text = title + itemTitle.text = title.ifEmpty { "`${activity.getString(R.string.defaultValue)}`" } // Author ---------------------------------- val author = card.findViewById(R.id.author) @@ -86,7 +86,7 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: if (item.author.isNotEmpty()) info += " • " info += item.duration } - author.text = info + author.text = info.ifEmpty { "`${activity.getString(R.string.defaultValue)}`" } val type = card.findViewById(R.id.download_type) when(item.type){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt index a29a2329..3e7ec1c5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt @@ -50,6 +50,9 @@ class CookieAdapter(onItemClickListener: OnItemClickListener, activity: Activity onItemClickListener.onItemClick(item!!) } + card.setOnLongClickListener { + onItemClickListener.onDelete(item!!); true + } } interface OnItemClickListener { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt index b0c0b139..8713d3f7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt @@ -67,7 +67,7 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: if (title.length > 100) { title = title.substring(0, 40) + "..." } - itemTitle.text = title + itemTitle.text = title.ifEmpty { "`${activity.getString(R.string.defaultValue)}`" } val formatNote = card.findViewById(R.id.format_note) if (item.format.format_note == "?" || item.format.format_note == "") formatNote!!.visibility = diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt index 976d54f8..245d09f7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt @@ -55,6 +55,10 @@ class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activ card.setOnClickListener { onItemClickListener.onItemClick(item!!, position) } + + card.setOnLongClickListener { + onItemClickListener.onDelete(item!!); true + } } interface OnItemClickListener { 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 96372aae..5939bb24 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 @@ -171,6 +171,22 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel } + fun createEmptyResultItem(url: String) : ResultItem { + return ResultItem( + 0, + url, + "", + "", + "", + "", + "", + "", + arrayListOf(), + System.currentTimeMillis() + ) + + } + fun switchDownloadType(list: List, type: Type) : List{ list.forEach { val format = getFormat(it.allFormats, type) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt index 90d2a222..735dc295 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt @@ -42,6 +42,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File +import kotlin.properties.Delegates import kotlin.system.exitProcess class ShareActivity : BaseActivity() { @@ -51,6 +52,7 @@ class ShareActivity : BaseActivity() { private lateinit var downloadViewModel: DownloadViewModel private lateinit var cookieViewModel: CookieViewModel private lateinit var sharedPreferences: SharedPreferences + private var quickDownload by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { @@ -61,7 +63,6 @@ class ShareActivity : BaseActivity() { v.setPadding(0, 0, 0, 0) insets } - window.run { setBackgroundDrawable(ColorDrawable(0)) setLayout( @@ -106,6 +107,8 @@ class ShareActivity : BaseActivity() { return } + quickDownload = intent.getBooleanExtra("quick_download", sharedPreferences.getBoolean("quick_download", false)) + val loadingBottomSheet = BottomSheetDialog(this) loadingBottomSheet.requestWindowFeature(Window.FEATURE_NO_TITLE) loadingBottomSheet.setContentView(R.layout.please_wait_bottom_sheet) @@ -118,24 +121,29 @@ class ShareActivity : BaseActivity() { val inputQuery = intent.getStringExtra(Intent.EXTRA_TEXT) try { val result = resultViewModel.getItemByURL(inputQuery!!) - loadingBottomSheet.cancel() + loadingBottomSheet.dismiss() showDownloadSheet(result) }catch (e: Exception){ resultViewModel.deleteAll() - lifecycleScope.launch { - var res: ArrayList - withContext(Dispatchers.IO){ - res = resultViewModel.parseQuery(inputQuery!!, true) - } - if (res.isEmpty()) { - Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() - exit() - }else{ - loadingBottomSheet.cancel() - if (res.size == 1){ - showDownloadSheet(res[0]!!) + if (quickDownload && inputQuery!!.matches("(https?://(?:www\\.|(?!www))[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|www\\.[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|https?://(?:www\\.|(?!www))[a-zA-Z\\d]+\\.\\S{2,}|www\\.[a-zA-Z\\d]+\\.\\S{2,})".toRegex())){ + val result = downloadViewModel.createEmptyResultItem(inputQuery) + loadingBottomSheet.dismiss() + showDownloadSheet(result) + }else{ + lifecycleScope.launch { + val res = withContext(Dispatchers.IO){ + resultViewModel.parseQuery(inputQuery!!, true) + } + if (res.isEmpty()) { + Toast.makeText(this@ShareActivity, "No Results Found!", Toast.LENGTH_SHORT).show() + exit() }else{ - showSelectPlaylistItems(res.toList()) + loadingBottomSheet.dismiss() + if (res.size == 1){ + showDownloadSheet(res[0]!!) + }else{ + showSelectPlaylistItems(res.toList()) + } } } } @@ -145,7 +153,7 @@ class ShareActivity : BaseActivity() { private fun showDownloadSheet(it: ResultItem){ if (sharedPreferences.getBoolean("download_card", true)){ - val bottomSheet = DownloadBottomSheetDialog(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!), null) + val bottomSheet = DownloadBottomSheetDialog(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!), null, quickDownload) bottomSheet.show(supportFragmentManager, "downloadSingleSheet") }else{ lifecycleScope.launch(Dispatchers.IO){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt index 19170657..a553c6b6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -157,7 +157,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi }else if (resultViewModel.itemCount.value!! == 1){ if (sharedPreferences!!.getBoolean("download_card", true)){ if(it.size == 1 && quickLaunchSheet && parentFragmentManager.findFragmentByTag("downloadSingleSheet") == null){ - showSingleDownloadSheet(it[0], DownloadViewModel.Type.valueOf(sharedPreferences!!.getString("preferred_download_type", "video")!!)) + showSingleDownloadSheet(it[0], DownloadViewModel.Type.valueOf(sharedPreferences!!.getString("preferred_download_type", "video")!!), false) } } }else{ @@ -450,7 +450,28 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } resultViewModel.deleteAll() lifecycleScope.launch(Dispatchers.IO){ - resultViewModel.parseQueries(queryList) + Thread.sleep(300) + if(sharedPreferences!!.getBoolean("quick_download", false)){ + if (queryList.size == 1 && queryList.first().matches("(https?://(?:www\\.|(?!www))[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|www\\.[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|https?://(?:www\\.|(?!www))[a-zA-Z\\d]+\\.\\S{2,}|www\\.[a-zA-Z\\d]+\\.\\S{2,})".toRegex())){ + val resultItem = downloadViewModel.createEmptyResultItem(queryList.first()) + if (sharedPreferences!!.getBoolean("download_card", true)) { + showSingleDownloadSheet(resultItem, DownloadViewModel.Type.valueOf(sharedPreferences!!.getString("preferred_download_type", "video")!!), true) + } else { + lifecycleScope.launch{ + val downloadItem = withContext(Dispatchers.IO){ + downloadViewModel.createDownloadItemFromResult(resultItem, DownloadViewModel.Type.valueOf(sharedPreferences!!.getString("preferred_download_type", "video")!!)) + } + downloadViewModel.queueDownloads(listOf(downloadItem)) + } + } + + }else{ + resultViewModel.parseQueries(queryList) + } + }else{ + resultViewModel.parseQueries(queryList) + + } } } @@ -470,7 +491,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi Log.e(TAG, resultsList!![0].toString() + " " + videoURL) val btn = recyclerView!!.findViewWithTag("""${item?.url}##$type""") if (sharedPreferences!!.getBoolean("download_card", true)) { - showSingleDownloadSheet(item!!, type!!) + showSingleDownloadSheet(item!!, type!!, false) } else { lifecycleScope.launch{ val downloadItem = withContext(Dispatchers.IO){ @@ -484,11 +505,11 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi override fun onLongButtonClick(videoURL: String, type: DownloadViewModel.Type?) { Log.e(TAG, type.toString() + " " + videoURL) val item = resultsList!!.find { it?.url == videoURL } - showSingleDownloadSheet(item!!, type!!) + showSingleDownloadSheet(item!!, type!!, false) } - private fun showSingleDownloadSheet(resultItem : ResultItem, type: DownloadViewModel.Type){ - val bottomSheet = DownloadBottomSheetDialog(resultItem, type, null) + private fun showSingleDownloadSheet(resultItem : ResultItem, type: DownloadViewModel.Type, quickDownload: Boolean){ + val bottomSheet = DownloadBottomSheetDialog(resultItem, type, null, quickDownload) bottomSheet.show(parentFragmentManager, "downloadSingleSheet") } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt index 43e7d180..f08f7072 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt @@ -3,20 +3,19 @@ package com.deniscerri.ytdlnis.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog import android.content.DialogInterface +import android.content.Intent import android.os.Bundle import android.text.format.DateFormat import android.util.DisplayMetrics -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button +import android.widget.LinearLayout import android.widget.Toast -import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager.widget.ViewPager import androidx.viewpager2.widget.ViewPager2 import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.DBManager @@ -25,28 +24,26 @@ import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.receiver.ShareActivity +import com.deniscerri.ytdlnis.ui.downloads.DownloadQueueActivity import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton import com.google.android.material.tabs.TabLayout -import com.google.android.material.tabs.TabLayout.TabLayoutOnPageChangeListener -import com.google.android.material.tabs.TabLayoutMediator -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import java.text.SimpleDateFormat import java.util.* -class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val type: Type, private val downloadItem: DownloadItem?) : BottomSheetDialogFragment() { +class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val type: Type, private val downloadItem: DownloadItem?,private val quickDownload: Boolean) : BottomSheetDialogFragment() { private lateinit var tabLayout: TabLayout private lateinit var viewPager2: ViewPager2 private lateinit var fragmentAdapter : DownloadFragmentAdapter private lateinit var downloadViewModel: DownloadViewModel + private lateinit var resultViewModel: ResultViewModel private lateinit var behavior: BottomSheetBehavior private lateinit var commandTemplateDao : CommandTemplateDao private lateinit var uiUtil: UiUtil @@ -58,6 +55,7 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] + resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] commandTemplateDao = DBManager.getInstance(requireContext()).commandTemplateDao uiUtil = UiUtil(FileUtil()) } @@ -186,6 +184,29 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val uiUtil.copyLinkToClipBoard(requireContext(), resultItem.url, null) true } + + val updateItem = view.findViewById