diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index aa44b74a..dcb57de3 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -20,6 +20,13 @@ # hide the original source file name. #-renamesourcefileattribute SourceFile -if @kotlinx.serialization.Serializable class ** +-keep class androidx.lifecycle.LiveData { *; } +-keep class com.google.gson.** { *; } +-keep class com.deniscerri.ytdlnis.database.models.AudioPreferences +-keep class com.deniscerri.ytdlnis.database.models.VideoPreferences +-keepclassmembers class * { + @com.google.gson.annotations.SerializedName ; +} -keepclassmembers class <1> { static <1>$Companion Companion; } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/App.kt b/app/src/main/java/com/deniscerri/ytdlnis/App.kt index 280cc8df..45cab5c3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/App.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/App.kt @@ -66,7 +66,7 @@ class App : Application() { if (sp.getInt("spl", 0) != SPL) { PreferenceManager.setDefaultValues(this, R.xml.root_preferences, true) PreferenceManager.setDefaultValues(this, R.xml.downloading_preferences, true) - PreferenceManager.setDefaultValues(this, R.xml.appearance_preferences, true) + PreferenceManager.setDefaultValues(this, R.xml.general_preferences, true) PreferenceManager.setDefaultValues(this, R.xml.processing_preferences, true) PreferenceManager.setDefaultValues(this, R.xml.folders_preference, true) PreferenceManager.setDefaultValues(this, R.xml.updating_preferences, true) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 6fcd553e..9db3abd1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -253,7 +253,7 @@ class MainActivity : BaseActivity() { window.statusBarColor = getColor(android.R.color.transparent) incognitoHeader.visibility = View.GONE } - //check logs option + //check logs option to show in tablet navbar if (navigationView is NavigationView){ (navigationView as NavigationView).menu.findItem(R.id.downloadLogListFragment).isVisible = preferences.getBoolean("log_downloads", false) } 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 f6e96d88..e6de79d6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt @@ -76,7 +76,7 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: if (title.length > 100) { title = title.substring(0, 40) + "..." } - itemTitle.text = title.ifEmpty { "<${activity.getString(R.string.defaultValue)}>" } + itemTitle.text = title.ifEmpty { item.url } // Author ---------------------------------- val author = card.findViewById(R.id.author) @@ -85,7 +85,6 @@ class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: if (item.author.isNotEmpty()) info += " • " info += item.duration } - 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/GenericDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt index ed07ff7a..3504d1a0 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt @@ -70,7 +70,7 @@ class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: if (title.length > 100) { title = title.substring(0, 40) + "..." } - itemTitle.text = title.ifEmpty { "<${activity.getString(R.string.defaultValue)}>" } + itemTitle.text = title.ifEmpty { item.url } 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/database/dao/SearchHistoryDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt index 6a2f3e8a..e0e38f8a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt @@ -5,7 +5,7 @@ import com.deniscerri.ytdlnis.database.models.SearchHistoryItem @Dao interface SearchHistoryDao { - @Query("SELECT * from searchHistory ORDER BY id DESC LIMIT 10") + @Query("SELECT * from searchHistory ORDER BY id DESC LIMIT 25") fun getAll() : List @Query("SELECT * from searchHistory WHERE `query` COLLATE NOCASE ='%'||:keyword||'%'") diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt index c02b10dc..3b16db9d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt @@ -66,7 +66,7 @@ class ResultViewModel(application: Application) : AndroidViewModel(application) if (inputQueries.size == 1){ parseQuery(inputQueries[0], true) }else { - repository.itemCount.postValue(2) + repository.itemCount.postValue(inputQueries.size) loadingItems.postValue(true) inputQueries.forEach { parseQuery(it, false) @@ -100,7 +100,7 @@ class ResultViewModel(application: Application) : AndroidViewModel(application) } catch (e: Exception) { Log.e(tag, e.toString()) } - loadingItems.postValue(false) + if (resetResults) loadingItems.postValue(false) res } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt index 63e13162..5eb3a09d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt @@ -2,11 +2,19 @@ package com.deniscerri.ytdlnis.ui import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.util.ThemeUtil open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { ThemeUtil.updateTheme(this) super.onCreate(savedInstanceState) + WindowCompat.setDecorFitsSystemWindows(window, false) + ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { v, insets -> + v.setPadding(0, 0, 0, 0) + insets + } } } \ No newline at end of file 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 b5be8878..0e07fdc3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -5,7 +5,6 @@ import android.app.Activity import android.content.* import android.content.Context.CLIPBOARD_SERVICE import android.content.res.ColorStateList -import android.content.res.Configuration import android.graphics.Color import android.os.Bundle import android.os.Handler @@ -42,6 +41,7 @@ import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.InfoUtil import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.button.MaterialButton import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup @@ -94,6 +94,8 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene private var _binding : FragmentHomeBinding? = null private var actionMode: ActionMode? = null private var appBarLayout: AppBarLayout? = null + private var materialToolbar: MaterialToolbar? = null + private var loadingItems: Boolean = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -130,6 +132,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene searchView = view.findViewById(R.id.search_view) linkYouCopied = searchView?.findViewById(R.id.link_you_copied) appBarLayout = view.findViewById(R.id.home_appbarlayout) + materialToolbar = view.findViewById(R.id.home_toolbar) queriesChipGroup = view.findViewById(R.id.queries) searchSuggestions = view.findViewById(R.id.search_suggestions_scroll_view) searchSuggestionsLinearLayout = view.findViewById(R.id.search_suggestions_linear_layout) @@ -150,7 +153,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene homeAdapter!!.submitList(it) resultsList = it if(resultViewModel.itemCount.value!! > 1 || resultViewModel.itemCount.value!! == -1){ - if (it.size > 1 && it[0].playlistTitle.isNotEmpty() && it[0].playlistTitle != getString(R.string.trendingPlaylist)){ + if (it.size > 1 && it[0].playlistTitle.isNotEmpty() && it[0].playlistTitle != getString(R.string.trendingPlaylist) && !loadingItems){ downloadAllFabCoordinator!!.visibility = VISIBLE }else{ downloadAllFabCoordinator!!.visibility = GONE @@ -167,7 +170,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene quickLaunchSheet = true } + resultViewModel.loadingItems.observe(viewLifecycleOwner){ + loadingItems = it if (it){ recyclerView?.setPadding(0,0,0,0) shimmerCards!!.startShimmer() @@ -176,6 +181,11 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene recyclerView?.setPadding(0,0,0,100) shimmerCards!!.stopShimmer() shimmerCards!!.visibility = GONE + if (resultsList!!.size > 1 && resultsList!![0]!!.playlistTitle.isNotEmpty() && resultsList!![0]!!.playlistTitle != getString(R.string.trendingPlaylist)){ + downloadAllFabCoordinator!!.visibility = VISIBLE + }else{ + downloadAllFabCoordinator!!.visibility = GONE + } } } @@ -196,7 +206,9 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene val url = requireArguments().getString("url") if (inputQueries == null) inputQueries = mutableListOf() searchBar?.text = url - inputQueries!!.addAll(url!!.split("\n")) + val argList = url!!.split("\n").toMutableList() + argList.removeAll(listOf("", null)) + inputQueries!!.addAll(argList) } if (inputQueries != null) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt index 8b053731..c252c864 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt @@ -19,7 +19,6 @@ import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider @@ -125,9 +124,10 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr audioPathResultLauncher.launch(intent) } freeSpace = view.findViewById(R.id.freespace) - freeSpace.text = String.format( getString(R.string.freespace) + ": " + fileUtil.convertFileSize( - File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace - )) + val free = fileUtil.convertFileSize( + File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace) + freeSpace.text = String.format( getString(R.string.freespace) + ": " + free) + if (free == "?") freeSpace.visibility = View.GONE var formats = mutableListOf() formats.addAll(resultItem.formats.filter { it.format_note.contains("audio", ignoreCase = true) }) @@ -342,9 +342,10 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr //downloadViewModel.updateDownload(downloadItem) saveDir.editText?.setText(fileUtil.formatPath(result.data?.data.toString()), TextView.BufferType.EDITABLE) - freeSpace.text = String.format( getString(R.string.freespace) + ": " + fileUtil.convertFileSize( - File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace - )) + val free = fileUtil.convertFileSize( + File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace) + freeSpace.text = String.format( getString(R.string.freespace) + ": " + free) + if (free == "?") freeSpace.visibility = View.GONE } } 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 d23cbe23..022ae073 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 @@ -7,7 +7,6 @@ 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 diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt index bf69fabb..88cc71f9 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt @@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.ui.downloadcard import android.app.Activity import android.content.DialogInterface import android.content.Intent -import android.net.Uri import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -20,7 +19,6 @@ import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider @@ -129,9 +127,10 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr } freeSpace = view.findViewById(R.id.freespace) - freeSpace.text = String.format(getString(R.string.freespace) + ": " + fileUtil.convertFileSize( - File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace - )) + val free = fileUtil.convertFileSize( + File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace) + freeSpace.text = String.format( getString(R.string.freespace) + ": " + free) + if (free == "?") freeSpace.visibility = View.GONE var formats = mutableListOf() formats.addAll(resultItem.formats) @@ -358,6 +357,7 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr val saveSubtitles = view.findViewById(R.id.save_subtitles) val subtitleLanguages = view.findViewById(R.id.subtitle_languages) + downloadItem.videoPreferences.subsLanguages = sharedPreferences.getString("subs_lang", "en.*,.*-orig")!! if (downloadItem.videoPreferences.writeSubs) { saveSubtitles.isChecked = true subtitleLanguages.visibility = View.VISIBLE @@ -370,44 +370,9 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr } subtitleLanguages.setOnClickListener { - val builder = MaterialAlertDialogBuilder(requireContext()) - builder.setTitle(getString(R.string.subtitle_languages)) - val inputLayout = layoutInflater.inflate(R.layout.textinput, null) - val editText = inputLayout.findViewById(R.id.url_edittext) - editText.setHint(R.string.subtitle_languages) - editText.setText(downloadItem.videoPreferences.subsLanguages) - editText.setSelection(editText.text.length) - builder.setView(inputLayout) - builder.setPositiveButton( - getString(R.string.ok) - ) { dialog: DialogInterface?, which: Int -> - downloadItem.videoPreferences.subsLanguages = editText.text.toString() + uiUtil.showSubtitleLanguagesDialog(requireActivity(), downloadItem.videoPreferences.subsLanguages){ + downloadItem.videoPreferences.subsLanguages = it } - - // handle the negative button of the alert dialog - builder.setNegativeButton( - getString(R.string.cancel) - ) { dialog: DialogInterface?, which: Int -> } - - builder.setNeutralButton("?") { dialog: DialogInterface?, which: Int -> - val browserIntent = - Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/yt-dlp/yt-dlp#subtitle-options")) - startActivity(browserIntent) - } - - - val dialog = builder.create() - editText.doOnTextChanged { text, start, before, count -> - dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editText.text.isNotEmpty() - } - dialog.show() - val imm = context?.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager - editText!!.postDelayed({ - editText.requestFocus() - imm.showSoftInput(editText, 0) - }, 300) - dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editText.text.isNotEmpty() - dialog.getButton(AlertDialog.BUTTON_NEUTRAL).gravity = Gravity.START } val removeAudio = view.findViewById(R.id.remove_audio) @@ -436,9 +401,10 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr //downloadviewmodel.updateDownload(downloadItem) saveDir.editText?.setText(fileUtil.formatPath(result.data?.data.toString()), TextView.BufferType.EDITABLE) - freeSpace.text = String.format(getString(R.string.freespace) + ": " + fileUtil.convertFileSize( - File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace - )) + val free = fileUtil.convertFileSize( + File(fileUtil.formatPath(downloadItem.downloadPath)).freeSpace) + freeSpace.text = String.format( getString(R.string.freespace) + ": " + free) + if (free == "?") freeSpace.visibility = View.GONE } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt index fa87c858..21569a56 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt @@ -23,7 +23,6 @@ import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.card.MaterialCardView -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -188,6 +187,10 @@ class FormatSelectionBottomSheetDialog(private val items: List, p okBtn.setOnClickListener { val selectedFormats = mutableListOf() + if (!::selectedVideo.isInitialized) { + selectedVideo = + chosenFormats.filter { it.vcodec.isNotBlank() && it.vcodec != "none" }.maxByOrNull { it.filesize }!! + } selectedFormats.add(selectedVideo) selectedFormats.addAll(selectedAudios) listener.onFormatClick(List(items.size){chosenFormats}, selectedFormats) @@ -199,11 +202,11 @@ class FormatSelectionBottomSheetDialog(private val items: List, p } } private fun addFormatsToView(){ - val isSingleAndVideo = items.first()?.type == Type.video && items.count() == 1 + val canMultiSelectAudio = items.first()?.type == Type.video && items.count() == 1 && chosenFormats.find { it.format_note.contains("audio", ignoreCase = true) } != null videoFormatList.removeAllViews() audioFormatList.removeAllViews() - if (!isSingleAndVideo) { + if (!canMultiSelectAudio) { audioFormatList.visibility = View.GONE videoTitle.visibility = View.GONE audioTitle.visibility = View.GONE @@ -229,9 +232,13 @@ class FormatSelectionBottomSheetDialog(private val items: List, p uiUtil.populateFormatCard(formatItem as MaterialCardView, format, null) formatItem.setOnClickListener{ clickedformat -> //if the context is behind a single download card and its a video, allow the ability to multiselect audio formats - if (isSingleAndVideo){ + if (canMultiSelectAudio){ val clickedCard = (clickedformat as MaterialCardView) if (format.vcodec.isNotBlank() && format.vcodec != "none") { + if (clickedCard.isChecked) { + listener.onFormatClick(List(items.size){chosenFormats}, listOf(format)) + dismiss() + } videoFormatList.forEach { (it as MaterialCardView).isChecked = false } selectedVideo = format clickedCard.isChecked = true @@ -269,7 +276,7 @@ class FormatSelectionBottomSheetDialog(private val items: List, p true } - if (isSingleAndVideo){ + if (canMultiSelectAudio){ if (format.vcodec.isNotBlank() && format.vcodec != "none") videoFormatList.addView(formatItem) else audioFormatList.addView(formatItem) }else{ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt index 23941c01..c589b23c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis.ui.downloads import android.app.Activity -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -20,7 +19,6 @@ import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding -import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogFragment import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.NotificationUtil import com.google.android.material.progressindicator.LinearProgressIndicator diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt index 5af60b9f..e0aeaae3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt @@ -2,7 +2,6 @@ package com.deniscerri.ytdlnis.ui.downloads import android.app.Activity import android.content.DialogInterface -import android.content.res.Configuration import android.graphics.Canvas import android.graphics.Color import android.os.Bundle @@ -21,6 +20,7 @@ import androidx.appcompat.view.ActionMode import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView @@ -82,8 +82,11 @@ class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClic cancelledRecyclerView = view.findViewById(R.id.download_recyclerview) cancelledRecyclerView.adapter = cancelledDownloads - val itemTouchHelper = ItemTouchHelper(simpleCallback) - itemTouchHelper.attachToRecyclerView(cancelledRecyclerView) + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + if (preferences.getBoolean("swipe_gestures", true)){ + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(cancelledRecyclerView) + } cancelledRecyclerView.layoutManager = GridLayoutManager(context, resources.getInteger(R.integer.grid_size)) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt index f13048ac..6aea1b12 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt @@ -2,7 +2,6 @@ package com.deniscerri.ytdlnis.ui.downloads import android.app.Activity import android.content.DialogInterface -import android.content.Intent import android.graphics.Canvas import android.graphics.Color import android.os.Bundle @@ -23,6 +22,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView @@ -32,7 +32,6 @@ import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog -import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogFragment import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetDialog @@ -84,8 +83,11 @@ class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickL erroredRecyclerView = view.findViewById(R.id.download_recyclerview) erroredRecyclerView.adapter = erroredDownloads - val itemTouchHelper = ItemTouchHelper(simpleCallback) - itemTouchHelper.attachToRecyclerView(erroredRecyclerView) + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + if (preferences.getBoolean("swipe_gestures", true)){ + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(erroredRecyclerView) + } erroredRecyclerView.layoutManager = GridLayoutManager(context, resources.getInteger(R.integer.grid_size)) downloadViewModel.erroredDownloads.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt index 578b976f..d4fc9a8a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt @@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.ui.downloads import android.app.Activity import android.content.Context import android.content.DialogInterface -import android.content.Intent import android.graphics.Canvas import android.graphics.Color import android.os.Bundle @@ -33,6 +32,7 @@ import androidx.core.view.forEach import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView @@ -129,8 +129,13 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ ) recyclerView = view.findViewById(R.id.recyclerviewhistorys) recyclerView?.adapter = historyAdapter - val itemTouchHelper = ItemTouchHelper(simpleCallback) - itemTouchHelper.attachToRecyclerView(recyclerView) + + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + if (preferences.getBoolean("swipe_gestures", true)){ + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(recyclerView) + } + recyclerView?.layoutManager = GridLayoutManager(context, resources.getInteger(R.integer.grid_size)) noResults?.visibility = GONE diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt index d79628e4..4b08f994 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt @@ -2,7 +2,6 @@ package com.deniscerri.ytdlnis.ui.downloads import android.app.Activity import android.content.DialogInterface -import android.content.res.Configuration import android.graphics.Canvas import android.graphics.Color import android.os.Bundle @@ -23,6 +22,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView @@ -30,6 +30,7 @@ import androidx.work.WorkManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.adapter.GenericDownloadAdapter import com.deniscerri.ytdlnis.database.models.DownloadItem +import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding import com.deniscerri.ytdlnis.util.FileUtil @@ -93,8 +94,11 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi queuedRecyclerView = view.findViewById(R.id.download_recyclerview) queuedRecyclerView.adapter = queuedDownloads - val itemTouchHelper = ItemTouchHelper(simpleCallback) - itemTouchHelper.attachToRecyclerView(queuedRecyclerView) + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + if (preferences.getBoolean("swipe_gestures", true)){ + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(queuedRecyclerView) + } queuedRecyclerView.layoutManager = GridLayoutManager(context, resources.getInteger(R.integer.grid_size)) downloadViewModel.queuedDownloads.observe(viewLifecycleOwner) { @@ -262,11 +266,13 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi YoutubeDL.getInstance().destroyProcessById(id.toString()) WorkManager.getInstance(requireContext()).cancelUniqueWork(id.toString()) notificationUtil.cancelDownloadNotification(id) - downloadViewModel.deleteDownload(item!!) + item!!.status = DownloadRepository.Status.Cancelled.toString() + downloadViewModel.updateDownload(item) Snackbar.make(queuedRecyclerView, getString(R.string.cancelled) + ": " + item.title, Snackbar.LENGTH_LONG) .setAction(getString(R.string.undo)) { lifecycleScope.launch(Dispatchers.IO) { + downloadViewModel.deleteDownload(item) downloadViewModel.queueDownloads(listOf(item)) } }.show() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt index ae4926be..b230c081 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt @@ -1,6 +1,5 @@ package com.deniscerri.ytdlnis.ui.more -import android.content.Context import android.content.DialogInterface import android.graphics.Canvas import android.graphics.Color @@ -13,6 +12,7 @@ import android.widget.RelativeLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -69,8 +69,11 @@ class CommandTemplatesFragment : Fragment(), TemplatesAdapter.OnItemClickListene recyclerView = view.findViewById(R.id.template_recyclerview) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = templatesAdapter - val itemTouchHelper = ItemTouchHelper(simpleCallback) - itemTouchHelper.attachToRecyclerView(recyclerView) + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + if (preferences.getBoolean("swipe_gestures", true)){ + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(recyclerView) + } uiUtil = UiUtil(FileUtil()) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt index 3caeeb81..8e350292 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt @@ -1,6 +1,5 @@ package com.deniscerri.ytdlnis.ui.more -import android.content.Context import android.content.Context.INPUT_METHOD_SERVICE import android.content.DialogInterface import android.content.Intent @@ -19,6 +18,7 @@ import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -74,9 +74,11 @@ class CookiesFragment : Fragment(), CookieAdapter.OnItemClickListener { recyclerView = view.findViewById(R.id.template_recyclerview) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = listAdapter - val itemTouchHelper = ItemTouchHelper(simpleCallback) - itemTouchHelper.attachToRecyclerView(recyclerView) - + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + if (preferences.getBoolean("swipe_gestures", true)){ + val itemTouchHelper = ItemTouchHelper(simpleCallback) + itemTouchHelper.attachToRecyclerView(recyclerView) + } uiUtil = UiUtil(FileUtil()) cookiesViewModel = ViewModelProvider(this)[CookieViewModel::class.java] diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt index 71e0076c..4ab288a7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt @@ -14,7 +14,6 @@ import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogListFragment import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlin.system.exitProcess diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt index d6173897..6eae2635 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis.ui.more.downloadLogs import android.content.ClipboardManager -import android.content.Context import android.content.Context.CLIPBOARD_SERVICE import android.os.Build import android.os.Bundle @@ -14,7 +13,6 @@ import android.widget.TextView import androidx.fragment.app.Fragment import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.ui.BaseActivity import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import java.io.File diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt index 38a83155..eb4b9011 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt @@ -1,14 +1,15 @@ package com.deniscerri.ytdlnis.ui.more.settings -import android.content.DialogInterface +import android.view.inputmethod.InputMethodManager +import androidx.appcompat.app.AppCompatActivity import androidx.preference.EditTextPreference import androidx.preference.ListPreference -import androidx.preference.MultiSelectListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.databinding.DialogTextPreferenceBinding +import com.deniscerri.ytdlnis.databinding.TextinputBinding import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.textfield.TextInputLayout abstract class BaseSettingsFragment : PreferenceFragmentCompat() { @@ -43,19 +44,26 @@ abstract class BaseSettingsFragment : PreferenceFragmentCompat() { .show() } is EditTextPreference -> { - val binding = DialogTextPreferenceBinding.inflate(layoutInflater) - binding.input.setText(preference.text) - MaterialAlertDialogBuilder(requireContext()) + val binding = TextinputBinding.inflate(layoutInflater) + binding.urlEdittext.setText(preference.text) + binding.urlTextinput.findViewById(R.id.url_textinput).hint = preference.title + val dialog = MaterialAlertDialogBuilder(requireContext()) .setTitle(preference.title) .setView(binding.root) .setPositiveButton(android.R.string.ok) { _, _ -> - val newValue = binding.input.text.toString() + val newValue = binding.urlEdittext.text.toString() if (preference.callChangeListener(newValue)) { preference.text = newValue } } .setNegativeButton(R.string.cancel, null) - .show() + dialog.show() + val imm = context?.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager + binding.urlEdittext.setSelection(binding.urlEdittext.text!!.length) + binding.urlEdittext.postDelayed({ + binding.urlEdittext.requestFocus() + imm.showSoftInput(binding.urlEdittext, 0) + }, 300) } /** * Otherwise show the normal dialog, dialogs for other preference types are not supported yet diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/AppearanceSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/GeneralSettingsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/AppearanceSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/GeneralSettingsFragment.kt index 29fcc650..e5db26ad 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/GeneralSettingsFragment.kt @@ -20,8 +20,8 @@ import com.deniscerri.ytdlnis.util.UpdateUtil import java.util.Locale -class AppearanceSettingsFragment : BaseSettingsFragment() { - override val title: Int = R.string.appearance +class GeneralSettingsFragment : BaseSettingsFragment() { + override val title: Int = R.string.general private var language: ListPreference? = null private var theme: ListPreference? = null @@ -34,7 +34,7 @@ class AppearanceSettingsFragment : BaseSettingsFragment() { private var activeDownloadCount = 0 override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.appearance_preferences, rootKey) + setPreferencesFromResource(R.xml.general_preferences, rootKey) updateUtil = UpdateUtil(requireContext()) fileUtil = FileUtil() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt index fa0575c5..068a065e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt @@ -4,14 +4,11 @@ import android.os.Bundle import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.BuildConfig import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.util.UpdateUtil import com.google.android.material.snackbar.Snackbar import com.yausername.youtubedl_android.YoutubeDL -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext class UpdateSettingsFragment : BaseSettingsFragment() { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt index 58da339e..b735f628 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt @@ -9,19 +9,14 @@ import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.Format import com.deniscerri.ytdlnis.database.models.ResultItem -import com.google.common.net.HttpHeaders.USER_AGENT import com.google.gson.Gson import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDLRequest -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response import org.json.JSONArray import org.json.JSONException import org.json.JSONObject import java.io.BufferedReader import java.io.File -import java.io.IOException import java.io.InputStreamReader import java.net.HttpURLConnection import java.net.URL diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt index 53e39a6d..799cb559 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt @@ -5,23 +5,29 @@ import android.app.Activity import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import android.content.DialogInterface import android.content.Intent import android.net.Uri import android.text.Editable import android.text.TextWatcher import android.util.DisplayMetrics import android.util.Log +import android.view.Gravity import android.view.View import android.view.ViewGroup import android.view.Window +import android.view.inputmethod.InputMethodManager import android.widget.Button +import android.widget.EditText import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.FileProvider +import androidx.core.widget.doOnTextChanged import androidx.fragment.app.FragmentManager import androidx.lifecycle.LifecycleOwner import com.deniscerri.ytdlnis.R @@ -37,6 +43,7 @@ import com.google.android.material.chip.ChipGroup import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointForward import com.google.android.material.datepicker.MaterialDatePicker +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputLayout import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.TimeFormat @@ -372,7 +379,7 @@ class UiUtil(private val fileUtil: FileUtil) { } } - if (format.fps.isNullOrBlank()) fpsParent?.visibility = View.GONE + if (format.fps.isNullOrBlank() || format.fps == "0") fpsParent?.visibility = View.GONE else { fpsParent?.findViewById(R.id.fps_value)?.text = format.fps fpsParent?.setOnClickListener { @@ -400,6 +407,48 @@ class UiUtil(private val fileUtil: FileUtil) { ) } + fun showSubtitleLanguagesDialog(context: Activity, currentValue: String, ok: (newValue: String) -> Unit){ + val builder = MaterialAlertDialogBuilder(context) + builder.setTitle(context.getString(R.string.subtitle_languages)) + val inputLayout = context.layoutInflater.inflate(R.layout.textinput, null) + val editText = inputLayout.findViewById(R.id.url_edittext) + inputLayout.findViewById(R.id.url_textinput).hint = context.getString(R.string.subtitle_languages) + editText.setText(currentValue) + editText.setSelection(editText.text.length) + builder.setView(inputLayout) + builder.setPositiveButton( + context.getString(R.string.ok) + ) { dialog: DialogInterface?, which: Int -> + ok(editText.text.toString()) + } + + // handle the negative button of the alert dialog + builder.setNegativeButton( + context.getString(R.string.cancel) + ) { dialog: DialogInterface?, which: Int -> } + + builder.setNeutralButton("?") { dialog: DialogInterface?, which: Int -> + val browserIntent = + Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/yt-dlp/yt-dlp#subtitle-options")) + context.startActivity(browserIntent) + } + + + val dialog = builder.create() + editText.doOnTextChanged { text, start, before, count -> + dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editText.text.isNotEmpty() + } + dialog.show() + val imm = context.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager + editText.setSelection(editText.text!!.length) + editText!!.postDelayed({ + editText.requestFocus() + imm.showSoftInput(editText, 0) + }, 300) + dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editText.text.isNotEmpty() + dialog.getButton(AlertDialog.BUTTON_NEUTRAL).gravity = Gravity.START + } + private fun copyToClipboard(text: String, activity: Activity){ val clipboard = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager diff --git a/app/src/main/res/drawable/baseline_subject_24.xml b/app/src/main/res/drawable/baseline_subject_24.xml new file mode 100644 index 00000000..e6f7ea54 --- /dev/null +++ b/app/src/main/res/drawable/baseline_subject_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/baseline_swipe_24.xml b/app/src/main/res/drawable/baseline_swipe_24.xml new file mode 100644 index 00000000..5bd7dbc5 --- /dev/null +++ b/app/src/main/res/drawable/baseline_swipe_24.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/layout-sw600dp-land/fragment_home.xml b/app/src/main/res/layout-sw600dp-land/fragment_home.xml index af42b2ce..3da6cc0c 100644 --- a/app/src/main/res/layout-sw600dp-land/fragment_home.xml +++ b/app/src/main/res/layout-sw600dp-land/fragment_home.xml @@ -103,6 +103,7 @@ app:liftOnScroll="true" android:background="@null" android:elevation="0dp" + android:fitsSystemWindows="true" app:elevation="0dp" android:layout_width="match_parent" android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout-sw600dp/fragment_home.xml b/app/src/main/res/layout-sw600dp/fragment_home.xml index c5bcc92a..4135ca14 100644 --- a/app/src/main/res/layout-sw600dp/fragment_home.xml +++ b/app/src/main/res/layout-sw600dp/fragment_home.xml @@ -103,6 +103,7 @@ app:liftOnScroll="true" android:background="@null" android:elevation="0dp" + android:fitsSystemWindows="true" app:elevation="0dp" android:layout_width="match_parent" android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout-sw950dp-land/fragment_home.xml b/app/src/main/res/layout-sw950dp-land/fragment_home.xml index 4a7fe720..297ab643 100644 --- a/app/src/main/res/layout-sw950dp-land/fragment_home.xml +++ b/app/src/main/res/layout-sw950dp-land/fragment_home.xml @@ -103,6 +103,7 @@ app:liftOnScroll="true" android:background="@null" android:elevation="0dp" + android:fitsSystemWindows="true" app:elevation="0dp" android:layout_width="match_parent" android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout/active_download_card.xml b/app/src/main/res/layout/active_download_card.xml index 4d6fa16e..1fce7ca5 100644 --- a/app/src/main/res/layout/active_download_card.xml +++ b/app/src/main/res/layout/active_download_card.xml @@ -199,7 +199,7 @@ + android:layout_height="wrap_content"> - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/download_card.xml b/app/src/main/res/layout/download_card.xml index b0dad708..1c97e79b 100644 --- a/app/src/main/res/layout/download_card.xml +++ b/app/src/main/res/layout/download_card.xml @@ -7,6 +7,7 @@ android:clickable="true" android:focusable="true" app:checkedIcon="@null" + app:strokeColor="?attr/colorPrimary" app:cardPreventCornerOverlap="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_download_video.xml b/app/src/main/res/layout/fragment_download_video.xml index a62d2984..a9131d37 100644 --- a/app/src/main/res/layout/fragment_download_video.xml +++ b/app/src/main/res/layout/fragment_download_video.xml @@ -256,6 +256,21 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index d1f81b26..b4ce6e26 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -104,6 +104,7 @@ android:background="@null" android:elevation="0dp" app:elevation="0dp" + android:fitsSystemWindows="true" android:layout_width="match_parent" android:layout_height="wrap_content"> @@ -124,49 +125,53 @@ - - + android:layout_height="wrap_content"> - - - - + + - + - + - + - + - + + + - + - + + + diff --git a/app/src/main/res/navigation/settings_nav.xml b/app/src/main/res/navigation/settings_nav.xml index 94104c7f..edcdc179 100644 --- a/app/src/main/res/navigation/settings_nav.xml +++ b/app/src/main/res/navigation/settings_nav.xml @@ -4,7 +4,7 @@ app:startDestination="@id/mainSettingsFragment"> Socks5 Proxy URL Search Suggestions Get search suggestions from google - Selec the format with this ID in the download card + Select the format with this ID in the download card + Misc + General + Swipe Gestures + Swipe items for certain actions \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 80419eb1..a75b93fb 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -63,5 +63,4 @@ 2 slide - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d58d66f1..18830c91 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -6,7 +6,7 @@ @style/ThemeOverlay.Material3.MaterialAlertDialog 28dp true - @style/ThemeOverlay.Material3.Dark.ActionBar + @style/ThemeOverlay.Material3.Light true @style/Preference.SwitchPreferenceCompat.Material3 @style/snackBarStyle diff --git a/app/src/main/res/xml/appearance_preferences.xml b/app/src/main/res/xml/appearance_preferences.xml deleted file mode 100644 index 1e14aaa0..00000000 --- a/app/src/main/res/xml/appearance_preferences.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/general_preferences.xml b/app/src/main/res/xml/general_preferences.xml new file mode 100644 index 00000000..ef0db7bf --- /dev/null +++ b/app/src/main/res/xml/general_preferences.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/processing_preferences.xml b/app/src/main/res/xml/processing_preferences.xml index 42c40cea..084f3af3 100644 --- a/app/src/main/res/xml/processing_preferences.xml +++ b/app/src/main/res/xml/processing_preferences.xml @@ -57,6 +57,15 @@ app:summary="@string/save_subs_desc" app:title="@string/save_subs" /> + + + app:icon="@drawable/ic_settings" + android:title="@string/general"/>