added navigation component & command chip in history fragment
This commit is contained in:
parent
1eca31ab5d
commit
660cab7702
19 changed files with 285 additions and 178 deletions
|
|
@ -125,8 +125,9 @@ dependencies {
|
|||
implementation 'androidx.core:core:1.9.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.3.0'
|
||||
implementation 'androidx.preference:preference:1.2.0'
|
||||
implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"
|
||||
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
|
||||
implementation "androidx.navigation:navigation-fragment-ktx:$navVer"
|
||||
implementation "androidx.navigation:navigation-ui-ktx:$navVer"
|
||||
implementation "androidx.navigation:navigation-dynamic-features-fragment:$navVer"
|
||||
implementation 'androidx.core:core-ktx:1.9.0'
|
||||
implementation 'androidx.core:core-ktx:1.9.0'
|
||||
implementation 'androidx.test.ext:junit-ktx:1.1.5'
|
||||
|
|
@ -139,6 +140,7 @@ dependencies {
|
|||
androidTestImplementation "androidx.test:runner:1.5.2"
|
||||
androidTestImplementation "androidx.test:core:1.5.0"
|
||||
androidTestImplementation "androidx.test:rules:1.5.0"
|
||||
androidTestImplementation "androidx.navigation:navigation-testing:$navVer"
|
||||
|
||||
implementation "io.reactivex.rxjava2:rxandroid:2.1.0"
|
||||
implementation "com.devbrackets.android:exomedia:4.3.0"
|
||||
|
|
|
|||
|
|
@ -25,6 +25,12 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.navigation.findNavController
|
||||
import androidx.navigation.fragment.NavHostFragment
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.navigation.ui.AppBarConfiguration
|
||||
import androidx.navigation.ui.setupActionBarWithNavController
|
||||
import androidx.navigation.ui.setupWithNavController
|
||||
import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel
|
||||
import com.deniscerri.ytdlnis.databinding.ActivityMainBinding
|
||||
import com.deniscerri.ytdlnis.ui.HomeFragment
|
||||
|
|
@ -33,6 +39,8 @@ import com.deniscerri.ytdlnis.ui.downloads.HistoryFragment
|
|||
import com.deniscerri.ytdlnis.ui.more.MoreFragment
|
||||
import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity
|
||||
import com.deniscerri.ytdlnis.util.UpdateUtil
|
||||
import com.google.android.material.appbar.MaterialToolbar
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
|
@ -48,20 +56,17 @@ import kotlin.system.exitProcess
|
|||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: ActivityMainBinding
|
||||
lateinit var context: Context
|
||||
private lateinit var homeFragment: HomeFragment
|
||||
private lateinit var historyFragment: HistoryFragment
|
||||
private lateinit var preferences: SharedPreferences
|
||||
private lateinit var resultViewModel: ResultViewModel
|
||||
private lateinit var bottomNav: BottomNavigationView
|
||||
private lateinit var navHostFragment : NavHostFragment
|
||||
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
setContentView(R.layout.activity_main)
|
||||
setContentView(binding.root)
|
||||
context = baseContext
|
||||
resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java]
|
||||
preferences = context.getSharedPreferences("root_preferences", MODE_PRIVATE)
|
||||
|
|
@ -72,56 +77,50 @@ class MainActivity : AppCompatActivity() {
|
|||
|
||||
askPermissions()
|
||||
checkUpdate()
|
||||
fm = supportFragmentManager
|
||||
|
||||
homeFragment = HomeFragment()
|
||||
historyFragment = HistoryFragment()
|
||||
moreFragment = MoreFragment()
|
||||
initFragments()
|
||||
binding.bottomNavigationView.setOnItemSelectedListener { item: MenuItem ->
|
||||
when (item.itemId) {
|
||||
R.id.home -> {
|
||||
if (lastFragment === homeFragment) {
|
||||
homeFragment.scrollToTop()
|
||||
} else {
|
||||
this.setTitle(R.string.app_name)
|
||||
}
|
||||
replaceFragment(homeFragment)
|
||||
}
|
||||
R.id.history -> {
|
||||
if (lastFragment === historyFragment) {
|
||||
val intent = Intent(context, DownloadQueueActivity::class.java)
|
||||
startActivity(intent)
|
||||
} else {
|
||||
this.title = getString(R.string.downloads)
|
||||
}
|
||||
replaceFragment(historyFragment)
|
||||
}
|
||||
R.id.more -> {
|
||||
if (lastFragment === moreFragment) {
|
||||
val intent = Intent(context, SettingsActivity::class.java)
|
||||
startActivity(intent)
|
||||
} else {
|
||||
this.title = getString(R.string.more)
|
||||
}
|
||||
replaceFragment(moreFragment)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
navHostFragment = supportFragmentManager.findFragmentById(R.id.frame_layout) as NavHostFragment
|
||||
val navController = navHostFragment.findNavController()
|
||||
bottomNav = findViewById(R.id.bottomNavigationView)
|
||||
|
||||
window.decorView.setOnApplyWindowInsetsListener { view: View, windowInsets: WindowInsets? ->
|
||||
val windowInsetsCompat = WindowInsetsCompat.toWindowInsetsCompat(
|
||||
windowInsets!!, view
|
||||
)
|
||||
val isImeVisible = windowInsetsCompat.isVisible(WindowInsetsCompat.Type.ime())
|
||||
binding.bottomNavigationView.visibility =
|
||||
bottomNav.visibility =
|
||||
if (isImeVisible) View.GONE else View.VISIBLE
|
||||
view.onApplyWindowInsets(windowInsets)
|
||||
}
|
||||
|
||||
bottomNav.setupWithNavController(navController)
|
||||
bottomNav.setOnItemReselectedListener {
|
||||
when (it.itemId) {
|
||||
R.id.homeFragment -> {
|
||||
(navHostFragment.childFragmentManager.primaryNavigationFragment!! as HomeFragment).scrollToTop()
|
||||
}
|
||||
R.id.historyFragment -> {
|
||||
val intent = Intent(context, DownloadQueueActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
R.id.moreFragment -> {
|
||||
val intent = Intent(context, SettingsActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val intent = intent
|
||||
handleIntents(intent)
|
||||
}
|
||||
|
||||
fun hideNav() {
|
||||
bottomNav.visibility = View.GONE
|
||||
}
|
||||
|
||||
fun showNav() {
|
||||
bottomNav.visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
val incognitoHeader = findViewById<TextView>(R.id.incognito_header)
|
||||
|
|
@ -144,9 +143,6 @@ class MainActivity : AppCompatActivity() {
|
|||
val type = intent.type
|
||||
if (Intent.ACTION_SEND == action && type != null) {
|
||||
Log.e(TAG, action)
|
||||
homeFragment = HomeFragment()
|
||||
historyFragment = HistoryFragment()
|
||||
moreFragment = MoreFragment()
|
||||
if (type.equals("application/txt", ignoreCase = true)) {
|
||||
try {
|
||||
val uri = if (Build.VERSION.SDK_INT >= 33){
|
||||
|
|
@ -169,33 +165,16 @@ class MainActivity : AppCompatActivity() {
|
|||
}
|
||||
val l = listOf(*textBuilder.toString().split("\n").toTypedArray())
|
||||
val lines = LinkedList(l)
|
||||
homeFragment.handleFileIntent(lines)
|
||||
(navHostFragment.childFragmentManager.primaryNavigationFragment!! as HomeFragment).handleFileIntent(lines)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
} else {
|
||||
homeFragment.handleIntent(intent)
|
||||
(navHostFragment.childFragmentManager.primaryNavigationFragment!! as HomeFragment).handleIntent(intent)
|
||||
}
|
||||
initFragments()
|
||||
}
|
||||
}
|
||||
|
||||
private fun initFragments() {
|
||||
fm.beginTransaction()
|
||||
.replace(R.id.frame_layout, homeFragment)
|
||||
.add(R.id.frame_layout, historyFragment)
|
||||
.add(R.id.frame_layout, moreFragment)
|
||||
.hide(historyFragment)
|
||||
.hide(moreFragment)
|
||||
.commit()
|
||||
lastFragment = homeFragment
|
||||
}
|
||||
|
||||
private fun replaceFragment(f: Fragment) {
|
||||
fm.beginTransaction().hide(lastFragment).show(f).commit()
|
||||
lastFragment = f
|
||||
}
|
||||
|
||||
|
||||
private fun checkUpdate() {
|
||||
if (preferences.getBoolean("update_app", false)) {
|
||||
|
|
@ -301,8 +280,5 @@ class MainActivity : AppCompatActivity() {
|
|||
|
||||
companion object {
|
||||
private const val TAG = "MainActivity"
|
||||
private lateinit var moreFragment: MoreFragment
|
||||
private lateinit var lastFragment: Fragment
|
||||
private lateinit var fm: FragmentManager
|
||||
}
|
||||
}
|
||||
|
|
@ -37,7 +37,7 @@ class DownloadRepository(private val downloadDao: DownloadDao) {
|
|||
|
||||
suspend fun setDownloadStatus(item: DownloadItem, status: Status){
|
||||
item.status = status.toString()
|
||||
update(item);
|
||||
update(item)
|
||||
}
|
||||
|
||||
fun getItemByID(id: Long) : DownloadItem {
|
||||
|
|
@ -56,14 +56,6 @@ class DownloadRepository(private val downloadDao: DownloadDao) {
|
|||
downloadDao.deleteQueued()
|
||||
}
|
||||
|
||||
suspend fun deleteSingleProcessing(item: DownloadItem){
|
||||
downloadDao.deleteSingleProcessing(item.id)
|
||||
}
|
||||
|
||||
suspend fun queueAllProcessing(){
|
||||
downloadDao.queueAllProcessing()
|
||||
}
|
||||
|
||||
fun checkIfPresentForProcessing(item: ResultItem): DownloadItem{
|
||||
return downloadDao.checkIfErrorOrCancelled(item.url)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,7 +63,4 @@ class HistoryRepository(private val historyDao: HistoryDao) {
|
|||
}
|
||||
}
|
||||
|
||||
suspend fun checkDownloaded(){
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -109,7 +109,7 @@ class ResultViewModel(application: Application) : AndroidViewModel(application)
|
|||
}
|
||||
|
||||
fun update(item: ResultItem) = viewModelScope.launch(Dispatchers.IO){
|
||||
repository.update(item);
|
||||
repository.update(item)
|
||||
}
|
||||
|
||||
fun getItemByURL(url: String) : ResultItem {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import android.util.Log
|
|||
import android.view.*
|
||||
import android.widget.Button
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
|
@ -32,11 +33,6 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||
import com.google.android.material.button.MaterialButton
|
||||
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.timepicker.MaterialTimePicker
|
||||
import com.google.android.material.timepicker.TimeFormat
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
|
@ -149,9 +145,9 @@ class DownloadMultipleBottomSheetDialog(private var items: MutableList<DownloadI
|
|||
bottomSheet.setContentView(R.layout.download_type_sheet)
|
||||
|
||||
// BUTTON ----------------------------------
|
||||
val audio = bottomSheet.findViewById<LinearLayout>(R.id.audio)
|
||||
val video = bottomSheet.findViewById<LinearLayout>(R.id.video)
|
||||
val command = bottomSheet.findViewById<LinearLayout>(R.id.command)
|
||||
val audio = bottomSheet.findViewById<TextView>(R.id.audio)
|
||||
val video = bottomSheet.findViewById<TextView>(R.id.video)
|
||||
val command = bottomSheet.findViewById<TextView>(R.id.command)
|
||||
|
||||
|
||||
withContext(Dispatchers.IO){
|
||||
|
|
|
|||
|
|
@ -12,12 +12,10 @@ import android.view.Window
|
|||
import android.widget.AdapterView
|
||||
import android.widget.AdapterView.OnItemClickListener
|
||||
import android.widget.Button
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
|
@ -33,12 +31,11 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
|
|||
import com.google.android.material.button.MaterialButton
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import java.io.File
|
||||
|
||||
|
||||
class ErroredDownloadsFragment() : Fragment(), GenericDownloadAdapter.OnItemClickListener, OnItemClickListener {
|
||||
class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickListener, OnItemClickListener {
|
||||
private var _binding : FragmentHomeBinding? = null
|
||||
private var fragmentView: View? = null
|
||||
private var activity: Activity? = null
|
||||
|
|
@ -195,7 +192,7 @@ class ErroredDownloadsFragment() : Fragment(), GenericDownloadAdapter.OnItemClic
|
|||
|
||||
private fun removeItem(item: DownloadItem, bottomSheet: BottomSheetDialog?){
|
||||
bottomSheet?.hide()
|
||||
val deleteDialog = MaterialAlertDialogBuilder(requireContext()!!)
|
||||
val deleteDialog = MaterialAlertDialogBuilder(requireContext())
|
||||
deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + item.title + "\"!")
|
||||
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
|
||||
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->
|
||||
|
|
|
|||
|
|
@ -3,22 +3,20 @@ package com.deniscerri.ytdlnis.ui.downloads
|
|||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
import android.content.res.Configuration
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.InputType
|
||||
import android.text.format.DateUtils
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import android.view.View.*
|
||||
import android.view.View.GONE
|
||||
import android.view.View.VISIBLE
|
||||
import android.widget.*
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
|
@ -42,13 +40,10 @@ import com.google.android.material.chip.Chip
|
|||
import com.google.android.material.chip.ChipGroup
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import java.io.File
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
/**
|
||||
* A fragment representing a list of Items.
|
||||
|
|
@ -130,7 +125,6 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
|
|||
recyclerView?.adapter = historyAdapter
|
||||
|
||||
noResults?.visibility = GONE
|
||||
selectionChips?.visibility = VISIBLE
|
||||
shimmerCards?.visibility = GONE
|
||||
|
||||
|
||||
|
|
@ -325,6 +319,16 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
|
|||
video.isChecked = false
|
||||
}
|
||||
}
|
||||
val command = fragmentView!!.findViewById<Chip>(R.id.command_chip)
|
||||
command.setOnClickListener {
|
||||
if (command.isChecked) {
|
||||
historyViewModel.setFormatFilter("command")
|
||||
command.isChecked = true
|
||||
} else {
|
||||
historyViewModel.setFormatFilter("")
|
||||
command.isChecked = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateWebsiteChips(list : List<HistoryItem>) {
|
||||
|
|
@ -419,7 +423,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
|
|||
}
|
||||
|
||||
if (isPresent){
|
||||
btn!!.setOnClickListener {
|
||||
btn.setOnClickListener {
|
||||
uiUtil!!.shareFileIntent(requireContext(),item.downloadPath)
|
||||
}
|
||||
}
|
||||
|
|
@ -439,7 +443,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
|
|||
else formatNote!!.text = item.format.format_note
|
||||
|
||||
if (item.format.container != "") container!!.text = item.format.container.uppercase()
|
||||
else container!!.visibility = View.GONE
|
||||
else container!!.visibility = GONE
|
||||
|
||||
val codecText =
|
||||
if (item.format.encoding != "") {
|
||||
|
|
|
|||
|
|
@ -1,17 +1,78 @@
|
|||
package com.deniscerri.ytdlnis.ui.more
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.navigation.Navigation
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import com.deniscerri.ytdlnis.MainActivity
|
||||
import com.deniscerri.ytdlnis.R
|
||||
import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding
|
||||
import com.deniscerri.ytdlnis.ui.downloads.DownloadQueueActivity
|
||||
import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogListActivity
|
||||
import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity
|
||||
|
||||
class MoreFragment : PreferenceFragmentCompat() {
|
||||
class MoreFragment : Fragment() {
|
||||
private lateinit var mainSharedPreferences: SharedPreferences
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
setPreferencesFromResource(R.xml.more_preferences, rootKey)
|
||||
private lateinit var terminal: TextView
|
||||
private lateinit var logs: TextView
|
||||
private lateinit var commandTemplates: TextView
|
||||
private lateinit var downloadQueue: TextView
|
||||
private lateinit var settings: TextView
|
||||
private lateinit var mainActivity: MainActivity
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
mainActivity = activity as MainActivity
|
||||
return inflater.inflate(R.layout.fragment_more, container, false)
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
mainSharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE)
|
||||
terminal = view.findViewById(R.id.terminal)
|
||||
logs = view.findViewById(R.id.logs)
|
||||
commandTemplates = view.findViewById(R.id.command_templates)
|
||||
downloadQueue = view.findViewById(R.id.download_queue)
|
||||
settings = view.findViewById(R.id.settings)
|
||||
|
||||
val navHostFragment = parentFragmentManager.findFragmentById(R.id.frame_layout)
|
||||
|
||||
terminal.setOnClickListener {
|
||||
val intent = Intent(context, TerminalActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
logs.setOnClickListener {
|
||||
val intent = Intent(context, DownloadLogListActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
commandTemplates.setOnClickListener {
|
||||
val intent = Intent(context, CommandTemplatesActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
downloadQueue.setOnClickListener {
|
||||
val intent = Intent(context, DownloadQueueActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
settings.setOnClickListener {
|
||||
val intent = Intent(context, SettingsActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
|
@ -20,7 +81,11 @@ class MoreFragment : PreferenceFragmentCompat() {
|
|||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
findPreference<Preference>("download_logs")!!.isVisible =
|
||||
mainSharedPreferences.getBoolean("log_downloads", false)
|
||||
if (mainSharedPreferences.getBoolean("log_downloads", false)) {
|
||||
logs.visibility = View.VISIBLE
|
||||
}else {
|
||||
logs.visibility = View.GONE
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -58,7 +58,7 @@ class TerminalActivity : AppCompatActivity() {
|
|||
fab = findViewById(R.id.command_fab)
|
||||
fab!!.setOnClickListener {
|
||||
input!!.visibility = View.GONE
|
||||
output!!.text = "${output!!.text}\n~ $ ${input!!.text}\n";
|
||||
output!!.text = "${output!!.text}\n~ $ ${input!!.text}\n"
|
||||
swapFabs()
|
||||
startDownload(
|
||||
input!!.text.toString()
|
||||
|
|
|
|||
|
|
@ -16,10 +16,7 @@ import com.deniscerri.ytdlnis.R
|
|||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.yausername.youtubedl_android.YoutubeDL
|
||||
import com.yausername.youtubedl_android.YoutubeDL.UpdateStatus
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.json.JSONException
|
||||
|
|
@ -28,12 +25,10 @@ import java.io.BufferedReader
|
|||
import java.io.InputStreamReader
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
import java.util.concurrent.atomic.AtomicReference
|
||||
|
||||
class UpdateUtil(var context: Context) {
|
||||
private val tag = "UpdateUtil"
|
||||
private val downloadManager: DownloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
|
||||
private val compositeDisposable = CompositeDisposable()
|
||||
private val ytdlpNightly = "https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest"
|
||||
|
||||
fun updateApp(): Boolean {
|
||||
|
|
|
|||
|
|
@ -20,14 +20,18 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<FrameLayout
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
android:id="@+id/frame_layout"
|
||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
app:defaultNavHost="true"
|
||||
app:navGraph="@navigation/nav_graph"
|
||||
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/incognito_header" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/incognito_header"
|
||||
/>
|
||||
|
||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
android:id="@+id/bottomNavigationView"
|
||||
|
|
|
|||
|
|
@ -21,70 +21,46 @@
|
|||
android:paddingBottom="20dp"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<LinearLayout
|
||||
<TextView
|
||||
android:id="@+id/audio"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingVertical="10dp"
|
||||
android:drawablePadding="30dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="20dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:src="@drawable/ic_music"/>
|
||||
android:textSize="15sp"
|
||||
android:text="@string/audio"
|
||||
app:drawableLeftCompat="@drawable/ic_music" />
|
||||
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="15sp"
|
||||
android:text="@string/audio" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
<TextView
|
||||
android:id="@+id/video"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingVertical="10dp"
|
||||
android:drawablePadding="30dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="20dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:src="@drawable/ic_video"/>
|
||||
android:textSize="15sp"
|
||||
android:text="@string/video"
|
||||
app:drawableLeftCompat="@drawable/ic_video" />
|
||||
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="15sp"
|
||||
android:text="@string/video" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
<TextView
|
||||
android:id="@+id/command"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:paddingVertical="10dp"
|
||||
android:drawablePadding="30dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="20dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:src="@drawable/ic_terminal"/>
|
||||
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="15sp"
|
||||
android:text="@string/command" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
android:textSize="15sp"
|
||||
android:text="@string/command"
|
||||
app:drawableLeftCompat="@drawable/ic_terminal" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/historycoordinator"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
|
|
@ -41,6 +41,7 @@
|
|||
<LinearLayout
|
||||
android:id="@+id/history_selection_chips"
|
||||
android:layout_width="wrap_content"
|
||||
android:visibility="gone"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.chip.ChipGroup
|
||||
|
|
@ -54,7 +55,6 @@
|
|||
style="@style/Widget.Material3.Chip.Assist"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:onClick="sortBy"
|
||||
android:text="@string/sort_by"
|
||||
app:chipIcon="@drawable/ic_down" />
|
||||
|
||||
|
|
@ -83,6 +83,13 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:text="@string/video"/>
|
||||
|
||||
<com.google.android.material.chip.Chip
|
||||
android:id="@+id/command_chip"
|
||||
style="@style/Widget.Material3.Chip.Filter"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/command"/>
|
||||
|
||||
</com.google.android.material.chip.ChipGroup>
|
||||
|
||||
<View style="@style/Divider.Vertical"/>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/history_no_results"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="200dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="top"
|
||||
android:orientation="vertical"
|
||||
tools:ignore="MissingConstraints">
|
||||
|
|
@ -19,6 +19,70 @@
|
|||
android:layout_gravity="center"
|
||||
android:background="@drawable/ic_app_icon"
|
||||
android:scaleType="center" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/terminal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/terminal"
|
||||
android:textStyle="bold"
|
||||
android:paddingHorizontal="15dp"
|
||||
android:paddingVertical="15dp"
|
||||
android:drawablePadding="35dp"
|
||||
android:textSize="16sp"
|
||||
app:drawableLeftCompat="@drawable/ic_terminal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/logs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/logs"
|
||||
android:textStyle="bold"
|
||||
android:paddingHorizontal="15dp"
|
||||
android:paddingVertical="15dp"
|
||||
android:drawablePadding="35dp"
|
||||
android:textSize="16sp"
|
||||
app:drawableLeftCompat="@drawable/ic_baseline_file_open_24" />
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/command_templates"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:drawablePadding="35dp"
|
||||
android:textSize="16sp"
|
||||
android:paddingVertical="15dp"
|
||||
android:text="@string/command_templates"
|
||||
android:textStyle="bold"
|
||||
android:paddingHorizontal="15dp"
|
||||
app:drawableLeftCompat="@drawable/ic_baseline_keyboard_arrow_right_24" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/download_queue"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:drawablePadding="35dp"
|
||||
android:textSize="16sp"
|
||||
android:paddingVertical="15dp"
|
||||
android:text="@string/download_queue"
|
||||
android:textStyle="bold"
|
||||
android:paddingHorizontal="15dp"
|
||||
app:drawableLeftCompat="@drawable/ic_concurrent_downloads" />
|
||||
|
||||
<View style="@style/Divider.Horizontal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/settings"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:drawablePadding="35dp"
|
||||
android:textSize="16sp"
|
||||
android:paddingVertical="15dp"
|
||||
android:text="@string/settings"
|
||||
android:textStyle="bold"
|
||||
android:paddingHorizontal="15dp"
|
||||
app:drawableLeftCompat="@drawable/ic_settings" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
|
||||
<item android:title="@string/home"
|
||||
android:icon="@drawable/ic_home"
|
||||
android:id="@+id/home"/>
|
||||
android:id="@+id/homeFragment"/>
|
||||
<item android:title="@string/downloads"
|
||||
android:icon="@drawable/ic_downloads"
|
||||
android:id="@+id/history"/>
|
||||
android:id="@+id/historyFragment"/>
|
||||
<item android:title="@string/more"
|
||||
android:icon="@drawable/ic_more"
|
||||
android:id="@+id/more"/>
|
||||
android:id="@+id/moreFragment"/>
|
||||
</menu>
|
||||
32
app/src/main/res/navigation/nav_graph.xml
Normal file
32
app/src/main/res/navigation/nav_graph.xml
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/nav_graph"
|
||||
android:label="@string/more"
|
||||
app:startDestination="@id/homeFragment">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/homeFragment"
|
||||
android:name="com.deniscerri.ytdlnis.ui.HomeFragment"
|
||||
android:label="@string/app_name"
|
||||
tools:layout="@layout/fragment_home" />
|
||||
<fragment
|
||||
android:id="@+id/historyFragment"
|
||||
android:name="com.deniscerri.ytdlnis.ui.downloads.HistoryFragment"
|
||||
android:label="@string/downloads"
|
||||
tools:layout="@layout/fragment_history" />
|
||||
<fragment
|
||||
android:id="@+id/moreFragment"
|
||||
android:name="com.deniscerri.ytdlnis.ui.more.MoreFragment"
|
||||
android:label="More"
|
||||
tools:layout="@layout/fragment_more" >
|
||||
<action
|
||||
android:id="@+id/action_moreFragment_to_settingsFragment"
|
||||
app:destination="@id/settingsFragment" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/settingsFragment"
|
||||
android:name="com.deniscerri.ytdlnis.ui.more.settings.SettingsFragment"
|
||||
android:label="SettingsFragment" />
|
||||
</navigation>
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
<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"
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ buildscript {
|
|||
coroutineVer = "1.6.4"
|
||||
retrofitVer = "2.9.0"
|
||||
kodeinVer = "7.16.0"
|
||||
navVer = "2.5.3"
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
|
|
|||
Loading…
Reference in a new issue