From 376ee73af27ea6afe2926fe173a95534409867a1 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sat, 6 May 2023 22:34:50 +0200 Subject: [PATCH] qol fixes --- app/build.gradle | 5 +- .../main/java/com/deniscerri/ytdlnis/App.kt | 12 +- .../com/deniscerri/ytdlnis/MainActivity.kt | 24 +- .../ytdlnis/database/dao/SearchHistoryDao.kt | 4 +- .../database/viewmodel/DownloadViewModel.kt | 4 +- .../database/viewmodel/ResultViewModel.kt | 3 +- .../ytdlnis/receiver/ShareActivity.kt | 3 +- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 19 +- .../ui/downloadcard/DownloadAudioFragment.kt | 3 +- .../ui/downloadcard/DownloadVideoFragment.kt | 3 +- .../FormatSelectionBottomSheetDialog.kt | 3 +- .../ui/more/CommandTemplatesActivity.kt | 16 +- .../ytdlnis/ui/more/CookiesActivity.kt | 8 + .../ytdlnis/ui/more/MoreFragment.kt | 3 +- .../ytdlnis/ui/more/TerminalActivity.kt | 3 +- .../ui/more/settings/SettingsFragment.kt | 488 +++++------------- .../com/deniscerri/ytdlnis/util/InfoUtil.kt | 4 +- .../com/deniscerri/ytdlnis/util/ThemeUtil.kt | 3 +- .../com/deniscerri/ytdlnis/util/UpdateUtil.kt | 10 +- .../deniscerri/ytdlnis/work/DownloadWorker.kt | 5 +- .../ytdlnis/work/TerminalDownloadWorker.kt | 5 +- .../res/drawable/baseline_restore_page_24.xml | 5 + .../res/drawable/baseline_save_alt_24.xml | 5 + app/src/main/res/drawable/rounded_corner.xml | 12 + .../res/layout/create_command_template.xml | 208 ++++---- app/src/main/res/layout/download_card.xml | 342 ++++++------ app/src/main/res/layout/format_item.xml | 9 +- .../main/res/layout/template_shortcuts.xml | 67 ++- .../res/layout/template_shortcuts_list.xml | 27 +- app/src/main/res/values-night/themes.xml | 1 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/themes.xml | 1 + app/src/main/res/xml/root_preferences.xml | 18 +- 33 files changed, 563 insertions(+), 762 deletions(-) create mode 100644 app/src/main/res/drawable/baseline_restore_page_24.xml create mode 100644 app/src/main/res/drawable/baseline_save_alt_24.xml create mode 100644 app/src/main/res/drawable/rounded_corner.xml diff --git a/app/build.gradle b/app/build.gradle index 901b1d8b..79d24c9b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -128,7 +128,7 @@ dependencies { implementation "androidx.appcompat:appcompat:$appCompatVer" implementation "androidx.constraintlayout:constraintlayout:2.1.4" - implementation 'com.google.android.material:material:1.9.0-rc01' + implementation 'com.google.android.material:material:1.9.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.3.0' implementation 'androidx.preference:preference:1.2.0' @@ -176,7 +176,6 @@ dependencies { implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.11' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0' - implementation "com.google.android.exoplayer:exoplayer:2.18.5" + implementation "com.google.android.exoplayer:exoplayer:2.18.6" implementation 'it.xabaras.android:recyclerview-swipedecorator:1.4' - } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/App.kt b/app/src/main/java/com/deniscerri/ytdlnis/App.kt index ca9e0e28..21f1eac4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/App.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/App.kt @@ -6,11 +6,14 @@ 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.core.content.edit import androidx.preference.PreferenceManager import androidx.work.Configuration import androidx.work.WorkManager import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdlnis.util.UpdateUtil import com.google.android.material.color.DynamicColors +import com.google.android.material.snackbar.Snackbar import com.yausername.aria2c.Aria2c import com.yausername.ffmpeg.FFmpeg import com.yausername.youtubedl_android.YoutubeDL @@ -35,12 +38,19 @@ class App : Application() { false ) - val sharedPreferences = getSharedPreferences("root_preferences", MODE_PRIVATE) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) applicationScope = CoroutineScope(SupervisorJob()) applicationScope.launch((Dispatchers.IO)) { try { initLibraries() + val appVer = sharedPreferences.getString("version", "")!! + if(appVer.isEmpty() || appVer != BuildConfig.VERSION_NAME){ + UpdateUtil(this@App).updateYoutubeDL() + sharedPreferences.edit(commit = true){ + putString("version", BuildConfig.VERSION_NAME) + } + } }catch (e: Exception){ Toast.makeText(this@App, e.message, Toast.LENGTH_SHORT).show() e.printStackTrace() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 95465689..97a8a83e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis import android.Manifest -import android.app.Activity import android.content.Context import android.content.DialogInterface import android.content.Intent @@ -18,6 +17,7 @@ import android.view.View import android.view.WindowInsets import android.widget.CheckBox import android.widget.TextView +import androidx.annotation.RequiresApi import androidx.core.app.ActivityCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.forEach @@ -26,6 +26,7 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import androidx.navigation.ui.setupWithNavController +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel @@ -69,7 +70,7 @@ class MainActivity : BaseActivity() { resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] cookieViewModel = ViewModelProvider(this)[CookieViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] - preferences = context.getSharedPreferences("root_preferences", MODE_PRIVATE) + preferences = PreferenceManager.getDefaultSharedPreferences(context) if (preferences.getBoolean("incognito", false)){ resultViewModel.deleteAll() @@ -98,7 +99,7 @@ class MainActivity : BaseActivity() { } } - val sharedPreferences = getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) val startDestination = sharedPreferences.getString("start_destination", "") val graph = navController.navInflater.inflate(R.navigation.nav_graph) @@ -154,7 +155,7 @@ class MainActivity : BaseActivity() { val dialogView = layoutInflater.inflate(R.layout.dialog_terminate_app, null) val checkbox = dialogView.findViewById(R.id.doNotShowAgain) terminateDialog.setView(dialogView) - checkbox.setOnCheckedChangeListener { compoundButton, b -> + checkbox.setOnCheckedChangeListener { compoundButton, _ -> doNotShowAgain = compoundButton.isChecked } @@ -179,14 +180,6 @@ class MainActivity : BaseActivity() { handleIntents(intent) } - fun hideNav() { - navigationView.visibility = View.GONE - } - - fun showNav() { - navigationView.visibility = View.VISIBLE - } - fun disableBottomNavigation(){ if (navigationView is NavigationBarView){ (navigationView as NavigationBarView).menu.forEach { it.isEnabled = false } @@ -272,8 +265,10 @@ class MainActivity : BaseActivity() { permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE) } } - if (!checkNotificationPermission()){ - permissions.add(Manifest.permission.POST_NOTIFICATIONS) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (!checkNotificationPermission()){ + permissions.add(Manifest.permission.POST_NOTIFICATIONS) + } } if (permissions.isNotEmpty()){ @@ -329,6 +324,7 @@ class MainActivity : BaseActivity() { } } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) private fun checkNotificationPermission(): Boolean { return (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt index a0e054a6..6a2f3e8a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt @@ -8,7 +8,7 @@ interface SearchHistoryDao { @Query("SELECT * from searchHistory ORDER BY id DESC LIMIT 10") fun getAll() : List - @Query("SELECT * from searchHistory WHERE query COLLATE NOCASE ='%'||:keyword||'%'") + @Query("SELECT * from searchHistory WHERE `query` COLLATE NOCASE ='%'||:keyword||'%'") fun getAllByKeyword(keyword: String) : List @Insert(onConflict = OnConflictStrategy.IGNORE) @@ -17,6 +17,6 @@ interface SearchHistoryDao { @Query("DELETE FROM searchHistory") suspend fun deleteAll() - @Query("DELETE FROM searchHistory WHERE query=:query") + @Query("DELETE FROM searchHistory WHERE `query`=:query") suspend fun delete(query: String) } \ No newline at end of file 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 4b56e6a9..7c8b5811 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 @@ -9,6 +9,7 @@ import android.widget.Toast import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope +import androidx.preference.PreferenceManager import androidx.work.* import com.deniscerri.ytdlnis.App import com.deniscerri.ytdlnis.R @@ -48,8 +49,7 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel init { val dao = DBManager.getInstance(application).downloadDao repository = DownloadRepository(dao) - sharedPreferences = - getApplication().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(application) commandTemplateDao = DBManager.getInstance(application).commandTemplateDao allDownloads = repository.allDownloads diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt index c24c5198..313b1131 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.App import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.DBManager @@ -37,7 +38,7 @@ class ResultViewModel(application: Application) : AndroidViewModel(application) items = repository.allResults loadingItems.postValue(false) itemCount = repository.itemCount - sharedPreferences = application.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(application) } fun checkTrending() = viewModelScope.launch(Dispatchers.IO){ 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 735dc295..3def4713 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt @@ -25,6 +25,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.DownloadItem @@ -81,7 +82,7 @@ class ShareActivity : BaseActivity() { resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] cookieViewModel = ViewModelProvider(this)[CookieViewModel::class.java] - sharedPreferences = getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) cookieViewModel.updateCookiesFile() val intent = intent 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 4c9eb5f8..ea76490a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -25,6 +25,7 @@ import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.MainActivity @@ -48,14 +49,13 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.search.SearchBar import com.google.android.material.search.SearchView -import com.google.android.material.search.SearchView.TransitionState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* -class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickListener { +class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListener { private var inputQueries: MutableList? = null private var homeAdapter: HomeAdapter? = null @@ -120,13 +120,13 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi resultsList = mutableListOf() selectedObjects = ArrayList() - sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) //initViews shimmerCards = view.findViewById(R.id.shimmer_results_framelayout) searchBar = view.findViewById(R.id.search_bar) searchView = view.findViewById(R.id.search_view) - linkYouCopied = searchView?.findViewById(R.id.link_you_copied) + linkYouCopied = searchView?.findViewById(R.id.link_you_copied) appBarLayout = view.findViewById(R.id.home_appbarlayout) queriesChipGroup = view.findViewById(R.id.queries) searchSuggestions = view.findViewById(R.id.search_suggestions_scroll_view) @@ -279,12 +279,10 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi updateSearchViewItems(it, linkYouCopied) } - searchView!!.editText.setOnTouchListener(OnTouchListener { v, event -> + searchView!!.editText.setOnTouchListener(OnTouchListener { _, event -> try{ val drawableLeft = 0 - val drawableTop = 1 val drawableRight = 2 - val drawableBottom = 3 if (event.action == MotionEvent.ACTION_UP) { if ( (isRightToLeft && (event.x < (searchView!!.editText.left - searchView!!.editText.compoundDrawables[drawableLeft].bounds.width()))) || @@ -333,7 +331,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } true } - queriesChipGroup!!.addOnLayoutChangeListener { view, i, i2, i3, i4, i5, i6, i7, i8 -> + queriesChipGroup!!.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> if (queriesChipGroup!!.childCount == 0) queriesConstraint.visibility = GONE else queriesConstraint.visibility = VISIBLE searchView!!.editText.setText("") @@ -344,6 +342,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } } + @SuppressLint("InflateParams") private fun updateSearchViewItems(it: Editable?, linkYouCopied: View?){ lifecycleScope.launch { searchSuggestionsLinearLayout!!.removeAllViews() @@ -499,7 +498,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi Log.e(TAG, type.toString() + " " + videoURL) val item = resultsList!!.find { it?.url == videoURL } Log.e(TAG, resultsList!![0].toString() + " " + videoURL) - val btn = recyclerView!!.findViewWithTag("""${item?.url}##$type""") + recyclerView!!.findViewWithTag("""${item?.url}##$type""") if (sharedPreferences!!.getBoolean("download_card", true)) { showSingleDownloadSheet(item!!, type!!, false) } else { @@ -524,7 +523,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, View.OnClickLi } override fun onCardClick(videoURL: String, add: Boolean) { - val item = resultsList?.find { it -> it?.url == videoURL } + val item = resultsList?.find { it?.url == videoURL } if (add) { selectedObjects!!.add(item!!) if (actionMode == null){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt index dda86aff..dcf9feae 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt @@ -18,6 +18,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.Format @@ -81,7 +82,7 @@ class DownloadAudioFragment(private var resultItem: ResultItem, private var curr } } val sharedPreferences = - requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + PreferenceManager.getDefaultSharedPreferences(requireContext()) try { title = view.findViewById(R.id.title_textinput) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt index 3a59b503..fa6e47bb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt @@ -21,6 +21,7 @@ import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.Format @@ -86,7 +87,7 @@ class DownloadVideoFragment(private val resultItem: ResultItem, private var curr } } - val sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) try { title = view.findViewById(R.id.title_textinput) title.editText!!.setText(downloadItem.title) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt index 05272e0a..82b7b043 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt @@ -18,6 +18,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.Format @@ -56,7 +57,7 @@ class FormatSelectionBottomSheetDialog(private val items: List, p infoUtil = InfoUtil(requireActivity().applicationContext) formatCollection = mutableListOf() chosenFormats = listOf() - sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) } 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 588beea3..69829fbc 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 @@ -6,6 +6,8 @@ import android.graphics.Canvas import android.graphics.Color import android.os.Bundle import android.view.MenuItem +import android.view.View +import android.widget.RelativeLayout import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider @@ -23,6 +25,7 @@ import com.deniscerri.ytdlnis.util.UiUtil import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.chip.Chip import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import it.xabaras.android.recyclerview.swipedecorator.RecyclerViewSwipeDecorator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -36,6 +39,7 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis private lateinit var commandTemplateViewModel: CommandTemplateViewModel private lateinit var uiUtil: UiUtil private lateinit var templatesList: List + private lateinit var noResults: RelativeLayout var context: Context? = null public override fun onCreate(savedInstanceState: Bundle?) { @@ -46,6 +50,7 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis topAppBar = findViewById(R.id.logs_toolbar) topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } + noResults = findViewById(R.id.no_results) templatesAdapter = TemplatesAdapter( @@ -62,6 +67,8 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis commandTemplateViewModel = ViewModelProvider(this)[CommandTemplateViewModel::class.java] commandTemplateViewModel.items.observe(this) { + if (it.isEmpty()) noResults.visibility = View.VISIBLE + else noResults.visibility = View.GONE templatesList = it templatesAdapter.submitList(it) } @@ -73,15 +80,18 @@ class CommandTemplatesActivity : BaseActivity(), TemplatesAdapter.OnItemClickLis topAppBar.setOnMenuItemClickListener { m: MenuItem -> val itemId = m.itemId if (itemId == R.id.export_clipboard) { - lifecycleScope.launch(Dispatchers.IO){ - commandTemplateViewModel.exportToClipboard() + lifecycleScope.launch{ + withContext(Dispatchers.IO){ + commandTemplateViewModel.exportToClipboard() + } + Snackbar.make(recyclerView, getString(R.string.copied_to_clipboard), Snackbar.LENGTH_LONG).show() } }else if (itemId == R.id.import_clipboard){ lifecycleScope.launch{ withContext(Dispatchers.IO){ val count = commandTemplateViewModel.importFromClipboard() runOnUiThread{ - Toast.makeText(this@CommandTemplatesActivity, "${getString(R.string.items_imported)} (${count})", Toast.LENGTH_LONG).show() + Snackbar.make(recyclerView, "${getString(R.string.items_imported)} (${count})", Snackbar.LENGTH_LONG).show() } } 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 d6b0a6ee..2fa6f454 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 @@ -7,8 +7,10 @@ import android.graphics.Canvas import android.graphics.Color import android.os.Bundle import android.view.MenuItem +import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.EditText +import android.widget.RelativeLayout import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.widget.doOnTextChanged @@ -29,6 +31,7 @@ import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.chip.Chip import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import it.xabaras.android.recyclerview.swipedecorator.RecyclerViewSwipeDecorator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -42,6 +45,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { private lateinit var cookiesViewModel: CookieViewModel private lateinit var uiUtil: UiUtil private lateinit var cookiesList: List + private lateinit var noResults : RelativeLayout var context: Context? = null public override fun onCreate(savedInstanceState: Bundle?) { @@ -52,6 +56,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { topAppBar = findViewById(R.id.logs_toolbar) topAppBar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } cookiesList = listOf() + noResults = findViewById(R.id.no_results) listAdapter = CookieAdapter( @@ -68,6 +73,8 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { cookiesViewModel = ViewModelProvider(this)[CookieViewModel::class.java] cookiesViewModel.items.observe(this) { + if (it.isEmpty()) noResults.visibility = View.VISIBLE + else noResults.visibility = View.GONE cookiesList = it listAdapter.submitList(it) } @@ -98,6 +105,7 @@ class CookiesActivity : BaseActivity(), CookieAdapter.OnItemClickListener { } R.id.export_clipboard -> { cookiesViewModel.exportToClipboard() + Snackbar.make(recyclerView, getString(R.string.copied_to_clipboard), Snackbar.LENGTH_LONG).show() } } true diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt index c8ea9942..f5ebc7ba 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt @@ -11,6 +11,7 @@ import android.view.ViewGroup import android.widget.CheckBox import android.widget.TextView import androidx.fragment.app.Fragment +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.ui.downloads.DownloadQueueActivity @@ -42,7 +43,7 @@ class MoreFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainSharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + mainSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) mainSharedPreferencesEditor = mainSharedPreferences.edit() terminal = view.findViewById(R.id.terminal) logs = view.findViewById(R.id.logs) 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 7f27226f..a7c0d887 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 @@ -23,6 +23,7 @@ import androidx.core.view.forEach import androidx.core.view.get import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import androidx.work.* import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel @@ -80,7 +81,7 @@ class TerminalActivity : BaseActivity() { topAppBar!!.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() } commandTemplateViewModel = ViewModelProvider(this)[CommandTemplateViewModel::class.java] - sharedPreferences = getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) bottomAppBar = findViewById(R.id.bottomAppBar) 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 7c739125..fab5c573 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 @@ -1,24 +1,30 @@ package com.deniscerri.ytdlnis.ui.more.settings +import android.annotation.SuppressLint import android.app.Activity +import android.content.ClipboardManager import android.content.Context.POWER_SERVICE import android.content.Intent import android.net.Uri -import android.os.Build import android.os.Build.VERSION import android.os.Build.VERSION_CODES import android.os.Bundle import android.os.Environment -import android.os.Looper import android.os.PowerManager import android.provider.Settings -import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.core.content.edit import androidx.core.os.LocaleListCompat import androidx.lifecycle.lifecycleScope -import androidx.preference.* +import androidx.preference.EditTextPreference +import androidx.preference.ListPreference +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceManager +import androidx.preference.SeekBarPreference +import androidx.preference.SwitchPreferenceCompat import androidx.work.WorkInfo import androidx.work.WorkManager import com.deniscerri.ytdlnis.BuildConfig @@ -28,13 +34,22 @@ 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.google.android.material.snackbar.Snackbar import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.put +import kotlinx.serialization.json.putJsonArray import java.io.File -import java.util.* +import java.util.Locale class SettingsFragment : PreferenceFragmentCompat() { @@ -48,41 +63,15 @@ class SettingsFragment : PreferenceFragmentCompat() { private var commandPath: Preference? = null private var accessAllFiles : Preference? = null private var clearCache: Preference? = null - private var keepCache: SwitchPreferenceCompat? = null - private var incognito: SwitchPreferenceCompat? = null - private var preferredDownloadType : ListPreference? = null - private var searchEngine : ListPreference? = null - private var startDestination : ListPreference? = null - private var downloadCard: SwitchPreferenceCompat? = null - private var quickDownload: SwitchPreferenceCompat? = null - private var meteredNetwork: SwitchPreferenceCompat? = null - private var apiKey: EditTextPreference? = null - private var homeRecommendations: SwitchPreferenceCompat? = null private var locale: ListPreference? = null private var concurrentFragments: SeekBarPreference? = null private var concurrentDownloads: SeekBarPreference? = null - private var limitRate: EditTextPreference? = null - private var aria2: SwitchPreferenceCompat? = null - private var logDownloads: SwitchPreferenceCompat? = null - private var sponsorblockFilters: MultiSelectListPreference? = null - private var filenameTemplate: EditTextPreference? = null - private var restrictFilenames: SwitchPreferenceCompat? = null - private var mtime: SwitchPreferenceCompat? = null - private var embedSubtitles: SwitchPreferenceCompat? = null - private var writeSubtitles: SwitchPreferenceCompat? = null - private var embedThumbnail: SwitchPreferenceCompat? = null - private var addChapters: SwitchPreferenceCompat? = null - private var writeThumbnail: SwitchPreferenceCompat? = null private var audioFormat: ListPreference? = null private var videoFormat: ListPreference? = null - private var audioQuality: SeekBarPreference? = null private var videoQuality: ListPreference? = null private var formatID: EditTextPreference? = null private var updateYTDL: Preference? = null - private var updateNightlyYTDL: SwitchPreferenceCompat? = null - private var updateFormats: SwitchPreferenceCompat? = null private var formatSource: ListPreference? = null - private var updateApp: SwitchPreferenceCompat? = null private var exportPreferences : Preference? = null private var importPreferences : Preference? = null private var ytdlVersion: Preference? = null @@ -111,8 +100,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } private fun initPreferences() { - val preferences = - requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + val preferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) val editor = preferences.edit() language = findPreference("app_language") theme = findPreference("ytdlnis_theme") @@ -124,41 +112,17 @@ class SettingsFragment : PreferenceFragmentCompat() { commandPath = findPreference("command_path") accessAllFiles = findPreference("access_all_files") clearCache = findPreference("clear_cache") - keepCache = findPreference("keep_cache") - incognito = findPreference("incognito") - preferredDownloadType = findPreference("preferred_download_type") - searchEngine = findPreference("search_engine") - startDestination = findPreference("start_destination") - downloadCard = findPreference("download_card") - quickDownload = findPreference("quick_download") - meteredNetwork = findPreference("metered_networks") - apiKey = findPreference("api_key") - homeRecommendations = findPreference("home_recommendations") + locale = findPreference("locale") concurrentFragments = findPreference("concurrent_fragments") concurrentDownloads = findPreference("concurrent_downloads") - limitRate = findPreference("limit_rate") - aria2 = findPreference("aria2") - logDownloads = findPreference("log_downloads") - sponsorblockFilters = findPreference("sponsorblock_filters") - mtime = findPreference("mtime") - embedSubtitles = findPreference("embed_subtitles") - writeSubtitles = findPreference("write_subtitles") - filenameTemplate = findPreference("file_name_template") - restrictFilenames = findPreference("restrict_filenames") - embedThumbnail = findPreference("embed_thumbnail") - addChapters = findPreference("add_chapters") - writeThumbnail = findPreference("write_thumbnail") + audioFormat = findPreference("audio_format") videoFormat = findPreference("video_format") - audioQuality = findPreference("audio_quality") videoQuality = findPreference("video_quality") formatID = findPreference("format_id") updateYTDL = findPreference("update_ytdl") - updateNightlyYTDL = findPreference("nightly_ytdl") - updateFormats = findPreference("update_formats") formatSource = findPreference("formats_source") - updateApp = findPreference("update_app") exportPreferences = findPreference("export_preferences") importPreferences = findPreference("import_preferences") ytdlVersion = findPreference("ytdl-version") @@ -202,17 +166,17 @@ class SettingsFragment : PreferenceFragmentCompat() { editor.apply() } + @SuppressLint("BatteryLife", "InlinedApi") private fun initListeners() { val preferences = - requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + PreferenceManager.getDefaultSharedPreferences(requireContext()) val editor = preferences.edit() + if(language!!.value == null) language!!.value = Locale.getDefault().language language!!.summary = Locale(language!!.value).getDisplayLanguage(Locale(language!!.value)) language!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("app_language", newValue.toString()) language!!.summary = Locale(newValue.toString()).getDisplayLanguage(Locale(newValue.toString())) - editor.apply() AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue.toString())) true } @@ -231,10 +195,7 @@ class SettingsFragment : PreferenceFragmentCompat() { theme!!.summary = getString(R.string.light) } } - editor.putString("ytdlnis_theme", newValue.toString()) - editor.commit() ThemeUtil.updateTheme(requireActivity() as AppCompatActivity) - val intent = Intent(requireContext(), MainActivity::class.java) this.startActivity(intent) requireActivity().finishAffinity() @@ -242,25 +203,15 @@ class SettingsFragment : PreferenceFragmentCompat() { } accent!!.summary = accent!!.entry accent!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("theme_accent", newValue.toString()) - editor.apply().apply { - accent!!.summary = accent!!.entry - } + Preference.OnPreferenceChangeListener { _: Preference?, _: Any -> 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() - + Preference.OnPreferenceChangeListener { _: Preference?, _: Any -> ThemeUtil.updateTheme(requireActivity() as AppCompatActivity) val intent = Intent(requireContext(), MainActivity::class.java) this.startActivity(intent) @@ -322,108 +273,25 @@ class SettingsFragment : PreferenceFragmentCompat() { Preference.OnPreferenceClickListener { if (activeDownloadCount == 0){ File(requireContext().cacheDir.absolutePath + "/downloads").deleteRecursively() - Toast.makeText(requireContext(), getString(R.string.cache_cleared), Toast.LENGTH_SHORT).show() + Snackbar.make(requireView(), getString(R.string.cache_cleared), Snackbar.LENGTH_SHORT).show() cacheSize = File(requireContext().cacheDir.absolutePath + "/downloads").walkBottomUp().fold(0L) { acc, file -> acc + file.length() } clearCache!!.summary = "(${fileUtil!!.convertFileSize(cacheSize)}) ${resources.getString(R.string.clear_temporary_files_summary)}" }else{ - Toast.makeText(requireContext(), getString(R.string.downloads_running_try_later), Toast.LENGTH_SHORT).show() + Snackbar.make(requireView(), getString(R.string.downloads_running_try_later), Snackbar.LENGTH_SHORT).show() } true } - keepCache!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("keep_cache", enable) - editor.apply() - true - } - incognito!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("incognito", enable) - editor.apply() - true - } - preferredDownloadType!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("preferred_download_type", newValue.toString()) - editor.apply() - true - } - searchEngine!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("search_engine", newValue.toString()) - editor.apply() - true - } - startDestination!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("start_destination", newValue.toString()) - editor.apply() - true - } - downloadCard!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("download_card", enable) - editor.apply() - true - } - quickDownload!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("quick_download", enable) - editor.apply() - true - } - meteredNetwork!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("metered_networks", enable) - editor.apply() - true - } - apiKey!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("api_key", newValue.toString()) - editor.apply() - true - } - homeRecommendations!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("home_recommendations", enable) - editor.apply() - true - } - locale!!.summary = locale!!.value - locale!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("locale", newValue.toString()) - locale!!.summary = newValue.toString() - editor.apply() - true - } - concurrentFragments!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val value = newValue.toString().toInt() - editor.putInt("concurrent_fragments", value) - editor.apply() - true - } - concurrentDownloads!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val value = newValue.toString().toInt() - editor.putInt("concurrent_downloads", value) - editor.apply() + locale!!.summary = locale!!.value + concurrentDownloads!!.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _: Preference?, _: Any -> MaterialAlertDialogBuilder(requireContext()) .setTitle(resources.getString(R.string.warning)) .setMessage(resources.getString(R.string.workmanager_updated)) - .setNegativeButton(resources.getString(R.string.cancel)) { dialog, which -> + .setNegativeButton(resources.getString(R.string.cancel)) { dialog, _ -> dialog.cancel() } - .setPositiveButton(resources.getString(R.string.restart)) { dialog, which -> + .setPositiveButton(resources.getString(R.string.restart)) { _, _ -> val intent = Intent(context, MainActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) requireContext().startActivity(intent) @@ -436,257 +304,151 @@ class SettingsFragment : PreferenceFragmentCompat() { true } - limitRate!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("limit_rate", newValue.toString()) - editor.apply() - true - } - aria2!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("aria2", enable) - editor.apply() - true - } - logDownloads!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("log_downloads", enable) - editor.apply() - true - } - sponsorblockFilters!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any? -> - sponsorblockFilters!!.values = newValue as Set? - editor.putStringSet("sponsorblock_filters", newValue) - editor.apply() - true - } - filenameTemplate!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("file_name_template", newValue.toString()) - editor.apply() - true - } - restrictFilenames!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val embed = newValue as Boolean - editor.putBoolean("restrict_filenames", embed) - editor.apply() - true - } - mtime!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val embed = newValue as Boolean - editor.putBoolean("mtime", embed) - editor.apply() - true - } - embedSubtitles!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val embed = newValue as Boolean - editor.putBoolean("embed_subtitles", embed) - editor.apply() - true - } - writeSubtitles!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val embed = newValue as Boolean - editor.putBoolean("write_subtitles", embed) - editor.apply() - true - } - embedThumbnail!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val embed = newValue as Boolean - editor.putBoolean("embed_thumbnail", embed) - editor.apply() - true - } - addChapters!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val add = newValue as Boolean - editor.putBoolean("add_chapters", add) - editor.apply() - true - } - writeThumbnail!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val write = newValue as Boolean - editor.putBoolean("write_thumbnail", write) - editor.apply() - true - } + audioFormat!!.summary = preferences.getString("audio_format", "")!!.replace("Default", getString(R.string.defaultValue)) audioFormat!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("audio_format", newValue.toString()) audioFormat!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue)) - editor.apply() true } videoFormat!!.summary = preferences.getString("video_format", "")!!.replace("Default", getString(R.string.defaultValue)) videoFormat!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("video_format", newValue.toString()) videoFormat!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue)) - editor.apply() - true - } - audioQuality!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putInt("audio_quality", newValue.toString().toInt()) - editor.apply() true } + videoQuality!!.summary = preferences.getString("video_quality", "") videoQuality!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("video_quality", newValue.toString()) videoQuality!!.summary = newValue.toString() - editor.apply() true } formatID!!.summary = formatID!!.text formatID!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> formatID!!.summary = newValue.toString() - editor.putString("format_id", newValue.toString()) - editor.apply() true } + YoutubeDL.getInstance().version(context)?.let { + editor.putString("ytdl-version", it) + editor.apply() + ytdlVersion!!.summary = it + } updateYTDL!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { lifecycleScope.launch { + Snackbar.make(requireView(), + requireContext().getString(R.string.ytdl_updating_started), + Snackbar.LENGTH_LONG).show() when (updateUtil!!.updateYoutubeDL()) { YoutubeDL.UpdateStatus.DONE -> { - Toast.makeText( - context, + Snackbar.make(requireView(), requireContext().getString(R.string.ytld_update_success), - Toast.LENGTH_LONG - ).show() + Snackbar.LENGTH_LONG).show() + YoutubeDL.getInstance().version(context)?.let { editor.putString("ytdl-version", it) editor.apply() ytdlVersion!!.summary = it } } - YoutubeDL.UpdateStatus.ALREADY_UP_TO_DATE -> Toast.makeText( - context, + YoutubeDL.UpdateStatus.ALREADY_UP_TO_DATE -> Snackbar.make(requireView(), requireContext().getString(R.string.you_are_in_latest_version), - Toast.LENGTH_LONG - ).show() - else -> Toast.makeText(context, getString(R.string.errored), Toast.LENGTH_LONG).show() + Snackbar.LENGTH_LONG).show() + else -> { + Snackbar.make(requireView(), + requireContext().getString(R.string.errored), + Snackbar.LENGTH_LONG).show() + } } } true } - updateFormats!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("update_formats", enable) - editor.apply() - true - } formatSource!!.summary = preferences.getString("formats_source", "")!!.replace("Default", getString(R.string.defaultValue)) formatSource!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - editor.putString("formats_source", newValue.toString()) formatSource!!.summary = newValue.toString().replace("Default", getString(R.string.defaultValue)) - editor.apply() true } - updateNightlyYTDL!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("nightly_ytdl", enable) - editor.apply() + exportPreferences!!.onPreferenceClickListener = + Preference.OnPreferenceClickListener { + val prefs = preferences.all + val json = buildJsonObject { + putJsonArray("YTDLnis_Preferences") { + prefs.forEach { + add(buildJsonObject { + put("key", it.key) + put("value", it.value.toString()) + put("type", it.value!!::class.simpleName) + }) + } + } + } + val string = jsonFormat.encodeToString(json) + val clipboard: ClipboardManager = + requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager + clipboard.setText(string) + Snackbar.make(requireView(), getString(R.string.copied_to_clipboard), Snackbar.LENGTH_LONG).show() true } - updateApp!!.onPreferenceChangeListener = - Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> - val enable = newValue as Boolean - editor.putBoolean("update_app", enable) - editor.apply() + importPreferences!!.onPreferenceClickListener = + Preference.OnPreferenceClickListener { + val clipboard = requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager + val clip = clipboard.primaryClip!!.getItemAt(0).text.toString() + try{ + PreferenceManager.getDefaultSharedPreferences(requireContext()).edit(commit = true) { + clear() + + val preferencesKeys = preferences.all.map { it.key } + jsonFormat.decodeFromString(clip).run { + val prefs = this.jsonObject["YTDLnis_Preferences"]!!.jsonArray + prefs.forEach { + val key : String = it.jsonObject["key"].toString().replace("\"", "") + if (preferencesKeys.contains(key)){ + when(it.jsonObject["type"].toString().replace("\"", "")){ + "String" -> { + val value = it.jsonObject["value"].toString().replace("\"", "") + putString(key, value) + } + "Boolean" -> { + val value = it.jsonObject["value"].toString().replace("\"", "").toBoolean() + putBoolean(key, value) + } + "Int" -> { + val value = it.jsonObject["value"].toString().replace("\"", "").toInt() + putInt(key, value) + } + "HashSet" -> { + val value = hashSetOf(it.jsonObject["value"].toString().replace("(\")|(\\[)|(])".toRegex(), "")) + putStringSet(key, value) + } + } + } + } + } + } + + val intent = Intent(context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + requireContext().startActivity(intent) + if (context is Activity) { + (context as Activity).finish() + } + Runtime.getRuntime().exit(0) + }catch (e: Exception){ + e.printStackTrace() + } + true } -// exportPreferences!!.onPreferenceClickListener = -// Preference.OnPreferenceClickListener { -// val prefs = preferences.all -// val json = buildJsonObject { -// putJsonArray("YTDLnis_Preferences") { -// prefs.forEach { -// add(buildJsonObject { -// put("key", it.key) -// put("value", it.value.toString()) -// put("type", it.value!!::class.simpleName) -// }) -// } -// } -// } -// val string = jsonFormat.encodeToString(json) -// val clipboard: ClipboardManager = -// requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager -// clipboard.setText(string) -// true -// } -// importPreferences!!.onPreferenceClickListener = -// Preference.OnPreferenceClickListener { -// val clipboard = requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager -// val clip = clipboard.primaryClip!!.getItemAt(0).text.toString() -// try{ -// val preferencesKeys = preferences.all.map { it.key } -// var count = 0 -// jsonFormat.decodeFromString(clip).run { -// val prefs = this.jsonObject["YTDLnis_Preferences"]!!.jsonArray -// prefs.forEach { -// val key : String = it.jsonObject["key"].toString().replace("\"", "") -// if (preferencesKeys.contains(key)){ -// when(it.jsonObject["type"].toString().replace("\"", "")){ -// "String" -> { -// val value = it.jsonObject["value"].toString().replace("\"", "") -// Log.e("aa", value.toString()) -// editor.putString(key, value) -// editor.apply() -// } -// "Boolean" -> { -// val value = it.jsonObject["value"].toString().replace("\"", "").toBoolean() -// Log.e("aa", value.toString()) -// editor.putBoolean(key, value) -// editor.apply() -// } -// "Int" -> { -// val value = it.jsonObject["value"].toString().replace("\"", "").toInt() -// Log.e("aa", value.toString()) -// editor.putInt(key, value) -// editor.apply() -// } -// "HashSet" -> { -// val value = hashSetOf(it.jsonObject["value"].toString().replace("(\")|(\\[)|(])".toRegex(), "")) -// Log.e("aa", value.toString()) -// editor.putStringSet(key, value) -// editor.apply() -// } -// } -// count++ -// } -// } -// } -// Toast.makeText(requireContext(), "${getString(R.string.items_imported)} (${count})", Toast.LENGTH_LONG).show() -// }catch (e: Exception){ -// e.printStackTrace() -// } -// -// true -// } version!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { lifecycleScope.launch{ withContext(Dispatchers.IO){ updateUtil!!.updateApp{ msg -> lifecycleScope.launch(Dispatchers.Main){ - Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() + Snackbar.make(requireView(), msg, Snackbar.LENGTH_LONG).show() } } } @@ -742,8 +504,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private fun changePath(p: Preference?, data: Intent?, requestCode: Int) { val path = data!!.data.toString() p!!.summary = fileUtil?.formatPath(data.data.toString()) - val sharedPreferences = - requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) val editor = sharedPreferences.edit() when (requestCode) { MUSIC_PATH_CODE -> editor.putString("music_path", path) @@ -757,6 +518,5 @@ class SettingsFragment : PreferenceFragmentCompat() { const val MUSIC_PATH_CODE = 33333 const val VIDEO_PATH_CODE = 55555 const val COMMAND_PATH_CODE = 77777 - private const val TAG = "SettingsFragment" } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt index 8809e8c5..9658ab05 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt @@ -6,6 +6,7 @@ import android.content.SharedPreferences import android.os.Looper import android.util.Log import android.widget.Toast +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.Format import com.deniscerri.ytdlnis.database.models.ResultItem @@ -32,8 +33,7 @@ class InfoUtil(private val context: Context) { init { try { - sharedPreferences = - context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) key = sharedPreferences.getString("api_key", "") countryCODE = sharedPreferences.getString("locale", "")!! } catch (e: Exception) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt index 241c6057..1358173a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt @@ -4,6 +4,7 @@ import android.app.Application import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.R import com.google.android.material.color.DynamicColors @@ -11,7 +12,7 @@ import com.google.android.material.color.DynamicColors object ThemeUtil { fun updateTheme(activity: AppCompatActivity) { - val sharedPreferences = activity.getSharedPreferences("root_preferences", Application.MODE_PRIVATE) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity) //update accent when (sharedPreferences.getString("theme_accent","blue")) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt b/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt index a7d82c7b..e5a4da73 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt @@ -11,6 +11,7 @@ import android.os.Handler import android.os.Looper import android.util.Log import android.widget.Toast +import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.BuildConfig import com.deniscerri.ytdlnis.R import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -146,7 +147,7 @@ class UpdateUtil(var context: Context) { suspend fun updateYoutubeDL() : UpdateStatus? = withContext(Dispatchers.IO){ val sharedPreferences = - context.getSharedPreferences("root_preferences", Activity.MODE_PRIVATE) + PreferenceManager.getDefaultSharedPreferences(context) if (updatingYTDL) { withContext(Dispatchers.Main){ Toast.makeText( @@ -157,13 +158,6 @@ class UpdateUtil(var context: Context) { } UpdateStatus.ALREADY_UP_TO_DATE } - withContext(Dispatchers.Main){ - Toast.makeText( - context, - context.getString(R.string.ytdl_updating_started), - Toast.LENGTH_SHORT - ).show() - } updatingYTDL = true diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt index 03c5c16f..e289d0a9 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt @@ -8,6 +8,7 @@ import android.os.Handler import android.os.Looper import android.util.Log import android.widget.Toast +import androidx.preference.PreferenceManager import androidx.work.* import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R @@ -103,9 +104,7 @@ class DownloadWorker( tempFileDir.delete() tempFileDir.mkdirs() - val sharedPreferences = context.getSharedPreferences("root_preferences", - Service.MODE_PRIVATE - ) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val aria2 = sharedPreferences.getBoolean("aria2", false) if (aria2) { request.addOption("--downloader", "libaria2c.so") diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt index a2dd1815..300dd86a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt @@ -8,6 +8,7 @@ import android.os.Handler import android.os.Looper import android.util.Log import android.widget.Toast +import androidx.preference.PreferenceManager import androidx.work.* import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R @@ -40,9 +41,7 @@ class TerminalDownloadWorker( setForegroundAsync(foregroundInfo) val request = YoutubeDLRequest(emptyList()) - val sharedPreferences = context.getSharedPreferences("root_preferences", - Service.MODE_PRIVATE - ) + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val downloadLocation = sharedPreferences.getString("command_path", context.getString(R.string.command_path)) val tempFileDir = File(context.cacheDir.absolutePath + "/downloads/" + itemId) diff --git a/app/src/main/res/drawable/baseline_restore_page_24.xml b/app/src/main/res/drawable/baseline_restore_page_24.xml new file mode 100644 index 00000000..3efcde75 --- /dev/null +++ b/app/src/main/res/drawable/baseline_restore_page_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/baseline_save_alt_24.xml b/app/src/main/res/drawable/baseline_save_alt_24.xml new file mode 100644 index 00000000..784c76ee --- /dev/null +++ b/app/src/main/res/drawable/baseline_save_alt_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/rounded_corner.xml b/app/src/main/res/drawable/rounded_corner.xml new file mode 100644 index 00000000..c9f2a687 --- /dev/null +++ b/app/src/main/res/drawable/rounded_corner.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/create_command_template.xml b/app/src/main/res/layout/create_command_template.xml index d3d32392..5219895b 100644 --- a/app/src/main/res/layout/create_command_template.xml +++ b/app/src/main/res/layout/create_command_template.xml @@ -5,7 +5,7 @@ android:orientation="vertical" android:layout_height="match_parent"> - + + + + + + + +