converted most activities to fragments and added animation of hiding / showing bottom nav

This commit is contained in:
deniscerri 2023-05-16 20:54:56 +02:00
parent d1e6cc1bef
commit c28c2a6848
No known key found for this signature in database
GPG key ID: 95C43D517D830350
20 changed files with 274 additions and 233 deletions

View file

@ -69,39 +69,6 @@
<data android:mimeType="text/plain" /> <data android:mimeType="text/plain" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".ui.more.downloadLogs.DownloadLogListActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
android:exported="true"
android:parentActivityName=".MainActivity">
<intent-filter>
<action android:name="ytdlnis.downloadLogs.DownloadLogListActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ui.downloads.DownloadQueueActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
android:exported="true"
android:parentActivityName=".MainActivity">
<intent-filter>
<action android:name="ytdlnis.DownloadQueueActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ui.more.downloadLogs.DownloadLogActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
android:exported="true"
android:parentActivityName=".ui.more.downloadLogs.DownloadLogListActivity">
<intent-filter>
<action android:name="ytdlnis.downloadLogs.DownloadLogActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity <activity
android:name=".ui.more.settings.SettingsActivity" android:name=".ui.more.settings.SettingsActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize" android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
@ -131,31 +98,6 @@
<data android:mimeType="text/plain" /> <data android:mimeType="text/plain" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".ui.more.CommandTemplatesActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
android:exported="true"
android:parentActivityName=".MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="ytdlnis.CommandTemplatesActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ui.more.CookiesActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
android:exported="true"
android:parentActivityName=".MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="ytdlnis.CookiesActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity <activity
android:name=".ui.more.WebViewActivity" android:name=".ui.more.WebViewActivity"

View file

@ -1,6 +1,7 @@
package com.deniscerri.ytdlnis package com.deniscerri.ytdlnis
import android.Manifest import android.Manifest
import android.app.ActionBar.LayoutParams
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
@ -13,14 +14,18 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import androidx.drawerlayout.widget.DrawerLayout
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.FrameLayout
import android.widget.TextView import android.widget.TextView
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.forEach import androidx.core.view.forEach
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.FragmentContainerView
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
@ -32,10 +37,11 @@ import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel
import com.deniscerri.ytdlnis.ui.BaseActivity import com.deniscerri.ytdlnis.ui.BaseActivity
import com.deniscerri.ytdlnis.ui.HomeFragment import com.deniscerri.ytdlnis.ui.HomeFragment
import com.deniscerri.ytdlnis.ui.downloads.DownloadQueueActivity import com.deniscerri.ytdlnis.ui.downloads.DownloadQueueMainFragment
import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity
import com.deniscerri.ytdlnis.util.ThemeUtil import com.deniscerri.ytdlnis.util.ThemeUtil
import com.deniscerri.ytdlnis.util.UpdateUtil import com.deniscerri.ytdlnis.util.UpdateUtil
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.elevation.SurfaceColors import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
@ -119,8 +125,7 @@ class MainActivity : BaseActivity() {
(navHostFragment.childFragmentManager.primaryNavigationFragment!! as HomeFragment).scrollToTop() (navHostFragment.childFragmentManager.primaryNavigationFragment!! as HomeFragment).scrollToTop()
} }
R.id.historyFragment -> { R.id.historyFragment -> {
val intent = Intent(context, DownloadQueueActivity::class.java) navController.navigate(R.id.downloadQueueMainFragment)
startActivity(intent)
} }
R.id.moreFragment -> { R.id.moreFragment -> {
val intent = Intent(context, SettingsActivity::class.java) val intent = Intent(context, SettingsActivity::class.java)
@ -175,20 +180,50 @@ class MainActivity : BaseActivity() {
} }
} }
cookieViewModel.updateCookiesFile() cookieViewModel.updateCookiesFile()
// lifecycleScope.launch(Dispatchers.IO){
// val active = downloadViewModel.getActiveDownloads()
// if (active.isNotEmpty()){
// val wm = WorkManager.getInstance(this@MainActivity)
// active.forEach {
// if (wm.getWorkInfosByTag())
// }
// WorkManager.getInstance(this@MainActivity).get
// }
// }
val intent = intent val intent = intent
handleIntents(intent) handleIntents(intent)
} }
fun hideBottomNavigation(){
if(navigationView is NavigationBarView){
if (navigationView is BottomNavigationView){
findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.height = LayoutParams.MATCH_PARENT
}
navigationView.animate()?.translationY(navigationView.height.toFloat())?.setDuration(300)?.withEndAction {
navigationView.visibility = View.GONE
}?.start()
}else{
findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.width = LayoutParams.MATCH_PARENT
}
navigationView.animate()?.translationX(-navigationView.width.toFloat())?.setDuration(300)?.withEndAction {
navigationView.visibility = View.GONE
}?.start()
}
}
}
fun showBottomNavigation(){
if(navigationView is NavigationBarView){
if (navigationView is BottomNavigationView){
findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.height = 0
}
navigationView.animate()?.translationY(0F)?.setDuration(300)?.withEndAction {
navigationView.visibility = View.VISIBLE
}?.start()
}else{
findViewById<FragmentContainerView>(R.id.frame_layout).updateLayoutParams {
this.width = 0
}
navigationView.animate()?.translationX(0F)?.setDuration(300)?.withEndAction {
navigationView.visibility = View.VISIBLE
}?.start()
}
}
}
fun disableBottomNavigation(){ fun disableBottomNavigation(){
if (navigationView is NavigationBarView){ if (navigationView is NavigationBarView){
(navigationView as NavigationBarView).menu.forEach { it.isEnabled = false } (navigationView as NavigationBarView).menu.forEach { it.isEnabled = false }
@ -207,6 +242,7 @@ class MainActivity : BaseActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
//incognito header
val incognitoHeader = findViewById<TextView>(R.id.incognito_header) val incognitoHeader = findViewById<TextView>(R.id.incognito_header)
if (preferences.getBoolean("incognito", false)){ if (preferences.getBoolean("incognito", false)){
incognitoHeader.visibility = View.VISIBLE incognitoHeader.visibility = View.VISIBLE
@ -215,6 +251,10 @@ class MainActivity : BaseActivity() {
window.statusBarColor = getColor(android.R.color.transparent) window.statusBarColor = getColor(android.R.color.transparent)
incognitoHeader.visibility = View.GONE incognitoHeader.visibility = View.GONE
} }
//check logs option
if (navigationView is NavigationView){
(navigationView as NavigationView).menu.findItem(R.id.downloadLogListFragment).isVisible = preferences.getBoolean("log_downloads", false)
}
} }
override fun onNewIntent(intent: Intent) { override fun onNewIntent(intent: Intent) {

View file

@ -102,6 +102,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene
fragmentView = inflater.inflate(R.layout.fragment_home, container, false) fragmentView = inflater.inflate(R.layout.fragment_home, container, false)
activity = getActivity() activity = getActivity()
mainActivity = activity as MainActivity? mainActivity = activity as MainActivity?
mainActivity?.showBottomNavigation()
quickLaunchSheet = false quickLaunchSheet = false
return fragmentView return fragmentView
} }

View file

@ -2,9 +2,7 @@ package com.deniscerri.ytdlnis.ui.downloads
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.util.DisplayMetrics
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.View.OnClickListener import android.view.View.OnClickListener
@ -12,6 +10,7 @@ import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.work.WorkManager import androidx.work.WorkManager
@ -21,7 +20,7 @@ import com.deniscerri.ytdlnis.database.models.DownloadItem
import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.repository.DownloadRepository
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding
import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogActivity import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogFragment
import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.FileUtil
import com.deniscerri.ytdlnis.util.NotificationUtil import com.deniscerri.ytdlnis.util.NotificationUtil
import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.progressindicator.LinearProgressIndicator
@ -107,9 +106,12 @@ class ActiveDownloadsFragment() : Fragment(), ActiveDownloadAdapter.OnItemClickL
override fun onOutputClick(item: DownloadItem) { override fun onOutputClick(item: DownloadItem) {
val logFile = fileUtil.getLogFile(requireContext(), item) val logFile = fileUtil.getLogFile(requireContext(), item)
if (logFile.exists()) { if (logFile.exists()) {
val intent = Intent(requireContext(), DownloadLogActivity::class.java) val bundle = Bundle()
intent.putExtra("logpath", logFile.absolutePath) bundle.putString("logpath", logFile.absolutePath)
startActivity(intent) findNavController().navigate(
R.id.downloadLogFragment,
bundle
)
} }
} }

View file

@ -1,20 +1,22 @@
package com.deniscerri.ytdlnis.ui.downloads package com.deniscerri.ytdlnis.ui.downloads
import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import androidx.work.WorkManager import androidx.work.WorkManager
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.repository.DownloadRepository
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdlnis.ui.BaseActivity
import com.deniscerri.ytdlnis.util.NotificationUtil import com.deniscerri.ytdlnis.util.NotificationUtil
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -25,25 +27,31 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class DownloadQueueActivity : BaseActivity(){ class DownloadQueueMainFragment : Fragment(){
private lateinit var downloadViewModel: DownloadViewModel private lateinit var downloadViewModel: DownloadViewModel
private lateinit var topAppBar: MaterialToolbar private lateinit var topAppBar: MaterialToolbar
private lateinit var workManager: WorkManager private lateinit var workManager: WorkManager
private lateinit var tabLayout: TabLayout private lateinit var tabLayout: TabLayout
private lateinit var viewPager2: ViewPager2 private lateinit var viewPager2: ViewPager2
private lateinit var fragmentAdapter : DownloadListFragmentAdapter private lateinit var fragmentAdapter : DownloadListFragmentAdapter
var context: Context? = null private lateinit var mainActivity: MainActivity
public override fun onCreate(savedInstanceState: Bundle?) { override fun onCreateView(
super.onCreate(savedInstanceState) inflater: LayoutInflater,
setContentView(R.layout.activity_download_queue) container: ViewGroup?,
context = baseContext savedInstanceState: Bundle?
val view : View = window.decorView.findViewById(android.R.id.content) ): View? {
workManager = WorkManager.getInstance(this) mainActivity = activity as MainActivity
return inflater.inflate(R.layout.fragment_download_queue_main_screen, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
workManager = WorkManager.getInstance(requireContext())
downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java]
topAppBar = findViewById(R.id.logs_toolbar) topAppBar = view.findViewById(R.id.logs_toolbar)
topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } topAppBar.setNavigationOnClickListener { mainActivity.onBackPressedDispatcher.onBackPressed() }
tabLayout = view.findViewById(R.id.download_tablayout) tabLayout = view.findViewById(R.id.download_tablayout)
viewPager2 = view.findViewById(R.id.download_viewpager) viewPager2 = view.findViewById(R.id.download_viewpager)
@ -56,7 +64,7 @@ class DownloadQueueActivity : BaseActivity(){
val fragments = mutableListOf(ActiveDownloadsFragment(), QueuedDownloadsFragment(), CancelledDownloadsFragment(), ErroredDownloadsFragment()) val fragments = mutableListOf(ActiveDownloadsFragment(), QueuedDownloadsFragment(), CancelledDownloadsFragment(), ErroredDownloadsFragment())
fragmentAdapter = DownloadListFragmentAdapter( fragmentAdapter = DownloadListFragmentAdapter(
supportFragmentManager, childFragmentManager,
lifecycle, lifecycle,
fragments fragments
) )
@ -81,7 +89,7 @@ class DownloadQueueActivity : BaseActivity(){
tabLayout.selectTab(tabLayout.getTabAt(position)) tabLayout.selectTab(tabLayout.getTabAt(position))
} }
}) })
mainActivity.hideBottomNavigation()
initMenu() initMenu()
} }
@ -115,7 +123,7 @@ class DownloadQueueActivity : BaseActivity(){
} }
private fun showDeleteDialog (deleteClicked: (deleteClicked: Boolean) -> Unit){ private fun showDeleteDialog (deleteClicked: (deleteClicked: Boolean) -> Unit){
val deleteDialog = MaterialAlertDialogBuilder(this) val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.you_are_going_to_delete_multiple_items)) deleteDialog.setTitle(getString(R.string.you_are_going_to_delete_multiple_items))
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->
@ -127,7 +135,7 @@ class DownloadQueueActivity : BaseActivity(){
private fun cancelAllDownloads() { private fun cancelAllDownloads() {
workManager.cancelAllWorkByTag("download") workManager.cancelAllWorkByTag("download")
lifecycleScope.launch { lifecycleScope.launch {
val notificationUtil = NotificationUtil(this@DownloadQueueActivity) val notificationUtil = NotificationUtil(requireContext())
val activeAndQueued = withContext(Dispatchers.IO){ val activeAndQueued = withContext(Dispatchers.IO){
downloadViewModel.getActiveAndQueuedDownloads() downloadViewModel.getActiveAndQueuedDownloads()
} }

View file

@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.ui.downloads
import android.app.Activity import android.app.Activity
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.res.Configuration
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
@ -32,7 +31,7 @@ import com.deniscerri.ytdlnis.database.models.DownloadItem
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel
import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding import com.deniscerri.ytdlnis.databinding.FragmentHomeBinding
import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog
import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogActivity import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogFragment
import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.FileUtil
import com.deniscerri.ytdlnis.util.UiUtil import com.deniscerri.ytdlnis.util.UiUtil
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
@ -97,7 +96,7 @@ class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickL
override fun onActionButtonClick(itemID: Long) { override fun onActionButtonClick(itemID: Long) {
val item = items.find { it.id == itemID } ?: return val item = items.find { it.id == itemID } ?: return
val file = fileUtil.getLogFile(requireContext(), item) val file = fileUtil.getLogFile(requireContext(), item)
val intent = Intent(requireContext(), DownloadLogActivity::class.java) val intent = Intent(requireContext(), DownloadLogFragment::class.java)
intent.putExtra("logpath", file.absolutePath) intent.putExtra("logpath", file.absolutePath)
startActivity(intent) startActivity(intent)
} }

View file

@ -4,7 +4,6 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.res.Configuration
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
@ -100,7 +99,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
fragmentView = inflater.inflate(R.layout.fragment_history, container, false) fragmentView = inflater.inflate(R.layout.fragment_history, container, false)
activity = getActivity() activity = getActivity()
mainActivity = activity as MainActivity? mainActivity = activity as MainActivity?
mainActivity?.showBottomNavigation()
return fragmentView return fragmentView
} }
@ -156,7 +155,6 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
} }
downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java]
initMenu() initMenu()
initChips() initChips()
} }
@ -217,7 +215,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{
} }
} }
R.id.download_queue -> { R.id.download_queue -> {
val intent = Intent(context, DownloadQueueActivity::class.java) val intent = Intent(context, DownloadQueueMainFragment::class.java)
startActivity(intent) startActivity(intent)
} }
R.id.remove_deleted_history -> { R.id.remove_deleted_history -> {

View file

@ -5,19 +5,22 @@ import android.content.DialogInterface
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout import android.widget.RelativeLayout
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.adapter.TemplatesAdapter import com.deniscerri.ytdlnis.adapter.TemplatesAdapter
import com.deniscerri.ytdlnis.database.models.CommandTemplate import com.deniscerri.ytdlnis.database.models.CommandTemplate
import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel
import com.deniscerri.ytdlnis.ui.BaseActivity
import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.FileUtil
import com.deniscerri.ytdlnis.util.UiUtil import com.deniscerri.ytdlnis.util.UiUtil
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
@ -30,7 +33,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickListener { class CommandTemplatesFragment : Fragment(), TemplatesAdapter.OnItemClickListener {
private lateinit var recyclerView: RecyclerView private lateinit var recyclerView: RecyclerView
private lateinit var templatesAdapter: TemplatesAdapter private lateinit var templatesAdapter: TemplatesAdapter
private lateinit var topAppBar: MaterialToolbar private lateinit var topAppBar: MaterialToolbar
@ -38,24 +41,32 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis
private lateinit var uiUtil: UiUtil private lateinit var uiUtil: UiUtil
private lateinit var templatesList: List<CommandTemplate> private lateinit var templatesList: List<CommandTemplate>
private lateinit var noResults: RelativeLayout private lateinit var noResults: RelativeLayout
var context: Context? = null private lateinit var mainActivity: MainActivity
public override fun onCreate(savedInstanceState: Bundle?) { override fun onCreateView(
super.onCreate(savedInstanceState) inflater: LayoutInflater,
setContentView(R.layout.activity_command_templates) container: ViewGroup?,
context = baseContext savedInstanceState: Bundle?
): View? {
mainActivity = activity as MainActivity
mainActivity.hideBottomNavigation()
return inflater.inflate(R.layout.fragment_command_templates, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
templatesList = listOf() templatesList = listOf()
topAppBar = findViewById(R.id.logs_toolbar) topAppBar = view.findViewById(R.id.logs_toolbar)
topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } topAppBar.setNavigationOnClickListener { mainActivity.onBackPressedDispatcher.onBackPressed() }
noResults = findViewById(R.id.no_results) noResults = view.findViewById(R.id.no_results)
templatesAdapter = templatesAdapter =
TemplatesAdapter( TemplatesAdapter(
this, this,
this@CommandTemplatesActivity mainActivity
) )
recyclerView = findViewById(R.id.template_recyclerview) recyclerView = view.findViewById(R.id.template_recyclerview)
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = templatesAdapter recyclerView.adapter = templatesAdapter
val itemTouchHelper = ItemTouchHelper(simpleCallback) val itemTouchHelper = ItemTouchHelper(simpleCallback)
@ -64,7 +75,7 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis
uiUtil = UiUtil(FileUtil()) uiUtil = UiUtil(FileUtil())
commandTemplateViewModel = ViewModelProvider(this)[CommandTemplateViewModel::class.java] commandTemplateViewModel = ViewModelProvider(this)[CommandTemplateViewModel::class.java]
commandTemplateViewModel.items.observe(this) { commandTemplateViewModel.items.observe(viewLifecycleOwner) {
if (it.isEmpty()) noResults.visibility = View.VISIBLE if (it.isEmpty()) noResults.visibility = View.VISIBLE
else noResults.visibility = View.GONE else noResults.visibility = View.GONE
templatesList = it templatesList = it
@ -88,7 +99,7 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis
lifecycleScope.launch{ lifecycleScope.launch{
withContext(Dispatchers.IO){ withContext(Dispatchers.IO){
val count = commandTemplateViewModel.importFromClipboard() val count = commandTemplateViewModel.importFromClipboard()
runOnUiThread{ mainActivity.runOnUiThread{
Snackbar.make(recyclerView, "${getString(R.string.items_imported)} (${count})", Snackbar.LENGTH_LONG).show() Snackbar.make(recyclerView, "${getString(R.string.items_imported)} (${count})", Snackbar.LENGTH_LONG).show()
} }
} }
@ -100,13 +111,13 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis
} }
private fun initChips() { private fun initChips() {
val new = findViewById<Chip>(R.id.newTemplate) val new = view?.findViewById<Chip>(R.id.newTemplate)
new.setOnClickListener { new?.setOnClickListener {
uiUtil.showCommandTemplateCreationOrUpdatingSheet(null,this@CommandTemplatesActivity, this, commandTemplateViewModel) {} uiUtil.showCommandTemplateCreationOrUpdatingSheet(null,mainActivity, this, commandTemplateViewModel) {}
} }
val shortcuts = findViewById<Chip>(R.id.shortcuts) val shortcuts = view?.findViewById<Chip>(R.id.shortcuts)
shortcuts.setOnClickListener { shortcuts?.setOnClickListener {
uiUtil.showShortcutsSheet(this@CommandTemplatesActivity,this, commandTemplateViewModel) uiUtil.showShortcutsSheet(mainActivity,this, commandTemplateViewModel)
} }
} }
@ -115,7 +126,7 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis
} }
override fun onItemClick(commandTemplate: CommandTemplate, index: Int) { override fun onItemClick(commandTemplate: CommandTemplate, index: Int) {
uiUtil.showCommandTemplateCreationOrUpdatingSheet(commandTemplate,this@CommandTemplatesActivity, this, commandTemplateViewModel) { uiUtil.showCommandTemplateCreationOrUpdatingSheet(commandTemplate,mainActivity, this, commandTemplateViewModel) {
templatesAdapter.notifyItemChanged(index) templatesAdapter.notifyItemChanged(index)
} }
@ -126,7 +137,7 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis
} }
override fun onDelete(commandTemplate: CommandTemplate) { override fun onDelete(commandTemplate: CommandTemplate) {
val deleteDialog = MaterialAlertDialogBuilder(this) val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + commandTemplate.title + "\"!") deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + commandTemplate.title + "\"!")
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->

View file

@ -1,28 +1,32 @@
package com.deniscerri.ytdlnis.ui.more package com.deniscerri.ytdlnis.ui.more
import android.content.Context import android.content.Context
import android.content.Context.INPUT_METHOD_SERVICE
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.EditText import android.widget.EditText
import android.widget.RelativeLayout import android.widget.RelativeLayout
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.widget.doOnTextChanged import androidx.core.widget.doOnTextChanged
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.adapter.CookieAdapter import com.deniscerri.ytdlnis.adapter.CookieAdapter
import com.deniscerri.ytdlnis.database.models.CookieItem import com.deniscerri.ytdlnis.database.models.CookieItem
import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel
import com.deniscerri.ytdlnis.ui.BaseActivity
import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.FileUtil
import com.deniscerri.ytdlnis.util.UiUtil import com.deniscerri.ytdlnis.util.UiUtil
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
@ -36,7 +40,7 @@ import kotlinx.coroutines.launch
import java.io.File import java.io.File
class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { class CookiesFragment : Fragment(), CookieAdapter.OnItemClickListener {
private lateinit var recyclerView: RecyclerView private lateinit var recyclerView: RecyclerView
private lateinit var listAdapter: CookieAdapter private lateinit var listAdapter: CookieAdapter
private lateinit var topAppBar: MaterialToolbar private lateinit var topAppBar: MaterialToolbar
@ -44,24 +48,30 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
private lateinit var uiUtil: UiUtil private lateinit var uiUtil: UiUtil
private lateinit var cookiesList: List<CookieItem> private lateinit var cookiesList: List<CookieItem>
private lateinit var noResults : RelativeLayout private lateinit var noResults : RelativeLayout
var context: Context? = null private lateinit var mainActivity: MainActivity
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mainActivity = activity as MainActivity
mainActivity.hideBottomNavigation()
return inflater.inflate(R.layout.fragment_cookies, container, false)
}
public override fun onCreate(savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onViewCreated(view, savedInstanceState)
setContentView(R.layout.activity_cookies) topAppBar = view.findViewById(R.id.logs_toolbar)
context = baseContext topAppBar.setNavigationOnClickListener { mainActivity.onBackPressedDispatcher.onBackPressed() }
topAppBar = findViewById(R.id.logs_toolbar)
topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() }
cookiesList = listOf() cookiesList = listOf()
noResults = findViewById(R.id.no_results) noResults = view.findViewById(R.id.no_results)
listAdapter = listAdapter =
CookieAdapter( CookieAdapter(
this, this,
this@CookiesActivity mainActivity
) )
recyclerView = findViewById(R.id.template_recyclerview) recyclerView = view.findViewById(R.id.template_recyclerview)
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = listAdapter recyclerView.adapter = listAdapter
val itemTouchHelper = ItemTouchHelper(simpleCallback) val itemTouchHelper = ItemTouchHelper(simpleCallback)
@ -70,7 +80,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
uiUtil = UiUtil(FileUtil()) uiUtil = UiUtil(FileUtil())
cookiesViewModel = ViewModelProvider(this)[CookieViewModel::class.java] cookiesViewModel = ViewModelProvider(this)[CookieViewModel::class.java]
cookiesViewModel.items.observe(this) { cookiesViewModel.items.observe(viewLifecycleOwner) {
if (it.isEmpty()) noResults.visibility = View.VISIBLE if (it.isEmpty()) noResults.visibility = View.VISIBLE
else noResults.visibility = View.GONE else noResults.visibility = View.GONE
cookiesList = it cookiesList = it
@ -84,14 +94,14 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
topAppBar.setOnMenuItemClickListener { m: MenuItem -> topAppBar.setOnMenuItemClickListener { m: MenuItem ->
when (m.itemId) { when (m.itemId) {
R.id.delete_cookies -> { R.id.delete_cookies -> {
val deleteDialog = MaterialAlertDialogBuilder(this) val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.confirm_delete_history)) deleteDialog.setTitle(getString(R.string.confirm_delete_history))
deleteDialog.setMessage(getString(R.string.confirm_delete_cookies_desc)) deleteDialog.setMessage(getString(R.string.confirm_delete_cookies_desc))
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->
cookiesViewModel.deleteAll() cookiesViewModel.deleteAll()
kotlin.runCatching { kotlin.runCatching {
File(cacheDir, "cookies.txt").apply { writeText("") } File(context?.cacheDir, "cookies.txt").apply { writeText("") }
} }
} }
deleteDialog.show() deleteDialog.show()
@ -111,14 +121,14 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
} }
private fun initChips() { private fun initChips() {
val new = findViewById<Chip>(R.id.newCookie) val new = view?.findViewById<Chip>(R.id.newCookie)
new.setOnClickListener { new?.setOnClickListener {
showDialog("") showDialog("")
} }
} }
private fun showDialog(url: String){ private fun showDialog(url: String){
val builder = MaterialAlertDialogBuilder(this) val builder = MaterialAlertDialogBuilder(requireContext())
builder.setTitle(getString(R.string.cookies)) builder.setTitle(getString(R.string.cookies))
val inputLayout = layoutInflater.inflate(R.layout.textinput, null) val inputLayout = layoutInflater.inflate(R.layout.textinput, null)
val editText = inputLayout.findViewById<EditText>(R.id.url_edittext) val editText = inputLayout.findViewById<EditText>(R.id.url_edittext)
@ -130,7 +140,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
builder.setPositiveButton( builder.setPositiveButton(
getString(R.string.get_cookies) getString(R.string.get_cookies)
) { dialog: DialogInterface?, which: Int -> ) { dialog: DialogInterface?, which: Int ->
val myIntent = Intent(this, WebViewActivity::class.java) val myIntent = Intent(requireContext(), WebViewActivity::class.java)
myIntent.putExtra("url", editText.text.toString()) myIntent.putExtra("url", editText.text.toString())
startActivity(myIntent) startActivity(myIntent)
} }
@ -144,7 +154,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editText.text.isNotEmpty() dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editText.text.isNotEmpty()
} }
dialog.show() dialog.show()
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager val imm = mainActivity.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
editText!!.postDelayed({ editText!!.postDelayed({
editText.requestFocus() editText.requestFocus()
imm.showSoftInput(editText, 0) imm.showSoftInput(editText, 0)
@ -165,7 +175,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener {
} }
override fun onDelete(cookie: CookieItem) { override fun onDelete(cookie: CookieItem) {
val deleteDialog = MaterialAlertDialogBuilder(this) val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + cookie.url + "\"!") deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + cookie.url + "\"!")
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->

View file

@ -10,11 +10,11 @@ import android.view.ViewGroup
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.ui.downloads.DownloadQueueActivity import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogListFragment
import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogListActivity
import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlin.system.exitProcess import kotlin.system.exitProcess
@ -36,6 +36,7 @@ class MoreFragment : Fragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
mainActivity = activity as MainActivity mainActivity = activity as MainActivity
mainActivity.showBottomNavigation()
return inflater.inflate(R.layout.fragment_more, container, false) return inflater.inflate(R.layout.fragment_more, container, false)
} }
@ -67,23 +68,19 @@ class MoreFragment : Fragment() {
} }
logs.setOnClickListener { logs.setOnClickListener {
val intent = Intent(context, DownloadLogListActivity::class.java) findNavController().navigate(R.id.downloadLogListFragment)
startActivity(intent)
} }
commandTemplates.setOnClickListener { commandTemplates.setOnClickListener {
val intent = Intent(context, CommandTemplatesActivity::class.java) findNavController().navigate(R.id.commandTemplatesFragment)
startActivity(intent)
} }
downloadQueue.setOnClickListener { downloadQueue.setOnClickListener {
val intent = Intent(context, DownloadQueueActivity::class.java) findNavController().navigate(R.id.downloadQueueMainFragment)
startActivity(intent)
} }
cookies.setOnClickListener { cookies.setOnClickListener {
val intent = Intent(context, CookiesActivity::class.java) findNavController().navigate(R.id.cookiesFragment)
startActivity(intent)
} }
terminateApp.setOnClickListener { terminateApp.setOnClickListener {

View file

@ -2,12 +2,17 @@ package com.deniscerri.ytdlnis.ui.more.downloadLogs
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Context.CLIPBOARD_SERVICE
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.FileObserver import android.os.FileObserver
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.ScrollView import android.widget.ScrollView
import android.widget.TextView import android.widget.TextView
import androidx.fragment.app.Fragment
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.ui.BaseActivity import com.deniscerri.ytdlnis.ui.BaseActivity
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
@ -15,38 +20,49 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu
import java.io.File import java.io.File
class DownloadLogActivity : BaseActivity() { class DownloadLogFragment : Fragment() {
private lateinit var content: TextView private lateinit var content: TextView
private lateinit var contentScrollView : ScrollView private lateinit var contentScrollView : ScrollView
private lateinit var topAppBar: MaterialToolbar private lateinit var topAppBar: MaterialToolbar
private lateinit var observer: FileObserver private lateinit var observer: FileObserver
private lateinit var copyLog : ExtendedFloatingActionButton private lateinit var copyLog : ExtendedFloatingActionButton
var context: Context? = null private lateinit var mainActivity: MainActivity
public override fun onCreate(savedInstanceState: Bundle?) { override fun onCreateView(
super.onCreate(savedInstanceState) inflater: LayoutInflater,
setContentView(R.layout.activity_download_log) container: ViewGroup?,
context = baseContext savedInstanceState: Bundle?
): View? {
mainActivity = activity as MainActivity
mainActivity.hideBottomNavigation()
return inflater.inflate(R.layout.fragment_download_log, container, false)
}
topAppBar = findViewById(R.id.title)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
topAppBar = view.findViewById(R.id.title)
topAppBar.setNavigationOnClickListener { topAppBar.setNavigationOnClickListener {
onBackPressedDispatcher.onBackPressed() mainActivity.onBackPressedDispatcher.onBackPressed()
} }
content = findViewById(R.id.content) content = view.findViewById(R.id.content)
content.setTextIsSelectable(true) content.setTextIsSelectable(true)
contentScrollView = findViewById(R.id.content_scrollview) contentScrollView = view.findViewById(R.id.content_scrollview)
copyLog = findViewById(R.id.copy_log) copyLog = view.findViewById(R.id.copy_log)
copyLog.setOnClickListener { copyLog.setOnClickListener {
val clipboard: ClipboardManager = val clipboard: ClipboardManager =
getSystemService(CLIPBOARD_SERVICE) as ClipboardManager mainActivity.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setText(content.text) clipboard.setText(content.text)
} }
val path = intent.getStringExtra("logpath") val path = arguments?.getString("logpath")
if (path == null) { if (path == null) {
onBackPressedDispatcher.onBackPressed() mainActivity.onBackPressedDispatcher.onBackPressed()
}else{
arguments?.remove("logpath")
} }
val file = File(path!!) val file = File(path!!)
@ -56,7 +72,7 @@ class DownloadLogActivity : BaseActivity() {
if(Build.VERSION.SDK_INT < 29){ if(Build.VERSION.SDK_INT < 29){
observer = object : FileObserver(file.absolutePath, MODIFY) { observer = object : FileObserver(file.absolutePath, MODIFY) {
override fun onEvent(event: Int, p: String?) { override fun onEvent(event: Int, p: String?) {
runOnUiThread{ mainActivity.runOnUiThread{
val newText = File(path).readText() val newText = File(path).readText()
content.text = newText content.text = newText
content.scrollTo(0, content.height) content.scrollTo(0, content.height)
@ -68,7 +84,7 @@ class DownloadLogActivity : BaseActivity() {
}else{ }else{
observer = object : FileObserver(file, MODIFY) { observer = object : FileObserver(file, MODIFY) {
override fun onEvent(event: Int, p: String?) { override fun onEvent(event: Int, p: String?) {
runOnUiThread{ mainActivity.runOnUiThread{
val newText = File(path).readText() val newText = File(path).readText()
content.text = newText content.text = newText
content.scrollTo(0, content.height) content.scrollTo(0, content.height)

View file

@ -1,54 +1,62 @@
package com.deniscerri.ytdlnis.ui.more.downloadLogs package com.deniscerri.ytdlnis.ui.more.downloadLogs
import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.FileObserver import android.os.FileObserver
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.adapter.DownloadLogsAdapter import com.deniscerri.ytdlnis.adapter.DownloadLogsAdapter
import com.deniscerri.ytdlnis.ui.BaseActivity
import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.io.File import java.io.File
class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickListener { class DownloadLogListFragment : Fragment(), DownloadLogsAdapter.OnItemClickListener {
private lateinit var recyclerView: RecyclerView private lateinit var recyclerView: RecyclerView
private lateinit var downloadLogAdapter: DownloadLogsAdapter private lateinit var downloadLogAdapter: DownloadLogsAdapter
private lateinit var noResults: RelativeLayout private lateinit var noResults: RelativeLayout
private lateinit var fileList: MutableList<File> private lateinit var fileList: MutableList<File>
private lateinit var topAppBar: MaterialToolbar private lateinit var topAppBar: MaterialToolbar
private lateinit var logFolder : File private lateinit var logFolder : File
var context: Context? = null private lateinit var mainActivity: MainActivity
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mainActivity = activity as MainActivity
mainActivity.hideBottomNavigation()
return inflater.inflate(R.layout.fragment_download_log_list, container, false)
}
public override fun onCreate(savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onViewCreated(view, savedInstanceState)
setContentView(R.layout.activity_download_log_list) topAppBar = view.findViewById(R.id.logs_toolbar)
context = baseContext topAppBar.setNavigationOnClickListener { mainActivity.onBackPressedDispatcher.onBackPressed() }
topAppBar = findViewById(R.id.logs_toolbar)
topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() }
downloadLogAdapter = downloadLogAdapter =
DownloadLogsAdapter( DownloadLogsAdapter(
this, this,
this@DownloadLogListActivity mainActivity
) )
recyclerView = findViewById(R.id.logs_recyclerview) recyclerView = view.findViewById(R.id.logs_recyclerview)
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = downloadLogAdapter recyclerView.adapter = downloadLogAdapter
noResults = findViewById(R.id.no_results) noResults = view.findViewById(R.id.no_results)
noResults.visibility = View.GONE noResults.visibility = View.GONE
logFolder = File(filesDir.absolutePath + "/logs") logFolder = File(requireContext().filesDir.absolutePath + "/logs")
updateList(logFolder) updateList(logFolder)
if(Build.VERSION.SDK_INT < 29){ if(Build.VERSION.SDK_INT < 29){
@ -78,7 +86,7 @@ class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickL
val itemId = m.itemId val itemId = m.itemId
if (itemId == R.id.remove_logs) { if (itemId == R.id.remove_logs) {
try{ try{
val deleteDialog = MaterialAlertDialogBuilder(this) val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.confirm_delete_history)) deleteDialog.setTitle(getString(R.string.confirm_delete_history))
deleteDialog.setMessage(getString(R.string.confirm_delete_logs_desc)) deleteDialog.setMessage(getString(R.string.confirm_delete_logs_desc))
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
@ -107,7 +115,7 @@ class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickL
e.printStackTrace() e.printStackTrace()
} }
downloadLogAdapter.submitList(fileList.toList()) downloadLogAdapter.submitList(fileList.toList())
runOnUiThread{ mainActivity.runOnUiThread{
if (fileList.isNotEmpty()) { if (fileList.isNotEmpty()) {
noResults.visibility = View.GONE noResults.visibility = View.GONE
topAppBar.menu.findItem(R.id.remove_logs).isVisible = true topAppBar.menu.findItem(R.id.remove_logs).isVisible = true
@ -118,18 +126,17 @@ class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickL
} }
} }
companion object {
private const val TAG = "DownloadLogActivity"
}
override fun onItemClick(file: File) { override fun onItemClick(file: File) {
val intent = Intent(this, DownloadLogActivity::class.java) val bundle = Bundle()
intent.putExtra("logpath", file.absolutePath) bundle.putString("logpath", file.absolutePath)
startActivity(intent) findNavController().navigate(
R.id.downloadLogFragment,
bundle
)
} }
override fun onDeleteClick(file: File) { override fun onDeleteClick(file: File) {
val deleteDialog = MaterialAlertDialogBuilder(this) val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + file.name + "\"!") deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + file.name + "\"!")
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int ->

View file

@ -16,7 +16,7 @@ import com.deniscerri.ytdlnis.receiver.CancelDownloadNotificationReceiver
import com.deniscerri.ytdlnis.receiver.PauseDownloadNotificationReceiver import com.deniscerri.ytdlnis.receiver.PauseDownloadNotificationReceiver
import com.deniscerri.ytdlnis.receiver.ResumeActivity import com.deniscerri.ytdlnis.receiver.ResumeActivity
import com.deniscerri.ytdlnis.receiver.SharedDownloadNotificationReceiver import com.deniscerri.ytdlnis.receiver.SharedDownloadNotificationReceiver
import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogActivity import com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogFragment
import java.io.File import java.io.File
@ -228,7 +228,7 @@ class NotificationUtil(var context: Context) {
) { ) {
val notificationBuilder = getBuilder(channel) val notificationBuilder = getBuilder(channel)
val intent = Intent(context, DownloadLogActivity::class.java) val intent = Intent(context, DownloadLogFragment::class.java)
intent.putExtra("logpath", logFile?.absolutePath) intent.putExtra("logpath", logFile?.absolutePath)
val errorPendingIntent: PendingIntent = TaskStackBuilder.create(context).run { val errorPendingIntent: PendingIntent = TaskStackBuilder.create(context).run {

View file

@ -16,19 +16,19 @@
<item android:title="@string/logs" <item android:title="@string/logs"
android:icon="@drawable/ic_baseline_file_open_24" android:icon="@drawable/ic_baseline_file_open_24"
android:checkable="true" android:checkable="true"
android:id="@+id/downloadLogListActivity"/> android:id="@+id/downloadLogListFragment"/>
<item android:title="@string/command_templates" <item android:title="@string/command_templates"
android:icon="@drawable/ic_baseline_keyboard_arrow_right_24" android:icon="@drawable/ic_baseline_keyboard_arrow_right_24"
android:checkable="true" android:checkable="true"
android:id="@+id/commandTemplatesActivity"/> android:id="@+id/commandTemplatesFragment"/>
<item android:title="@string/download_queue" <item android:title="@string/download_queue"
android:icon="@drawable/baseline_downloading_24" android:icon="@drawable/baseline_downloading_24"
android:checkable="true" android:checkable="true"
android:id="@+id/downloadQueueActivity"/> android:id="@+id/downloadQueueMainFragment"/>
<item android:title="@string/cookies" <item android:title="@string/cookies"
android:icon="@drawable/baseline_cookie_24" android:icon="@drawable/baseline_cookie_24"
android:checkable="true" android:checkable="true"
android:id="@+id/cookiesActivity"/> android:id="@+id/cookiesFragment"/>
<item android:title="@string/kill_app" <item android:title="@string/kill_app"
android:checkable="true" android:checkable="true"
android:icon="@drawable/ic_power" android:icon="@drawable/ic_power"

View file

@ -16,8 +16,8 @@
android:label="@string/downloads" android:label="@string/downloads"
tools:layout="@layout/fragment_history" > tools:layout="@layout/fragment_history" >
<action <action
android:id="@+id/action_historyFragment_to_downloadQueueActivity" android:id="@+id/action_historyFragment_to_downloadQueueMainFragment"
app:destination="@id/downloadQueueActivity" /> app:destination="@id/downloadQueueMainFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/moreFragment" android:id="@+id/moreFragment"
@ -27,39 +27,22 @@
<action <action
android:id="@+id/action_moreFragment_to_terminalActivity" android:id="@+id/action_moreFragment_to_terminalActivity"
app:destination="@id/terminalActivity" /> app:destination="@id/terminalActivity" />
<action
android:id="@+id/action_moreFragment_to_cookiesActivity"
app:destination="@id/cookiesActivity" />
<action
android:id="@+id/action_moreFragment_to_downloadQueueActivity"
app:destination="@id/downloadQueueActivity" />
<action
android:id="@+id/action_moreFragment_to_downloadLogListActivity"
app:destination="@id/downloadLogListActivity" />
<action
android:id="@+id/action_moreFragment_to_commandTemplatesActivity"
app:destination="@id/commandTemplatesActivity" />
<action <action
android:id="@+id/action_moreFragment_to_settingsActivity2" android:id="@+id/action_moreFragment_to_settingsActivity2"
app:destination="@id/activitySettings" /> app:destination="@id/activitySettings" />
<action
android:id="@+id/action_moreFragment_to_cookiesFragment"
app:destination="@id/cookiesFragment" />
<action
android:id="@+id/action_moreFragment_to_commandTemplatesFragment"
app:destination="@id/commandTemplatesFragment" />
<action
android:id="@+id/action_moreFragment_to_downloadQueueMainFragment"
app:destination="@id/downloadQueueMainFragment" />
<action
android:id="@+id/action_moreFragment_to_downloadLogListFragment2"
app:destination="@id/downloadLogListFragment" />
</fragment> </fragment>
<activity
android:id="@+id/downloadQueueActivity"
android:name="com.deniscerri.ytdlnis.ui.downloads.DownloadQueueActivity"
android:label="DownloadQueueActivity"
tools:layout="@layout/activity_download_queue" />
<activity
android:id="@+id/downloadLogListActivity"
android:name="com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogListActivity"
android:label="DownloadLogListActivity" />
<activity
android:id="@+id/commandTemplatesActivity"
android:name="com.deniscerri.ytdlnis.ui.more.CommandTemplatesActivity"
android:label="CommandTemplatesActivity" />
<activity
android:id="@+id/cookiesActivity"
android:name="com.deniscerri.ytdlnis.ui.more.CookiesActivity"
android:label="CookiesActivity" />
<activity <activity
android:id="@+id/terminalActivity" android:id="@+id/terminalActivity"
android:name="com.deniscerri.ytdlnis.ui.more.TerminalActivity" android:name="com.deniscerri.ytdlnis.ui.more.TerminalActivity"
@ -70,4 +53,31 @@
android:name="com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity" android:name="com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity"
android:label="activity_settings" android:label="activity_settings"
tools:layout="@layout/activity_settings" /> tools:layout="@layout/activity_settings" />
<fragment
android:id="@+id/cookiesFragment"
android:name="com.deniscerri.ytdlnis.ui.more.CookiesFragment"
tools:layout="@layout/fragment_cookies"
android:label="CookiesFragment" />
<fragment
android:id="@+id/commandTemplatesFragment"
android:name="com.deniscerri.ytdlnis.ui.more.CommandTemplatesFragment"
tools:layout="@layout/fragment_command_templates"
android:label="CommandTemplatesFragment" />
<fragment
android:id="@+id/downloadQueueMainFragment"
android:name="com.deniscerri.ytdlnis.ui.downloads.DownloadQueueMainFragment"
tools:layout="@layout/fragment_download_queue_main_screen"
android:label="DownloadQueueMainFragment" />
<fragment
android:id="@+id/downloadLogListFragment"
android:name="com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogListFragment"
android:label="DownloadLogListFragment" >
<action
android:id="@+id/action_downloadLogListFragment2_to_downloadLogFragment2"
app:destination="@id/downloadLogFragment" />
</fragment>
<fragment
android:id="@+id/downloadLogFragment"
android:name="com.deniscerri.ytdlnis.ui.more.downloadLogs.DownloadLogFragment"
android:label="DownloadLogFragment" />
</navigation> </navigation>