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" />
</intent-filter>
</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
android:name=".ui.more.settings.SettingsActivity"
android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize"
@ -131,31 +98,6 @@
<data android:mimeType="text/plain" />
</intent-filter>
</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
android:name=".ui.more.WebViewActivity"

View file

@ -1,6 +1,7 @@
package com.deniscerri.ytdlnis
import android.Manifest
import android.app.ActionBar.LayoutParams
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
@ -13,14 +14,18 @@ import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import androidx.drawerlayout.widget.DrawerLayout
import android.view.View
import android.view.WindowInsets
import android.widget.CheckBox
import android.widget.FrameLayout
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.forEach
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.FragmentContainerView
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
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.ui.BaseActivity
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.util.ThemeUtil
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.elevation.SurfaceColors
import com.google.android.material.navigation.NavigationBarView
@ -119,8 +125,7 @@ class MainActivity : BaseActivity() {
(navHostFragment.childFragmentManager.primaryNavigationFragment!! as HomeFragment).scrollToTop()
}
R.id.historyFragment -> {
val intent = Intent(context, DownloadQueueActivity::class.java)
startActivity(intent)
navController.navigate(R.id.downloadQueueMainFragment)
}
R.id.moreFragment -> {
val intent = Intent(context, SettingsActivity::class.java)
@ -175,20 +180,50 @@ class MainActivity : BaseActivity() {
}
}
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
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(){
if (navigationView is NavigationBarView){
(navigationView as NavigationBarView).menu.forEach { it.isEnabled = false }
@ -207,6 +242,7 @@ class MainActivity : BaseActivity() {
override fun onResume() {
super.onResume()
//incognito header
val incognitoHeader = findViewById<TextView>(R.id.incognito_header)
if (preferences.getBoolean("incognito", false)){
incognitoHeader.visibility = View.VISIBLE
@ -215,6 +251,10 @@ class MainActivity : BaseActivity() {
window.statusBarColor = getColor(android.R.color.transparent)
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) {

View file

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

View file

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

View file

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

View file

@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.ui.downloads
import android.app.Activity
import android.content.DialogInterface
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Canvas
import android.graphics.Color
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.databinding.FragmentHomeBinding
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.UiUtil
import com.google.android.material.bottomsheet.BottomSheetDialog
@ -97,7 +96,7 @@ class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickL
override fun onActionButtonClick(itemID: Long) {
val item = items.find { it.id == itemID } ?: return
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)
startActivity(intent)
}

View file

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

View file

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

View file

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

View file

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

View file

@ -1,54 +1,62 @@
package com.deniscerri.ytdlnis.ui.more.downloadLogs
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.os.FileObserver
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.deniscerri.ytdlnis.MainActivity
import com.deniscerri.ytdlnis.R
import com.deniscerri.ytdlnis.adapter.DownloadLogsAdapter
import com.deniscerri.ytdlnis.ui.BaseActivity
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.io.File
class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickListener {
class DownloadLogListFragment : Fragment(), DownloadLogsAdapter.OnItemClickListener {
private lateinit var recyclerView: RecyclerView
private lateinit var downloadLogAdapter: DownloadLogsAdapter
private lateinit var noResults: RelativeLayout
private lateinit var fileList: MutableList<File>
private lateinit var topAppBar: MaterialToolbar
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?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_download_log_list)
context = baseContext
topAppBar = findViewById(R.id.logs_toolbar)
topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
topAppBar = view.findViewById(R.id.logs_toolbar)
topAppBar.setNavigationOnClickListener { mainActivity.onBackPressedDispatcher.onBackPressed() }
downloadLogAdapter =
DownloadLogsAdapter(
this,
this@DownloadLogListActivity
mainActivity
)
recyclerView = findViewById(R.id.logs_recyclerview)
recyclerView = view.findViewById(R.id.logs_recyclerview)
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = downloadLogAdapter
noResults = findViewById(R.id.no_results)
noResults = view.findViewById(R.id.no_results)
noResults.visibility = View.GONE
logFolder = File(filesDir.absolutePath + "/logs")
logFolder = File(requireContext().filesDir.absolutePath + "/logs")
updateList(logFolder)
if(Build.VERSION.SDK_INT < 29){
@ -78,7 +86,7 @@ class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickL
val itemId = m.itemId
if (itemId == R.id.remove_logs) {
try{
val deleteDialog = MaterialAlertDialogBuilder(this)
val deleteDialog = MaterialAlertDialogBuilder(requireContext())
deleteDialog.setTitle(getString(R.string.confirm_delete_history))
deleteDialog.setMessage(getString(R.string.confirm_delete_logs_desc))
deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
@ -107,7 +115,7 @@ class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickL
e.printStackTrace()
}
downloadLogAdapter.submitList(fileList.toList())
runOnUiThread{
mainActivity.runOnUiThread{
if (fileList.isNotEmpty()) {
noResults.visibility = View.GONE
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) {
val intent = Intent(this, DownloadLogActivity::class.java)
intent.putExtra("logpath", file.absolutePath)
startActivity(intent)
val bundle = Bundle()
bundle.putString("logpath", file.absolutePath)
findNavController().navigate(
R.id.downloadLogFragment,
bundle
)
}
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.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() }
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.ResumeActivity
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
@ -228,7 +228,7 @@ class NotificationUtil(var context: Context) {
) {
val notificationBuilder = getBuilder(channel)
val intent = Intent(context, DownloadLogActivity::class.java)
val intent = Intent(context, DownloadLogFragment::class.java)
intent.putExtra("logpath", logFile?.absolutePath)
val errorPendingIntent: PendingIntent = TaskStackBuilder.create(context).run {

View file

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

View file

@ -16,8 +16,8 @@
android:label="@string/downloads"
tools:layout="@layout/fragment_history" >
<action
android:id="@+id/action_historyFragment_to_downloadQueueActivity"
app:destination="@id/downloadQueueActivity" />
android:id="@+id/action_historyFragment_to_downloadQueueMainFragment"
app:destination="@id/downloadQueueMainFragment" />
</fragment>
<fragment
android:id="@+id/moreFragment"
@ -27,39 +27,22 @@
<action
android:id="@+id/action_moreFragment_to_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
android:id="@+id/action_moreFragment_to_settingsActivity2"
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>
<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
android:id="@+id/terminalActivity"
android:name="com.deniscerri.ytdlnis.ui.more.TerminalActivity"
@ -70,4 +53,31 @@
android:name="com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity"
android:label="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>