diff --git a/app/src/main/java/com/github/libretube/Globals.kt b/app/src/main/java/com/github/libretube/Globals.kt index 7d4ff4ddd..7a0a9df80 100644 --- a/app/src/main/java/com/github/libretube/Globals.kt +++ b/app/src/main/java/com/github/libretube/Globals.kt @@ -1,7 +1,16 @@ package com.github.libretube +/** + * Global variables can be stored here + */ object Globals { + // for the player fragment var isFullScreen = false var isMiniPlayerVisible = false + + // for the settings var isCurrentViewMainSettings = true + + // for the data saver mode + var dataSaverModeEnabled = false } diff --git a/app/src/main/java/com/github/libretube/activities/MainActivity.kt b/app/src/main/java/com/github/libretube/activities/MainActivity.kt index dc79c69b5..2e6046bef 100644 --- a/app/src/main/java/com/github/libretube/activities/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/activities/MainActivity.kt @@ -75,6 +75,13 @@ class MainActivity : AppCompatActivity() { RetrofitInstance.url } + // save whether the data saver mode is enabled + Globals.dataSaverModeEnabled = PreferenceHelper.getBoolean( + this, + "data_saver_mode", + false + ) + // show noInternet Activity if no internet available on app startup if (!ConnectionHelper.isNetworkAvailable(this)) { val noInternetIntent = Intent(this, NoInternetActivity::class.java) @@ -268,7 +275,8 @@ class MainActivity : AppCompatActivity() { minimizePlayer() } catch (e: Exception) { if (navController.currentDestination?.id == startFragmentId) { - super.onBackPressed() + // close app + moveTaskToBack(true) } else { navController.popBackStack() } diff --git a/app/src/main/java/com/github/libretube/activities/SettingsActivity.kt b/app/src/main/java/com/github/libretube/activities/SettingsActivity.kt index 5adea738a..433317ff2 100644 --- a/app/src/main/java/com/github/libretube/activities/SettingsActivity.kt +++ b/app/src/main/java/com/github/libretube/activities/SettingsActivity.kt @@ -3,9 +3,10 @@ package com.github.libretube.activities import android.os.Build import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import com.github.libretube.Globals import com.github.libretube.R import com.github.libretube.databinding.ActivitySettingsBinding +import com.github.libretube.preferences.AboutFragment +import com.github.libretube.preferences.CommunityFragment import com.github.libretube.preferences.MainSettings import com.github.libretube.util.ThemeHelper @@ -22,6 +23,8 @@ class SettingsActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivitySettingsBinding.inflate(layoutInflater) + + // animate the layout transition if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { overridePendingTransition(50, 50) } @@ -43,16 +46,24 @@ class SettingsActivity : AppCompatActivity() { } override fun onBackPressed() { - if (Globals.isCurrentViewMainSettings) { - super.onBackPressed() - finishAndRemoveTask() - } else { - Globals.isCurrentViewMainSettings = true - supportFragmentManager - .beginTransaction() - .replace(R.id.settings, MainSettings()) - .commit() - changeTopBarText(getString(R.string.settings)) + when (supportFragmentManager.findFragmentById(R.id.settings)) { + is MainSettings -> { + super.onBackPressed() + finishAndRemoveTask() + } + is CommunityFragment -> { + supportFragmentManager + .beginTransaction() + .replace(R.id.settings, AboutFragment()) + .commit() + } + else -> { + supportFragmentManager + .beginTransaction() + .replace(R.id.settings, MainSettings()) + .commit() + changeTopBarText(getString(R.string.settings)) + } } } diff --git a/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt b/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt index ed5b83e58..69c6302a2 100644 --- a/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt @@ -12,8 +12,8 @@ import com.github.libretube.databinding.VideoChannelRowBinding import com.github.libretube.dialogs.VideoOptionsDialog import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.StreamItem +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.formatShort -import com.squareup.picasso.Picasso class ChannelAdapter( private val videoFeed: MutableList, @@ -45,7 +45,7 @@ class ChannelAdapter( DateUtils.getRelativeTimeSpanString(trending.uploaded!!) channelDuration.text = DateUtils.formatElapsedTime(trending.duration!!) - Picasso.get().load(trending.thumbnail).into(channelThumbnail) + ConnectionHelper.loadImage(trending.thumbnail, channelThumbnail) root.setOnClickListener { var bundle = Bundle() bundle.putString("videoId", trending.url!!.replace("/watch?v=", "")) diff --git a/app/src/main/java/com/github/libretube/adapters/ChaptersAdapter.kt b/app/src/main/java/com/github/libretube/adapters/ChaptersAdapter.kt index 6a28be080..c595c08d0 100644 --- a/app/src/main/java/com/github/libretube/adapters/ChaptersAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/ChaptersAdapter.kt @@ -5,8 +5,8 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.github.libretube.databinding.ChapterColumnBinding import com.github.libretube.obj.ChapterSegment +import com.github.libretube.util.ConnectionHelper import com.google.android.exoplayer2.ExoPlayer -import com.squareup.picasso.Picasso class ChaptersAdapter( private val chapters: List, @@ -23,7 +23,7 @@ class ChaptersAdapter( override fun onBindViewHolder(holder: ChaptersViewHolder, position: Int) { val chapter = chapters[position] holder.binding.apply { - Picasso.get().load(chapter.image).fit().centerCrop().into(chapterImage) + ConnectionHelper.loadImage(chapter.image, chapterImage) chapterTitle.text = chapter.title root.setOnClickListener { diff --git a/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt b/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt index cbac097ad..e8f1a0e7b 100644 --- a/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt @@ -14,9 +14,9 @@ import com.github.libretube.activities.MainActivity import com.github.libretube.databinding.CommentsRowBinding import com.github.libretube.obj.Comment import com.github.libretube.obj.CommentsPage +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.RetrofitInstance import com.github.libretube.util.formatShort -import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -53,7 +53,7 @@ class CommentsAdapter( " • " + comment.commentedTime.toString() commentText.text = comment.commentText.toString() - Picasso.get().load(comment.thumbnail).fit().centerCrop().into(commentorImage) + ConnectionHelper.loadImage(comment.thumbnail, commentorImage) likesTextView.text = comment.likeCount?.toLong().formatShort() if (comment.verified == true) { diff --git a/app/src/main/java/com/github/libretube/adapters/PlaylistAdapter.kt b/app/src/main/java/com/github/libretube/adapters/PlaylistAdapter.kt index d6ec9bea0..bbd79bf76 100644 --- a/app/src/main/java/com/github/libretube/adapters/PlaylistAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/PlaylistAdapter.kt @@ -17,8 +17,8 @@ import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.PlaylistId import com.github.libretube.obj.StreamItem import com.github.libretube.preferences.PreferenceHelper +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.RetrofitInstance -import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -55,7 +55,7 @@ class PlaylistAdapter( playlistTitle.text = streamItem.title playlistDescription.text = streamItem.uploaderName playlistDuration.text = DateUtils.formatElapsedTime(streamItem.duration!!) - Picasso.get().load(streamItem.thumbnail).into(playlistThumbnail) + ConnectionHelper.loadImage(streamItem.thumbnail, playlistThumbnail) root.setOnClickListener { var bundle = Bundle() bundle.putString("videoId", streamItem.url!!.replace("/watch?v=", "")) diff --git a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt index 7818583e9..94a1f7ba6 100644 --- a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt @@ -12,9 +12,9 @@ import com.github.libretube.databinding.PlaylistsRowBinding import com.github.libretube.obj.PlaylistId import com.github.libretube.obj.Playlists import com.github.libretube.preferences.PreferenceHelper +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.RetrofitInstance import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -45,7 +45,7 @@ class PlaylistsAdapter( override fun onBindViewHolder(holder: PlaylistsViewHolder, position: Int) { val playlist = playlists[position] holder.binding.apply { - Picasso.get().load(playlist.thumbnail).into(playlistThumbnail) + ConnectionHelper.loadImage(playlist.thumbnail, playlistThumbnail) // set imageview drawable as empty playlist if imageview empty if (playlistThumbnail.drawable == null) { playlistThumbnail.setImageResource(R.drawable.ic_empty_playlist) diff --git a/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt b/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt index d53429a03..db0136540 100644 --- a/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt @@ -10,8 +10,8 @@ import com.github.libretube.R import com.github.libretube.activities.MainActivity import com.github.libretube.databinding.RepliesRowBinding import com.github.libretube.obj.Comment +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.formatShort -import com.squareup.picasso.Picasso class RepliesAdapter( private val replies: MutableList @@ -44,7 +44,7 @@ class RepliesAdapter( " • " + reply.commentedTime.toString() commentText.text = reply.commentText.toString() - Picasso.get().load(reply.thumbnail).fit().centerCrop().into(commentorImage) + ConnectionHelper.loadImage(reply.thumbnail, commentorImage) likesTextView.text = reply.likeCount?.toLong().formatShort() if (reply.verified == true) { diff --git a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt index 29a14e39d..775cd0991 100644 --- a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt @@ -20,9 +20,9 @@ import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.SearchItem import com.github.libretube.obj.Subscribe import com.github.libretube.preferences.PreferenceHelper +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.RetrofitInstance import com.github.libretube.util.formatShort -import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -84,14 +84,14 @@ class SearchAdapter( private fun bindWatch(item: SearchItem, binding: VideoSearchRowBinding) { binding.apply { - Picasso.get().load(item.thumbnail).fit().centerCrop().into(searchThumbnail) + ConnectionHelper.loadImage(item.thumbnail, searchThumbnail) if (item.duration != -1L) { searchThumbnailDuration.text = DateUtils.formatElapsedTime(item.duration!!) } else { searchThumbnailDuration.text = root.context.getString(R.string.live) searchThumbnailDuration.setBackgroundColor(R.attr.colorPrimaryDark) } - Picasso.get().load(item.uploaderAvatar).fit().centerCrop().into(searchChannelImage) + ConnectionHelper.loadImage(item.uploaderAvatar, searchChannelImage) searchDescription.text = item.title val viewsString = if (item.views?.toInt() != -1) item.views.formatShort() else "" val uploadDate = if (item.uploadedDate != null) item.uploadedDate else "" @@ -131,7 +131,7 @@ class SearchAdapter( private fun bindChannel(item: SearchItem, binding: ChannelSearchRowBinding) { binding.apply { - Picasso.get().load(item.thumbnail).fit().centerCrop().into(searchChannelImage) + ConnectionHelper.loadImage(item.thumbnail, searchChannelImage) searchChannelName.text = item.name searchViews.text = root.context.getString( R.string.subscribers, @@ -219,7 +219,7 @@ class SearchAdapter( private fun bindPlaylist(item: SearchItem, binding: PlaylistSearchRowBinding) { binding.apply { - Picasso.get().load(item.thumbnail).fit().centerCrop().into(searchThumbnail) + ConnectionHelper.loadImage(item.thumbnail, searchThumbnail) if (item.videos?.toInt() != -1) searchPlaylistNumber.text = item.videos.toString() searchDescription.text = item.name searchName.text = item.uploaderName diff --git a/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt index 9ba5513e7..62bd9a652 100644 --- a/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SubscriptionAdapter.kt @@ -15,8 +15,8 @@ import com.github.libretube.databinding.TrendingRowBinding import com.github.libretube.dialogs.VideoOptionsDialog import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.StreamItem +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.formatShort -import com.squareup.picasso.Picasso class SubscriptionAdapter( private val videoFeed: List, @@ -72,8 +72,8 @@ class SubscriptionAdapter( } catch (e: Exception) { } } - Picasso.get().load(trending.thumbnail).into(thumbnail) - Picasso.get().load(trending.uploaderAvatar).into(channelImage) + ConnectionHelper.loadImage(trending.thumbnail, thumbnail) + ConnectionHelper.loadImage(trending.uploaderAvatar, channelImage) root.setOnClickListener { val bundle = Bundle() bundle.putString("videoId", trending.url!!.replace("/watch?v=", "")) diff --git a/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt index 6def52cb1..a5dcb0871 100644 --- a/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SubscriptionChannelAdapter.kt @@ -12,8 +12,8 @@ import com.github.libretube.databinding.ChannelSubscriptionRowBinding import com.github.libretube.obj.Subscribe import com.github.libretube.obj.Subscription import com.github.libretube.preferences.PreferenceHelper +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.RetrofitInstance -import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -40,7 +40,7 @@ class SubscriptionChannelAdapter(private val subscriptions: MutableList, @@ -63,12 +63,8 @@ class TrendingAdapter( } catch (e: Exception) { } } - if (trending.thumbnail!!.isNotEmpty()) { - Picasso.get().load(trending.thumbnail).into(thumbnail) - } - if (trending.uploaderAvatar!!.isNotEmpty()) { - Picasso.get().load(trending.uploaderAvatar).into(channelImage) - } + ConnectionHelper.loadImage(trending.thumbnail, thumbnail) + ConnectionHelper.loadImage(trending.uploaderAvatar, channelImage) root.setOnClickListener { var bundle = Bundle() diff --git a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt index 07ed2e388..eee3d3331 100644 --- a/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/WatchHistoryAdapter.kt @@ -15,7 +15,7 @@ import com.github.libretube.databinding.WatchHistoryRowBinding import com.github.libretube.dialogs.VideoOptionsDialog import com.github.libretube.fragments.PlayerFragment import com.github.libretube.obj.WatchHistoryItem -import com.squareup.picasso.Picasso +import com.github.libretube.util.ConnectionHelper class WatchHistoryAdapter( private val watchHistory: MutableList, @@ -43,8 +43,8 @@ class WatchHistoryAdapter( channelName.text = video.uploader uploadDate.text = video.uploadDate thumbnailDuration.text = DateUtils.formatElapsedTime(video.duration?.toLong()!!) - Picasso.get().load(video.thumbnailUrl).into(thumbnail) - Picasso.get().load(video.uploaderAvatar).into(channelImage) + ConnectionHelper.loadImage(video.thumbnailUrl, thumbnail) + ConnectionHelper.loadImage(video.uploaderAvatar, channelImage) channelImage.setOnClickListener { val activity = root.context as MainActivity diff --git a/app/src/main/java/com/github/libretube/fragments/ChannelFragment.kt b/app/src/main/java/com/github/libretube/fragments/ChannelFragment.kt index ffcf56b7c..9194596fe 100644 --- a/app/src/main/java/com/github/libretube/fragments/ChannelFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/ChannelFragment.kt @@ -14,9 +14,9 @@ import com.github.libretube.adapters.ChannelAdapter import com.github.libretube.databinding.FragmentChannelBinding import com.github.libretube.obj.Subscribe import com.github.libretube.preferences.PreferenceHelper +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.RetrofitInstance import com.github.libretube.util.formatShort -import com.squareup.picasso.Picasso import retrofit2.HttpException import java.io.IOException @@ -194,8 +194,8 @@ class ChannelFragment : Fragment() { binding.channelDescription.text = response.description?.trim() } - Picasso.get().load(response.bannerUrl).into(binding.channelBanner) - Picasso.get().load(response.avatarUrl).into(binding.channelImage) + ConnectionHelper.loadImage(response.bannerUrl, binding.channelBanner) + ConnectionHelper.loadImage(response.avatarUrl, binding.channelImage) channelAdapter = ChannelAdapter( response.relatedStreams!!.toMutableList(), childFragmentManager diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 2b58cd071..642901044 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -57,6 +57,7 @@ import com.github.libretube.obj.Subscribe import com.github.libretube.preferences.PreferenceHelper import com.github.libretube.services.IS_DOWNLOAD_RUNNING import com.github.libretube.util.BackgroundMode +import com.github.libretube.util.ConnectionHelper import com.github.libretube.util.CronetHelper import com.github.libretube.util.DescriptionAdapter import com.github.libretube.util.RetrofitInstance @@ -87,7 +88,6 @@ import com.google.android.exoplayer2.util.RepeatModeUtil import com.google.android.exoplayer2.video.VideoSize import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -739,17 +739,19 @@ class PlayerFragment : Fragment() { } private fun initializePlayerView(view: View, response: Streams) { - binding.playerViewsInfo.text = - context?.getString(R.string.views, response.views.formatShort()) + - " • " + response.uploadDate - binding.textLike.text = response.likes.formatShort() - binding.textDislike.text = response.dislikes.formatShort() - Picasso.get().load(response.uploaderAvatar).into(binding.playerChannelImage) - binding.playerChannelName.text = response.uploader + binding.apply { + playerViewsInfo.text = + context?.getString(R.string.views, response.views.formatShort()) + + " • " + response.uploadDate + textLike.text = response.likes.formatShort() + textDislike.text = response.dislikes.formatShort() + ConnectionHelper.loadImage(response.uploaderAvatar, binding.playerChannelImage) + playerChannelName.text = response.uploader - binding.titleTextView.text = response.title - binding.playerTitle.text = response.title - binding.playerDescription.text = response.description + titleTextView.text = response.title + playerTitle.text = response.title + playerDescription.text = response.description + } playerBinding.exoTitle.text = response.title diff --git a/app/src/main/java/com/github/libretube/preferences/AboutFragment.kt b/app/src/main/java/com/github/libretube/preferences/AboutFragment.kt index e998267f3..a9d36db59 100644 --- a/app/src/main/java/com/github/libretube/preferences/AboutFragment.kt +++ b/app/src/main/java/com/github/libretube/preferences/AboutFragment.kt @@ -81,6 +81,13 @@ class AboutFragment : Fragment() { showSnackBar(text) true } + + binding.community.setOnClickListener { + val communityFragment = CommunityFragment() + parentFragmentManager.beginTransaction() + .replace(R.id.settings, communityFragment) + .commitNow() + } } private fun openLinkFromHref(link: String) { diff --git a/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt b/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt index 750fe5f9a..a18b63482 100644 --- a/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/AdvancedSettings.kt @@ -3,6 +3,7 @@ package com.github.libretube.preferences import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat import com.github.libretube.R import com.github.libretube.activities.SettingsActivity import com.github.libretube.dialogs.RequireRestartDialog @@ -17,18 +18,10 @@ class AdvancedSettings : PreferenceFragmentCompat() { val settingsActivity = activity as SettingsActivity settingsActivity.changeTopBarText(getString(R.string.advanced)) - // clear search history - val clearHistory = findPreference("clear_history") - clearHistory?.setOnPreferenceClickListener { - PreferenceHelper.removePreference(requireContext(), "search_history") - true - } - - // clear watch history and positions - val clearWatchHistory = findPreference("clear_watch_history") - clearWatchHistory?.setOnPreferenceClickListener { - PreferenceHelper.removePreference(requireContext(), "watch_history") - PreferenceHelper.removePreference(requireContext(), "watch_positions") + val dataSaverMode = findPreference("data_saver_mode") + dataSaverMode?.setOnPreferenceChangeListener { _, _ -> + val restartDialog = RequireRestartDialog() + restartDialog.show(childFragmentManager, "RequireRestartDialog") true } diff --git a/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt b/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt new file mode 100644 index 000000000..26d7f4a5a --- /dev/null +++ b/app/src/main/java/com/github/libretube/preferences/HistorySettings.kt @@ -0,0 +1,38 @@ +package com.github.libretube.preferences + +import android.os.Bundle +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import com.github.libretube.R +import com.github.libretube.activities.SettingsActivity + +class HistorySettings : PreferenceFragmentCompat() { + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.history_settings, rootKey) + + val settingsActivity = activity as SettingsActivity + settingsActivity.changeTopBarText(getString(R.string.history)) + + // clear search history + val clearHistory = findPreference("clear_history") + clearHistory?.setOnPreferenceClickListener { + PreferenceHelper.removePreference(requireContext(), "search_history") + true + } + + // clear watch history and positions + val clearWatchHistory = findPreference("clear_watch_history") + clearWatchHistory?.setOnPreferenceClickListener { + PreferenceHelper.removePreference(requireContext(), "watch_history") + true + } + + // clear watch positions + val clearWatchPositions = findPreference("clear_watch_positions") + clearWatchPositions?.setOnPreferenceClickListener { + PreferenceHelper.removePreference(requireContext(), "watch_positions") + true + } + } +} diff --git a/app/src/main/java/com/github/libretube/preferences/MainSettings.kt b/app/src/main/java/com/github/libretube/preferences/MainSettings.kt index f131e0ecd..74d084dad 100644 --- a/app/src/main/java/com/github/libretube/preferences/MainSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/MainSettings.kt @@ -64,6 +64,13 @@ class MainSettings : PreferenceFragmentCompat() { true } + val history = findPreference("history") + history?.setOnPreferenceClickListener { + val newFragment = HistorySettings() + navigateToSettingsFragment(newFragment) + true + } + val advanced = findPreference("advanced") advanced?.setOnPreferenceClickListener { val newFragment = AdvancedSettings() @@ -84,13 +91,6 @@ class MainSettings : PreferenceFragmentCompat() { navigateToSettingsFragment(newFragment) true } - - val community = findPreference("community") - community?.setOnPreferenceClickListener { - val newFragment = CommunityFragment() - navigateToSettingsFragment(newFragment) - true - } } private fun navigateToSettingsFragment(newFragment: Fragment) { diff --git a/app/src/main/java/com/github/libretube/util/ConnectionHelper.kt b/app/src/main/java/com/github/libretube/util/ConnectionHelper.kt index 1ba230baa..e248e3d92 100644 --- a/app/src/main/java/com/github/libretube/util/ConnectionHelper.kt +++ b/app/src/main/java/com/github/libretube/util/ConnectionHelper.kt @@ -2,6 +2,9 @@ package com.github.libretube.util import android.content.Context import android.net.ConnectivityManager +import android.widget.ImageView +import com.github.libretube.Globals +import com.squareup.picasso.Picasso object ConnectionHelper { fun isNetworkAvailable(context: Context): Boolean { @@ -33,4 +36,12 @@ object ConnectionHelper { return connectivityManager.activeNetworkInfo?.isConnected ?: false } + + // load an image from a url into an imageView + fun loadImage(url: String?, target: ImageView) { + // only load the image if the data saver mode is disabled + if (!Globals.dataSaverModeEnabled) { + Picasso.get().load(url).fit().centerCrop().into(target) + } + } } diff --git a/app/src/main/res/drawable/ic_data_saver.xml b/app/src/main/res/drawable/ic_data_saver.xml new file mode 100644 index 000000000..3b3a3bfd1 --- /dev/null +++ b/app/src/main/res/drawable/ic_data_saver.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index d09cf88f7..e8203e725 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -117,6 +117,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/trending_row.xml b/app/src/main/res/layout/trending_row.xml index c62ad6cb9..1a05a5db5 100644 --- a/app/src/main/res/layout/trending_row.xml +++ b/app/src/main/res/layout/trending_row.xml @@ -23,8 +23,7 @@ + android:layout_height="match_parent" /> Advanced Player Adjust the app to your liking. - Downloads, history + Downloads, reset Live This comment has no replies. Authors @@ -209,7 +209,7 @@ Restore Watch History Remember position - Remember the watch position and automatically seek to it. + Restore last watch position Authentication instance Use a different instance for authenticated calls. Choose an auth instance @@ -242,4 +242,11 @@ Pure theme Pure white/black theme No external player found. Please make sure you have one installed. + Data saver mode + Don\'t load thumbnails and other images to save data. + Store the search queries locally + Keep track of watched videos locally + Watch and search history + Watch positions + Reset watch positions \ No newline at end of file diff --git a/app/src/main/res/xml/advanced_settings.xml b/app/src/main/res/xml/advanced_settings.xml index 41298efff..04ea4e3db 100644 --- a/app/src/main/res/xml/advanced_settings.xml +++ b/app/src/main/res/xml/advanced_settings.xml @@ -31,44 +31,13 @@ - + - - - - - - - - - - - - - - - - + android:icon="@drawable/ic_data_saver" + android:summary="@string/data_saver_mode_summary" + app:key="data_saver_mode" + app:title="@string/data_saver_mode" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 9accbd36b..e3d3a7e0b 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -50,6 +50,12 @@ app:summary="@string/player_summary" app:title="@string/audio_video" /> + + - -