diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 87c0ba9e..e5339e17 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,7 +29,7 @@ android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme" + android:theme="@style/BaseTheme" tools:ignore="DataExtractionRules" tools:targetApi="tiramisu"> + android:theme="@style/BaseTheme"> diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 004a7a7c..29baaa00 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -29,9 +29,11 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.ui.setupWithNavController import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel 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.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 @@ -48,7 +50,7 @@ import java.nio.charset.Charset import java.nio.charset.StandardCharsets import kotlin.system.exitProcess -class MainActivity : AppCompatActivity() { +class MainActivity : BaseActivity() { lateinit var context: Context private lateinit var preferences: SharedPreferences @@ -157,7 +159,6 @@ class MainActivity : AppCompatActivity() { true } } - cookieViewModel.updateCookiesFile() val intent = intent handleIntents(intent) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt index a05edd59..54540ec5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt @@ -135,6 +135,38 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel } + fun createResultItemFromDownload(downloadItem: DownloadItem) : ResultItem { + return ResultItem( + 0, + downloadItem.url, + downloadItem.title, + downloadItem.author, + downloadItem.duration, + downloadItem.thumb, + downloadItem.website, + downloadItem.playlistTitle, + downloadItem.allFormats, + System.currentTimeMillis() + ) + + } + + fun createResultItemFromHistory(downloadItem: HistoryItem) : ResultItem { + return ResultItem( + 0, + downloadItem.url, + downloadItem.title, + downloadItem.author, + downloadItem.duration, + downloadItem.thumb, + downloadItem.website, + "", + arrayListOf(), + System.currentTimeMillis() + ) + + } + fun switchDownloadType(list: List, type: Type) : List{ list.forEach { val format = getFormat(it.allFormats, type) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt index 3e14190c..c32b5562 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt @@ -141,7 +141,7 @@ class ShareActivity : AppCompatActivity() { private fun showDownloadSheet(it: ResultItem){ if (sharedPreferences.getBoolean("download_card", true)){ - val bottomSheet = DownloadBottomSheetDialog(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!)) + val bottomSheet = DownloadBottomSheetDialog(it, DownloadViewModel.Type.valueOf(sharedPreferences.getString("preferred_download_type", "video")!!), null) bottomSheet.show(supportFragmentManager, "downloadSingleSheet") }else{ lifecycleScope.launch(Dispatchers.IO){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt new file mode 100644 index 00000000..63e13162 --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt @@ -0,0 +1,12 @@ +package com.deniscerri.ytdlnis.ui + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.deniscerri.ytdlnis.util.ThemeUtil + +open class BaseActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + ThemeUtil.updateTheme(this) + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt index 22e79cc7..e9e43a9f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -495,7 +495,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } private fun showSingleDownloadSheet(resultItem : ResultItem, type: DownloadViewModel.Type){ - val bottomSheet = DownloadBottomSheetDialog(resultItem, type) + val bottomSheet = DownloadBottomSheetDialog(resultItem, type, null) bottomSheet.show(parentFragmentManager, "downloadSingleSheet") } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt index 2e46c02f..1bf66f14 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt @@ -41,7 +41,7 @@ import java.text.SimpleDateFormat import java.util.* -class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val type: Type) : BottomSheetDialogFragment() { +class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val type: Type, private val downloadItem: DownloadItem?) : BottomSheetDialogFragment() { private lateinit var tabLayout: TabLayout private lateinit var viewPager2: ViewPager2 private lateinit var fragmentAdapter : DownloadFragmentAdapter @@ -50,6 +50,10 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val private lateinit var commandTemplateDao : CommandTemplateDao private lateinit var uiUtil: UiUtil + private lateinit var downloadAudioFragment: DownloadAudioFragment + private lateinit var downloadVideoFragment: DownloadVideoFragment + private lateinit var downloadCommandFragment: DownloadCommandFragment + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] @@ -78,14 +82,16 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val isNestedScrollingEnabled = false overScrollMode = View.OVER_SCROLL_NEVER } - - val fragments = mutableListOf(DownloadAudioFragment(resultItem, null), DownloadVideoFragment(resultItem, null)) + downloadAudioFragment = DownloadAudioFragment(resultItem, downloadItem) + downloadVideoFragment = DownloadVideoFragment(resultItem, downloadItem) + val fragments = mutableListOf(downloadAudioFragment, downloadVideoFragment) var commandTemplateNr = 0 lifecycleScope.launch{ withContext(Dispatchers.IO){ commandTemplateNr = commandTemplateDao.getTotalNumber() if(commandTemplateNr > 0){ - fragments.add(DownloadCommandFragment(resultItem, null)) + downloadCommandFragment = DownloadCommandFragment(resultItem, downloadItem) + fragments.add(downloadCommandFragment) }else{ (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 0.3f @@ -212,11 +218,9 @@ class DownloadBottomSheetDialog(private val resultItem: ResultItem, private val private fun cleanUp(){ kotlin.runCatching { parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("downloadSingleSheet")!!).commit() - for (i in 0 until viewPager2.adapter?.itemCount!!){ - if (parentFragmentManager.findFragmentByTag("f${i}") != null){ - parentFragmentManager.beginTransaction().remove(parentFragmentManager.findFragmentByTag("f$i")!!).commit() - } - } + parentFragmentManager.beginTransaction().remove(downloadVideoFragment).commit() + parentFragmentManager.beginTransaction().remove(downloadVideoFragment).commit() + parentFragmentManager.beginTransaction().remove(downloadCommandFragment).commit() if (activity is ShareActivity){ (activity as ShareActivity).finish() } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt index be716589..624a49af 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsBottomSheetDialog.kt @@ -145,7 +145,7 @@ class SelectPlaylistItemsBottomSheetDialog(private val items: List, val checkedResultItems = items.filter { item -> checkedItems.contains(item!!.url) } if (checkedResultItems.size == 1){ val resultItem = resultViewModel.getItemByURL(checkedResultItems[0]!!.url) - val bottomSheet = DownloadBottomSheetDialog(resultItem, type) + val bottomSheet = DownloadBottomSheetDialog(resultItem, type, null) bottomSheet.show(parentFragmentManager, "downloadSingleSheet") }else{ val downloadItems = mutableListOf() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt index fa42401d..6a7dff33 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt @@ -69,7 +69,9 @@ class ActiveDownloadsFragment() : Fragment(), ActiveDownloadAdapter.OnItemClickL val landScape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val displayMetrics: DisplayMetrics = requireContext().resources.displayMetrics val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density - if (dpWidth > 1200 && landScape){ + if (dpWidth >= 1600 && landScape) { + activeRecyclerView.layoutManager = GridLayoutManager(context, 4) + }else if (dpWidth > 1200 && landScape){ activeRecyclerView.layoutManager = GridLayoutManager(context, 3) }else if (landScape || dpWidth >= 650){ activeRecyclerView.layoutManager = GridLayoutManager(context, 2) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt index 428910f2..95e932f9 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt @@ -25,6 +25,7 @@ import com.deniscerri.ytdlnis.adapter.GenericDownloadAdapter 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.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetDialog @@ -80,7 +81,9 @@ class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClic val landScape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val displayMetrics: DisplayMetrics = requireContext().resources.displayMetrics val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density - if (dpWidth > 1200 && landScape){ + if (dpWidth >= 1600 && landScape) { + cancelledRecyclerView.layoutManager = GridLayoutManager(context, 4) + }else if (dpWidth > 1200 && landScape){ cancelledRecyclerView.layoutManager = GridLayoutManager(context, 3) }else if (landScape || dpWidth >= 650){ cancelledRecyclerView.layoutManager = GridLayoutManager(context, 2) @@ -191,6 +194,13 @@ class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClic bottomSheet.cancel() } + redownload.setOnLongClickListener { + bottomSheet.cancel() + val sheet = DownloadBottomSheetDialog(downloadViewModel.createResultItemFromDownload(item), item.type, item) + sheet.show(parentFragmentManager, "downloadSingleSheet") + true + } + openFile.visibility = View.GONE bottomSheet.show() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt index 6198b785..23e7ceee 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueActivity.kt @@ -15,6 +15,7 @@ import androidx.work.WorkManager import androidx.work.await import com.deniscerri.ytdlnis.R 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,7 +26,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class DownloadQueueActivity : AppCompatActivity(){ +class DownloadQueueActivity : BaseActivity(){ private lateinit var downloadViewModel: DownloadViewModel private lateinit var topAppBar: MaterialToolbar private lateinit var workManager: WorkManager diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt index bb65a1d6..3bf12655 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt @@ -28,6 +28,7 @@ import com.deniscerri.ytdlnis.adapter.GenericDownloadAdapter 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.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil @@ -83,7 +84,9 @@ class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickL val landScape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val displayMetrics: DisplayMetrics = requireContext().resources.displayMetrics val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density - if (dpWidth > 1200 && landScape){ + if (dpWidth >= 1600 && landScape) { + erroredRecyclerView.layoutManager = GridLayoutManager(context, 4) + }else if (dpWidth > 1200 && landScape){ erroredRecyclerView.layoutManager = GridLayoutManager(context, 3) }else if (landScape || dpWidth >= 650){ erroredRecyclerView.layoutManager = GridLayoutManager(context, 2) @@ -191,6 +194,13 @@ class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickL bottomSheet.cancel() } + redownload.setOnLongClickListener { + bottomSheet.cancel() + val sheet = DownloadBottomSheetDialog(downloadViewModel.createResultItemFromDownload(item), item.type, item) + sheet.show(parentFragmentManager, "downloadSingleSheet") + true + } + openFile.visibility = View.GONE bottomSheet.show() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt index 83307315..6c5dd9b6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt @@ -34,6 +34,7 @@ import com.deniscerri.ytdlnis.database.repository.HistoryRepository.HistorySort import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel import com.deniscerri.ytdlnis.databinding.FragmentHistoryBinding +import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.appbar.AppBarLayout @@ -118,7 +119,9 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ val landScape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val displayMetrics: DisplayMetrics = requireContext().resources.displayMetrics val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density - if (dpWidth > 1200 && landScape){ + if (dpWidth >= 1600 && landScape) { + recyclerView?.layoutManager = GridLayoutManager(context, 4) + }else if (dpWidth > 1200 && landScape){ recyclerView?.layoutManager = GridLayoutManager(context, 3) }else if (landScape || dpWidth >= 650){ recyclerView?.layoutManager = GridLayoutManager(context, 2) @@ -486,6 +489,13 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ bottomSheet!!.cancel() } + redownload.setOnLongClickListener { + bottomSheet!!.cancel() + val sheet = DownloadBottomSheetDialog(downloadViewModel.createResultItemFromHistory(item), item.type, null) + sheet.show(parentFragmentManager, "downloadSingleSheet") + true + } + if (!isPresent) openFile.visibility = GONE else redownload.visibility = GONE diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt index 22941fa4..7d280ef9 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt @@ -91,7 +91,9 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi val landScape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val displayMetrics: DisplayMetrics = requireContext().resources.displayMetrics val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density - if (dpWidth > 1200 && landScape){ + if (dpWidth >= 1600 && landScape) { + queuedRecyclerView.layoutManager = GridLayoutManager(context, 4) + }else if (dpWidth > 1200 && landScape){ queuedRecyclerView.layoutManager = GridLayoutManager(context, 3) }else if (landScape || dpWidth >= 650){ queuedRecyclerView.layoutManager = GridLayoutManager(context, 2) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt index c82f53a4..594d28f9 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesActivity.kt @@ -14,6 +14,7 @@ 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 @@ -24,7 +25,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class CommandTemplatesActivity : AppCompatActivity(), TemplatesAdapter.OnItemClickListener { +class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickListener { private lateinit var recyclerView: RecyclerView private lateinit var templatesAdapter: TemplatesAdapter private lateinit var topAppBar: MaterialToolbar diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt index c2e5a809..dd4d6988 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesActivity.kt @@ -18,6 +18,7 @@ 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 @@ -28,7 +29,7 @@ import kotlinx.coroutines.launch import java.io.File -class CookiesActivity : AppCompatActivity(), CookieAdapter.OnItemClickListener { +class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { private lateinit var recyclerView: RecyclerView private lateinit var listAdapter: CookieAdapter private lateinit var topAppBar: MaterialToolbar diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt index 74b8e64f..07c8870e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/TerminalActivity.kt @@ -28,6 +28,7 @@ import androidx.lifecycle.lifecycleScope import androidx.work.* import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdlnis.ui.BaseActivity import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.NotificationUtil import com.deniscerri.ytdlnis.util.UiUtil @@ -46,7 +47,7 @@ import java.io.File import kotlin.properties.Delegates -class TerminalActivity : AppCompatActivity() { +class TerminalActivity : BaseActivity() { private var topAppBar: MaterialToolbar? = null private lateinit var notificationUtil: NotificationUtil private var output: TextView? = null diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt index 315a96a8..847a229a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt @@ -12,6 +12,7 @@ import androidx.lifecycle.lifecycleScope import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.CookieItem import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel +import com.deniscerri.ytdlnis.ui.BaseActivity import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.button.MaterialButton @@ -20,7 +21,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class WebViewActivity : AppCompatActivity() { +class WebViewActivity : BaseActivity() { private lateinit var cookiesViewModel: CookieViewModel private lateinit var webView: WebView private lateinit var toolbar: MaterialToolbar diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogActivity.kt index d0c1707f..72a3bdfc 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogActivity.kt @@ -10,12 +10,13 @@ import android.widget.ScrollView import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import com.deniscerri.ytdlnis.R +import com.deniscerri.ytdlnis.ui.BaseActivity import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import java.io.File -class DownloadLogActivity : AppCompatActivity() { +class DownloadLogActivity : BaseActivity() { private lateinit var content: TextView private lateinit var contentScrollView : ScrollView private lateinit var topAppBar: MaterialToolbar diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListActivity.kt index 2e154962..79a433cb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListActivity.kt @@ -15,12 +15,13 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView 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 : AppCompatActivity(), DownloadLogsAdapter.OnItemClickListener { +class DownloadLogListActivity : BaseActivity(), DownloadLogsAdapter.OnItemClickListener { private lateinit var recyclerView: RecyclerView private lateinit var downloadLogAdapter: DownloadLogsAdapter private lateinit var noResults: RelativeLayout diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt index 4bb4c60d..0e37a84d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt @@ -6,10 +6,11 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentManager import com.deniscerri.ytdlnis.R +import com.deniscerri.ytdlnis.ui.BaseActivity import com.google.android.material.appbar.MaterialToolbar -class SettingsActivity : AppCompatActivity() { +class SettingsActivity : BaseActivity() { private var fm: FragmentManager? = null private var topAppBar: MaterialToolbar? = null private lateinit var sharedPreferences: SharedPreferences diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt index f26d3d70..bba1035b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsFragment.kt @@ -10,9 +10,9 @@ import android.os.Bundle import android.os.Environment import android.os.PowerManager import android.provider.Settings -import android.util.Log import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import androidx.lifecycle.lifecycleScope @@ -23,6 +23,7 @@ import com.deniscerri.ytdlnis.BuildConfig import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdlnis.util.ThemeUtil import com.deniscerri.ytdlnis.util.UpdateUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.yausername.youtubedl_android.YoutubeDL @@ -35,6 +36,8 @@ import java.util.* class SettingsFragment : PreferenceFragmentCompat() { private var language: ListPreference? = null private var theme: ListPreference? = null + private var accent: ListPreference? = null + private var highContrast: SwitchPreferenceCompat? = null private var ignoreBatteryOptimization: Preference? = null private var musicPath: Preference? = null private var videoPath: Preference? = null @@ -105,6 +108,8 @@ class SettingsFragment : PreferenceFragmentCompat() { val editor = preferences.edit() language = findPreference("app_language") theme = findPreference("ytdlnis_theme") + accent = findPreference("theme_accent") + highContrast = findPreference("high_contrast") ignoreBatteryOptimization = findPreference("ignore_battery") musicPath = findPreference("music_path") videoPath = findPreference("video_path") @@ -164,7 +169,9 @@ class SettingsFragment : PreferenceFragmentCompat() { ignoreBatteryOptimization!!.isVisible = false } - editor.putString("theme", theme!!.value) + editor.putString("ytdlnis_theme", theme!!.value) + editor.putString("theme_accent", accent!!.value) + editor.putBoolean("high_contrast", highContrast!!.isChecked) if (preferences.getString("music_path", "")!!.isEmpty()) { editor.putString("music_path", getString(R.string.music_path)) @@ -230,32 +237,57 @@ class SettingsFragment : PreferenceFragmentCompat() { true } - theme!!.summary = when(theme!!.value){ - "Default" -> getString(R.string.defaultValue) - "Dark" -> getString(R.string.dark) - else -> getString(R.string.light) - } + theme!!.summary = theme!!.entry theme!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> when(newValue){ - "Default" -> { - theme!!.summary = getString(R.string.defaultValue) - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + "System" -> { + theme!!.summary = getString(R.string.system) } "Dark" -> { theme!!.summary = getString(R.string.dark) - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) } else -> { theme!!.summary = getString(R.string.light) - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) } } editor.putString("ytdlnis_theme", newValue.toString()) - editor.apply() + editor.commit() + ThemeUtil.updateTheme(requireActivity() as AppCompatActivity) + + val intent = Intent(requireContext(), MainActivity::class.java) + this.startActivity(intent) + requireActivity().finishAffinity() true } + accent!!.summary = accent!!.entry + accent!!.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> + editor.putString("theme_accent", newValue.toString()) + editor.apply().apply { + accent!!.summary = accent!!.entry + } + ThemeUtil.updateTheme(requireActivity() as AppCompatActivity) + val intent = Intent(requireContext(), MainActivity::class.java) + this.startActivity(intent) + requireActivity().finishAffinity() + + true + } + highContrast!!.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> + val enable = newValue as Boolean + editor.putBoolean("high_contrast", enable) + editor.apply() + + ThemeUtil.updateTheme(requireActivity() as AppCompatActivity) + val intent = Intent(requireContext(), MainActivity::class.java) + this.startActivity(intent) + requireActivity().finishAffinity() + + true + } ignoreBatteryOptimization!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { val intent = Intent() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt new file mode 100644 index 00000000..51c029cb --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt @@ -0,0 +1,46 @@ +package com.deniscerri.ytdlnis.util + +import android.app.Application +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import com.deniscerri.ytdlnis.R +import com.google.android.material.color.DynamicColors + + +object ThemeUtil { + + fun updateTheme(activity: AppCompatActivity) { + val sharedPreferences = activity.getSharedPreferences("root_preferences", Application.MODE_PRIVATE) + val themeMode = sharedPreferences.getString("ytdlnis_theme", "Default")!! + + //update accent + val themeAccent = sharedPreferences.getString("theme_accent","blue") + when (themeAccent) { + "Default" -> activity.setTheme(R.style.BaseTheme) + "blue" -> activity.setTheme(R.style.Theme_Blue) + "red" -> activity.setTheme(R.style.Theme_Red) + "green" -> activity.setTheme(R.style.Theme_Green) + "purple" -> activity.setTheme(R.style.Theme_Purple) + "yellow" -> activity.setTheme(R.style.Theme_Yellow) + "monochrome" -> activity.setTheme(R.style.Theme_Monochrome) + } + + + //dynamic colors + if (themeAccent == "Default") DynamicColors.applyToActivityIfAvailable(activity) + + //high contrast theme + val highContrast = sharedPreferences.getBoolean( + "high_contrast", + false + ) + if (highContrast) activity.theme.applyStyle(R.style.Pure, true) + + when (themeMode) { + "System" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + "Light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + "Dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_color_lens_24.xml b/app/src/main/res/drawable/baseline_color_lens_24.xml new file mode 100644 index 00000000..8dd35f4f --- /dev/null +++ b/app/src/main/res/drawable/baseline_color_lens_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/baseline_invert_colors_24.xml b/app/src/main/res/drawable/baseline_invert_colors_24.xml new file mode 100644 index 00000000..5f5f2ca5 --- /dev/null +++ b/app/src/main/res/drawable/baseline_invert_colors_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout-sw650dp/fragment_home.xml b/app/src/main/res/layout-sw650dp/fragment_home.xml index 86bf9a4b..a9725ca4 100644 --- a/app/src/main/res/layout-sw650dp/fragment_home.xml +++ b/app/src/main/res/layout-sw650dp/fragment_home.xml @@ -117,7 +117,6 @@ android:id="@+id/home_toolbar" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:theme="@style/Toolbar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/configure_download_bottom_sheet.xml b/app/src/main/res/layout/configure_download_bottom_sheet.xml index cee1f511..da21bd3a 100644 --- a/app/src/main/res/layout/configure_download_bottom_sheet.xml +++ b/app/src/main/res/layout/configure_download_bottom_sheet.xml @@ -93,6 +93,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" + android:textAlignment="textStart" android:singleLine="true" android:text="@string/app_name" android:textSize="15sp" diff --git a/app/src/main/res/layout/download_bottom_sheet.xml b/app/src/main/res/layout/download_bottom_sheet.xml index 57b2dfe6..bf0cac00 100644 --- a/app/src/main/res/layout/download_bottom_sheet.xml +++ b/app/src/main/res/layout/download_bottom_sheet.xml @@ -109,7 +109,7 @@