added swipe gestures as a preference & made deleted queued items move to cancelled instead of deleting completely
This commit is contained in:
parent
aadac439f3
commit
e62b2e6246
49 changed files with 366 additions and 259 deletions
7
app/proguard-rules.pro
vendored
7
app/proguard-rules.pro
vendored
|
|
@ -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 <fields>;
|
||||
}
|
||||
-keepclassmembers class <1> {
|
||||
static <1>$Companion Companion;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<TextView>(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<MaterialButton>(R.id.download_type)
|
||||
when(item.type){
|
||||
|
|
|
|||
|
|
@ -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<TextView>(R.id.format_note)
|
||||
if (item.format.format_note == "?" || item.format.format_note == "") formatNote!!.visibility =
|
||||
|
|
|
|||
|
|
@ -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<SearchHistoryItem>
|
||||
|
||||
@Query("SELECT * from searchHistory WHERE `query` COLLATE NOCASE ='%'||:keyword||'%'")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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<Format>()
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<Format>()
|
||||
formats.addAll(resultItem.formats)
|
||||
|
|
@ -358,6 +357,7 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr
|
|||
|
||||
val saveSubtitles = view.findViewById<Chip>(R.id.save_subtitles)
|
||||
val subtitleLanguages = view.findViewById<Chip>(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<EditText>(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<Chip>(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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<DownloadItem?>, p
|
|||
|
||||
okBtn.setOnClickListener {
|
||||
val selectedFormats = mutableListOf<Format>()
|
||||
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<DownloadItem?>, 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<DownloadItem?>, 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<DownloadItem?>, p
|
|||
true
|
||||
}
|
||||
|
||||
if (isSingleAndVideo){
|
||||
if (canMultiSelectAudio){
|
||||
if (format.vcodec.isNotBlank() && format.vcodec != "none") videoFormatList.addView(formatItem)
|
||||
else audioFormatList.addView(formatItem)
|
||||
}else{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<TextInputLayout>(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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<TextView>(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<EditText>(R.id.url_edittext)
|
||||
inputLayout.findViewById<TextInputLayout>(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
|
||||
|
|
|
|||
5
app/src/main/res/drawable/baseline_subject_24.xml
Normal file
5
app/src/main/res/drawable/baseline_subject_24.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<vector android:autoMirrored="true" android:height="24dp"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="?android:colorAccent" android:pathData="M14,17L4,17v2h10v-2zM20,9L4,9v2h16L20,9zM4,15h16v-2L4,13v2zM4,5v2h16L20,5L4,5z"/>
|
||||
</vector>
|
||||
6
app/src/main/res/drawable/baseline_swipe_24.xml
Normal file
6
app/src/main/res/drawable/baseline_swipe_24.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<vector android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="?android:colorAccent" android:pathData="M18.89,14.75l-4.09,-2.04c-0.28,-0.14 -0.58,-0.21 -0.89,-0.21H13v-6C13,5.67 12.33,5 11.5,5S10,5.67 10,6.5v10.74L6.75,16.5c-0.33,-0.07 -0.68,0.03 -0.92,0.28L5,17.62l4.54,4.79C9.92,22.79 10.68,23 11.21,23h6.16c1,0 1.84,-0.73 1.98,-1.72l0.63,-4.46C20.1,15.97 19.66,15.14 18.89,14.75z"/>
|
||||
<path android:fillColor="?android:colorAccent" android:pathData="M20.13,3.87C18.69,2.17 15.6,1 12,1S5.31,2.17 3.87,3.87L2,2v5h5L4.93,4.93c1,-1.29 3.7,-2.43 7.07,-2.43s6.07,1.14 7.07,2.43L17,7h5V2L20.13,3.87z"/>
|
||||
</vector>
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -199,7 +199,7 @@
|
|||
<TextView
|
||||
android:id="@+id/output"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="40dp"
|
||||
android:layout_height="45dp"
|
||||
android:clickable="true"
|
||||
android:ellipsize="end"
|
||||
android:focusable="true"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity">
|
||||
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
|
|
@ -23,8 +25,7 @@
|
|||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
android:id="@+id/collapsing_toolbar"
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/inputLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="15dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginBottom="10dp">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/input"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="text" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -256,6 +256,21 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</com.google.android.material.chip.ChipGroup>
|
||||
|
||||
</HorizontalScrollView>
|
||||
|
||||
<HorizontalScrollView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scrollbars="none">
|
||||
|
||||
<com.google.android.material.chip.ChipGroup
|
||||
android:scrollbars="none"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/save_subtitles"
|
||||
style="@style/Widget.Material3.Chip.Filter.Elevated"
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
android:elevation="0dp"
|
||||
app:liftOnScrollTargetViewId="@id/recyclerviewhistorys"
|
||||
app:elevation="0dp"
|
||||
android:fitsSystemWindows="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
|
|
|||
|
|
@ -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 @@
|
|||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
<RelativeLayout
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/recyclerViewHome"
|
||||
android:orientation="vertical"
|
||||
android:layout_height="wrap_content"
|
||||
android:scrollbars="vertical"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:clipToPadding="false"
|
||||
android:paddingBottom="100dp"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
/>
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
||||
<com.facebook.shimmer.ShimmerFrameLayout
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/shimmer_results_framelayout"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/recyclerViewHome"
|
||||
android:orientation="vertical"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:scrollbars="vertical"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:clipToPadding="false"
|
||||
android:paddingBottom="100dp"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
/>
|
||||
|
||||
<com.facebook.shimmer.ShimmerFrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_below="@id/recyclerViewHome"
|
||||
android:id="@+id/shimmer_results_framelayout"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="10dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
|
||||
<include layout="@layout/result_card_shimmer" />
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</com.facebook.shimmer.ShimmerFrameLayout>
|
||||
</com.facebook.shimmer.ShimmerFrameLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/home_fabs"
|
||||
|
|
|
|||
|
|
@ -18,8 +18,9 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:cardCornerRadius="20dp"
|
||||
app:checkedIcon="@null"
|
||||
app:cardElevation="5dp"
|
||||
app:strokeColor="?attr/colorPrimary"
|
||||
app:checkedIconTint="?attr/colorPrimary"
|
||||
app:cardMaxElevation="12dp"
|
||||
app:cardPreventCornerOverlap="true"
|
||||
android:checkable="true"
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
android:background="@android:color/transparent"
|
||||
android:elevation="0dp"
|
||||
app:elevation="0dp"
|
||||
android:fitsSystemWindows="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
app:startDestination="@id/mainSettingsFragment">
|
||||
<fragment
|
||||
android:id="@+id/appearanceSettingsFragment"
|
||||
android:name="com.deniscerri.ytdlnis.ui.more.settings.AppearanceSettingsFragment"
|
||||
android:name="com.deniscerri.ytdlnis.ui.more.settings.GeneralSettingsFragment"
|
||||
android:label="AppearanceSettingsFragment" />
|
||||
<fragment
|
||||
android:id="@+id/processingSettingsFragment"
|
||||
|
|
|
|||
|
|
@ -264,5 +264,9 @@
|
|||
<string name="socks5_proxy">Socks5 Proxy URL</string>
|
||||
<string name="search_suggestions">Search Suggestions</string>
|
||||
<string name="search_suggestions_summary">Get search suggestions from google</string>
|
||||
<string name="preferred_format_id_summary">Selec the format with this ID in the download card</string>
|
||||
<string name="preferred_format_id_summary">Select the format with this ID in the download card</string>
|
||||
<string name="misc">Misc</string>
|
||||
<string name="general">General</string>
|
||||
<string name="swipe_gestures">Swipe Gestures</string>
|
||||
<string name="swipe_gestures_summary">Swipe items for certain actions</string>
|
||||
</resources>
|
||||
|
|
@ -63,5 +63,4 @@
|
|||
<item name="maxLines">2</item>
|
||||
<item name="animationMode">slide</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<item name="alertDialogTheme">@style/ThemeOverlay.Material3.MaterialAlertDialog</item>
|
||||
<item name="dialogCornerRadius">28dp</item>
|
||||
<item name="windowActionModeOverlay">true</item>
|
||||
<item name="actionBarTheme">@style/ThemeOverlay.Material3.Dark.ActionBar</item>
|
||||
<item name="actionBarTheme">@style/ThemeOverlay.Material3.Light</item>
|
||||
<item name="android:windowLightNavigationBar" tools:ignore="NewApi">true</item>
|
||||
<item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat.Material3</item>
|
||||
<item name="snackbarStyle">@style/snackBarStyle</item>
|
||||
|
|
|
|||
|
|
@ -1,84 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
|
||||
<ListPreference
|
||||
android:entries="@array/language_values"
|
||||
android:entryValues="@array/language_values"
|
||||
android:icon="@drawable/baseline_translate_24"
|
||||
app:key="app_language"
|
||||
app:summary="en"
|
||||
app:title="@string/language" />
|
||||
|
||||
<ListPreference
|
||||
android:entries="@array/themes"
|
||||
android:entryValues="@array/themes_values"
|
||||
android:icon="@drawable/baseline_format_paint_24"
|
||||
app:defaultValue="System"
|
||||
app:key="ytdlnis_theme"
|
||||
app:summary="@string/defaultValue"
|
||||
app:title="@string/Theme" />
|
||||
|
||||
<ListPreference
|
||||
android:entries="@array/accents"
|
||||
android:entryValues="@array/accents_values"
|
||||
android:icon="@drawable/baseline_color_lens_24"
|
||||
app:defaultValue="blue"
|
||||
app:key="theme_accent"
|
||||
app:summary="Blue"
|
||||
app:title="@string/accents" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="false"
|
||||
android:icon="@drawable/baseline_invert_colors_24"
|
||||
android:key="high_contrast"
|
||||
app:summary="@string/pure_theme_summary"
|
||||
app:title="@string/high_contrast" />
|
||||
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="false"
|
||||
android:icon="@drawable/baseline_recommend_24"
|
||||
android:key="home_recommendations"
|
||||
app:summary="@string/video_recommendations_summary"
|
||||
app:title="@string/video_recommendations" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="Home"
|
||||
android:entries="@array/start_destination"
|
||||
android:entryValues="@array/start_destination_values"
|
||||
app:icon="@drawable/baseline_add_to_home_screen_24"
|
||||
app:useSimpleSummaryProvider="true"
|
||||
app:key="start_destination"
|
||||
app:title="@string/preferred_home_screen" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="ytsearch"
|
||||
android:entries="@array/search_engines"
|
||||
android:entryValues="@array/search_engines_values"
|
||||
android:icon="@drawable/baseline_manage_search_24"
|
||||
app:key="search_engine"
|
||||
app:summary="@string/preferred_search_engine_summary"
|
||||
app:title="@string/preferred_search_engine" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="false"
|
||||
android:icon="@drawable/ic_search_accent"
|
||||
android:key="search_suggestions"
|
||||
app:summary="@string/search_suggestions_summary"
|
||||
app:title="@string/search_suggestions" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue=""
|
||||
android:entries="@array/countries"
|
||||
android:entryValues="@array/countries_values"
|
||||
app:icon="@drawable/ic_language"
|
||||
app:useSimpleSummaryProvider="true"
|
||||
app:dependency="home_recommendations"
|
||||
app:key="locale"
|
||||
app:title="@string/preferred_locale" />
|
||||
</PreferenceScreen>
|
||||
97
app/src/main/res/xml/general_preferences.xml
Normal file
97
app/src/main/res/xml/general_preferences.xml
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<PreferenceCategory android:title="Locale">
|
||||
<ListPreference
|
||||
android:entries="@array/language_values"
|
||||
android:entryValues="@array/language_values"
|
||||
android:icon="@drawable/baseline_translate_24"
|
||||
app:key="app_language"
|
||||
app:summary="en"
|
||||
app:title="@string/language" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue=""
|
||||
android:entries="@array/countries"
|
||||
android:entryValues="@array/countries_values"
|
||||
app:icon="@drawable/ic_language"
|
||||
app:useSimpleSummaryProvider="true"
|
||||
app:dependency="home_recommendations"
|
||||
app:key="locale"
|
||||
app:title="@string/preferred_locale" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/appearance">
|
||||
<ListPreference
|
||||
android:entries="@array/themes"
|
||||
android:entryValues="@array/themes_values"
|
||||
android:icon="@drawable/baseline_format_paint_24"
|
||||
app:defaultValue="System"
|
||||
app:key="ytdlnis_theme"
|
||||
app:summary="@string/defaultValue"
|
||||
app:title="@string/Theme" />
|
||||
|
||||
<ListPreference
|
||||
android:entries="@array/accents"
|
||||
android:entryValues="@array/accents_values"
|
||||
android:icon="@drawable/baseline_color_lens_24"
|
||||
app:defaultValue="blue"
|
||||
app:key="theme_accent"
|
||||
app:summary="Blue"
|
||||
app:title="@string/accents" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="false"
|
||||
android:icon="@drawable/baseline_invert_colors_24"
|
||||
android:key="high_contrast"
|
||||
app:summary="@string/pure_theme_summary"
|
||||
app:title="@string/high_contrast" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/misc">
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="false"
|
||||
android:icon="@drawable/baseline_recommend_24"
|
||||
android:key="home_recommendations"
|
||||
app:summary="@string/video_recommendations_summary"
|
||||
app:title="@string/video_recommendations" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="Home"
|
||||
android:entries="@array/start_destination"
|
||||
android:entryValues="@array/start_destination_values"
|
||||
app:icon="@drawable/baseline_add_to_home_screen_24"
|
||||
app:useSimpleSummaryProvider="true"
|
||||
app:key="start_destination"
|
||||
app:title="@string/preferred_home_screen" />
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="ytsearch"
|
||||
android:entries="@array/search_engines"
|
||||
android:entryValues="@array/search_engines_values"
|
||||
android:icon="@drawable/baseline_manage_search_24"
|
||||
app:key="search_engine"
|
||||
app:summary="@string/preferred_search_engine_summary"
|
||||
app:title="@string/preferred_search_engine" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="false"
|
||||
android:icon="@drawable/ic_search_accent"
|
||||
android:key="search_suggestions"
|
||||
app:summary="@string/search_suggestions_summary"
|
||||
app:title="@string/search_suggestions" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="true"
|
||||
android:icon="@drawable/baseline_swipe_24"
|
||||
android:key="swipe_gestures"
|
||||
app:summary="@string/swipe_gestures_summary"
|
||||
app:title="@string/swipe_gestures" />
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
|
@ -57,6 +57,15 @@
|
|||
app:summary="@string/save_subs_desc"
|
||||
app:title="@string/save_subs" />
|
||||
|
||||
<EditTextPreference
|
||||
android:icon="@drawable/baseline_subject_24"
|
||||
app:key="subs_lang"
|
||||
|
||||
android:dependency="write_subtitles"
|
||||
app:useSimpleSummaryProvider="true"
|
||||
app:defaultValue="en.*,.*-orig"
|
||||
app:title="@string/subtitle_languages" />
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:widgetLayout="@layout/preferece_material_switch"
|
||||
app:defaultValue="true"
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
<Preference
|
||||
android:key="appearance"
|
||||
app:icon="@drawable/baseline_format_paint_24"
|
||||
android:title="@string/appearance"/>
|
||||
app:icon="@drawable/ic_settings"
|
||||
android:title="@string/general"/>
|
||||
|
||||
<Preference
|
||||
android:key="folders"
|
||||
|
|
|
|||
Loading…
Reference in a new issue