diff --git a/app/src/main/java/com/deniscerri/ytdlnis/App.kt b/app/src/main/java/com/deniscerri/ytdlnis/App.kt index 67e42664..caa5c7eb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/App.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/App.kt @@ -1,7 +1,11 @@ package com.deniscerri.ytdlnis import android.app.Application +import android.app.UiModeManager.MODE_NIGHT_NO +import android.app.UiModeManager.MODE_NIGHT_YES import android.widget.Toast +import androidx.appcompat.app.AppCompatDelegate +import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM import androidx.preference.PreferenceManager import androidx.work.Configuration import androidx.work.WorkManager @@ -32,6 +36,8 @@ class App : Application() { false ) + val sharedPreferences = getSharedPreferences("root_preferences", MODE_PRIVATE) + applicationScope = CoroutineScope(SupervisorJob()) applicationScope.launch((Dispatchers.IO)) { try { @@ -42,12 +48,19 @@ class App : Application() { } } + AppCompatDelegate.setDefaultNightMode( + when(sharedPreferences.getString("ytdlnis_theme", "Default")){ + "Default" -> MODE_NIGHT_FOLLOW_SYSTEM + "Dark" -> MODE_NIGHT_YES + else -> MODE_NIGHT_NO + } + ) + WorkManager.initialize( this@App, Configuration.Builder() .setExecutor(Executors.newFixedThreadPool( - getSharedPreferences("root_preferences", MODE_PRIVATE) - .getInt("concurrent_downloads", 1))) + sharedPreferences.getInt("concurrent_downloads", 1))) .build()) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 25686649..fa436458 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -33,9 +33,11 @@ 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.UpdateUtil +import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationView +import com.google.android.material.navigationrail.NavigationRailView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.BufferedReader @@ -95,17 +97,16 @@ class MainActivity : AppCompatActivity() { val sharedPreferences = getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) val startDestination = sharedPreferences.getString("start_destination", "") - val graph = navHostFragment.navController.navInflater.inflate(R.navigation.nav_graph) + val graph = navController.navInflater.inflate(R.navigation.nav_graph) when(startDestination) { - "History" -> graph.setStartDestination(R.id.historyFragment) - "More" -> graph.setStartDestination(R.id.moreFragment) - else -> graph.setStartDestination(R.id.homeFragment) + "History" -> graph.setStartDestination(R.id.historyFragment) + "More" -> if (navigationView is NavigationBarView) graph.setStartDestination(R.id.moreFragment) else graph.setStartDestination(R.id.homeFragment) + else -> graph.setStartDestination(R.id.homeFragment) } - navHostFragment.navController.graph = graph - - + navController.graph = graph if (navigationView is NavigationBarView){ + (navigationView as NavigationBarView).selectedItemId = graph.startDestinationId (navigationView as NavigationBarView).setupWithNavController(navController) (navigationView as NavigationBarView).setOnItemReselectedListener { when (it.itemId) { @@ -125,6 +126,7 @@ class MainActivity : AppCompatActivity() { } } if (navigationView is NavigationView){ + (navigationView as NavigationView).setCheckedItem(graph.startDestinationId) (navigationView as NavigationView).setupWithNavController(navController) //terminate button (navigationView as NavigationView).menu.getItem(7).setOnMenuItemClickListener { 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 ffbf7994..fa42401d 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 @@ -71,7 +71,7 @@ class ActiveDownloadsFragment() : Fragment(), ActiveDownloadAdapter.OnItemClickL val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density if (dpWidth > 1200 && landScape){ activeRecyclerView.layoutManager = GridLayoutManager(context, 3) - }else if (landScape || dpWidth >= 700){ + }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 f4887209..c85399d0 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 @@ -82,7 +82,7 @@ class CancelledDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClic val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density if (dpWidth > 1200 && landScape){ cancelledRecyclerView.layoutManager = GridLayoutManager(context, 3) - }else if (landScape || dpWidth >= 700){ + }else if (landScape || dpWidth >= 650){ cancelledRecyclerView.layoutManager = GridLayoutManager(context, 2) } 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 e5c803d0..cf28c919 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 @@ -85,7 +85,7 @@ class ErroredDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickL val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density if (dpWidth > 1200 && landScape){ erroredRecyclerView.layoutManager = GridLayoutManager(context, 3) - }else if (landScape || dpWidth >= 700){ + }else if (landScape || dpWidth >= 650){ erroredRecyclerView.layoutManager = GridLayoutManager(context, 2) } 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 957d5c73..83307315 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 @@ -120,7 +120,7 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density if (dpWidth > 1200 && landScape){ recyclerView?.layoutManager = GridLayoutManager(context, 3) - }else if (landScape || dpWidth >= 700){ + }else if (landScape || dpWidth >= 650){ recyclerView?.layoutManager = GridLayoutManager(context, 2) } noResults?.visibility = GONE @@ -297,6 +297,9 @@ class HistoryFragment : Fragment(), HistoryAdapter.OnItemClickListener{ historyViewModel.setSorting(HistoryRepository.HistorySortType.FILESIZE) changeSortIcon(filesize, historyViewModel.sortOrder.value!!) } + val displayMetrics = DisplayMetrics() + requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics) + sortSheet!!.behavior.peekHeight = displayMetrics.heightPixels sortSheet!!.show() } 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 1d69809f..22941fa4 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 @@ -93,7 +93,7 @@ class QueuedDownloadsFragment : Fragment(), GenericDownloadAdapter.OnItemClickLi val dpWidth: Float = displayMetrics.widthPixels / displayMetrics.density if (dpWidth > 1200 && landScape){ queuedRecyclerView.layoutManager = GridLayoutManager(context, 3) - }else if (landScape || dpWidth >= 700){ + }else if (landScape || dpWidth >= 650){ queuedRecyclerView.layoutManager = GridLayoutManager(context, 2) } 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 1a6b76de..f26d3d70 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,6 +10,7 @@ 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.AppCompatDelegate @@ -33,6 +34,7 @@ import java.util.* class SettingsFragment : PreferenceFragmentCompat() { private var language: ListPreference? = null + private var theme: ListPreference? = null private var ignoreBatteryOptimization: Preference? = null private var musicPath: Preference? = null private var videoPath: Preference? = null @@ -102,6 +104,7 @@ class SettingsFragment : PreferenceFragmentCompat() { requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) val editor = preferences.edit() language = findPreference("app_language") + theme = findPreference("ytdlnis_theme") ignoreBatteryOptimization = findPreference("ignore_battery") musicPath = findPreference("music_path") videoPath = findPreference("video_path") @@ -161,6 +164,8 @@ class SettingsFragment : PreferenceFragmentCompat() { ignoreBatteryOptimization!!.isVisible = false } + editor.putString("theme", theme!!.value) + if (preferences.getString("music_path", "")!!.isEmpty()) { editor.putString("music_path", getString(R.string.music_path)) } @@ -225,6 +230,32 @@ 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!!.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> + when(newValue){ + "Default" -> { + theme!!.summary = getString(R.string.defaultValue) + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_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() + true + } + ignoreBatteryOptimization!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { val intent = Intent() diff --git a/app/src/main/res/drawable/baseline_format_paint_24.xml b/app/src/main/res/drawable/baseline_format_paint_24.xml new file mode 100644 index 00000000..1323aedc --- /dev/null +++ b/app/src/main/res/drawable/baseline_format_paint_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/history_card.xml b/app/src/main/res/layout/history_card.xml index 4c138f6c..d8441fa4 100644 --- a/app/src/main/res/layout/history_card.xml +++ b/app/src/main/res/layout/history_card.xml @@ -1,5 +1,6 @@ @@ -62,7 +64,7 @@ android:id="@+id/downloads_info_bottom" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="10dp" + android:padding="10dp" android:ellipsize="end" android:gravity="bottom" android:maxLines="1" @@ -76,20 +78,25 @@ android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/downloads_info_time" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintVertical_bias="1.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/downloads_title" - app:layout_constraintVertical_bias="1.0" /> + app:layout_constraintTop_toBottomOf="@+id/downloads_download_button_type" /> + app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8fe39e7f..872acd90 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -163,4 +163,20 @@ History More + + + @string/defaultValue + @string/dark + @string/light + + + + Default + Dark + Light + + + + Dark + Light \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 219a71ab..fc9a05dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -223,4 +223,5 @@ Codec Audio Sample Rate Copied To Clipboard + Theme \ No newline at end of file diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index ed6f23f9..9eb5479e 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -8,6 +8,15 @@ app:summary="en" app:title="@string/language" /> + +