diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index 04c797170..98e20a02f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -3,14 +3,16 @@ package org.schabi.newpipe.local.subscription import android.app.Activity import android.app.AlertDialog import android.content.* +import android.content.res.Configuration import android.os.Bundle import android.os.Environment import android.os.Parcelable +import android.preference.PreferenceManager import android.view.* import android.widget.Toast import androidx.lifecycle.ViewModelProviders import androidx.localbroadcastmanager.content.LocalBroadcastManager -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.GridLayoutManager import com.nononsenseapps.filepicker.Utils import com.xwray.groupie.Group import com.xwray.groupie.GroupAdapter @@ -40,6 +42,8 @@ import org.schabi.newpipe.util.AnimationUtils.animateView import java.io.File import java.text.SimpleDateFormat import java.util.* +import kotlin.math.floor +import kotlin.math.max class SubscriptionFragment : BaseStateFragment() { private lateinit var viewModel: SubscriptionViewModel @@ -238,7 +242,11 @@ class SubscriptionFragment : BaseStateFragment() { override fun initViews(rootView: View, savedInstanceState: Bundle?) { super.initViews(rootView, savedInstanceState) - items_list.layoutManager = LinearLayoutManager(requireContext()) + val shouldUseGridLayout = shouldUseGridLayout() + groupAdapter.spanCount = if (shouldUseGridLayout) getGridSpanCount() else 1 + items_list.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply { + spanSizeLookup = groupAdapter.spanSizeLookup + } items_list.adapter = groupAdapter viewModel = ViewModelProviders.of(this).get(SubscriptionViewModel::class.java) @@ -305,11 +313,16 @@ class SubscriptionFragment : BaseStateFragment() { override fun handleResult(result: SubscriptionState) { super.handleResult(result) + val shouldUseGridLayout = shouldUseGridLayout() when (result) { is SubscriptionState.LoadedState -> { result.subscriptions.forEach { if (it is ChannelItem) { it.gesturesListener = listenerChannelItem + it.itemVersion = when { + shouldUseGridLayout -> ChannelItem.ItemVersion.GRID + else -> ChannelItem.ItemVersion.MINI + } } } @@ -377,7 +390,29 @@ class SubscriptionFragment : BaseStateFragment() { /////////////////////////////////////////////////////////////////////////// // Grid Mode /////////////////////////////////////////////////////////////////////////// - // TODO: Re-implement grid mode selection + + // TODO: Move these out of this class, as it can be reused + + private fun shouldUseGridLayout(): Boolean { + val listMode = PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getString(getString(R.string.list_view_mode_key), getString(R.string.list_view_mode_value)) + + return when (listMode) { + getString(R.string.list_view_mode_auto_key) -> { + val configuration = resources.configuration + + (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + && configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE)) + } + getString(R.string.list_view_mode_grid_key) -> true + else -> false + } + } + + private fun getGridSpanCount(): Int { + val minWidth = resources.getDimensionPixelSize(R.dimen.channel_item_grid_min_width) + return max(1, floor(resources.displayMetrics.widthPixels / minWidth.toDouble()).toInt()) + } companion object { private const val REQUEST_EXPORT_CODE = 666 diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt index ba12fbdab..928f93a47 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt @@ -15,7 +15,7 @@ import org.schabi.newpipe.util.OnClickGesture class ChannelItem( private val infoItem: ChannelInfoItem, private val subscriptionId: Long = -1L, - private var itemVersion: ItemVersion = ItemVersion.NORMAL, + var itemVersion: ItemVersion = ItemVersion.NORMAL, var gesturesListener: OnClickGesture? = null ) : Item() { diff --git a/app/src/main/res/layout/list_channel_grid_item.xml b/app/src/main/res/layout/list_channel_grid_item.xml index 3fe642974..423bfeb9e 100644 --- a/app/src/main/res/layout/list_channel_grid_item.xml +++ b/app/src/main/res/layout/list_channel_grid_item.xml @@ -1,48 +1,48 @@ - + - + - + - + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ae1791870..538179b73 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -14,6 +14,9 @@ 70dp 164dp 92dp + + 42dp + 128dp 96dp @@ -24,6 +27,7 @@ 2dp 4dp 8dp + 12dp 180dp 150dp diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 2afc0f3df..631817ee9 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1106,12 +1106,17 @@ list_view_mode - auto + @string/list_view_mode_auto_key + + + auto + list + grid - auto - list - grid + @string/list_view_mode_auto_key + @string/list_view_mode_list_key + @string/list_view_mode_grid_key @string/auto