Loading app/src/main/java/org/lineageos/twelve/fragments/MainFragment.kt +18 −0 Original line number Diff line number Diff line Loading @@ -31,9 +31,11 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.button.MaterialButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.navigation.NavigationBarView import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.search.SearchView import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.lineageos.twelve.R Loading @@ -52,6 +54,7 @@ import org.lineageos.twelve.models.Genre import org.lineageos.twelve.models.MediaItem import org.lineageos.twelve.models.Playlist import org.lineageos.twelve.models.Result import org.lineageos.twelve.models.Result.Companion.onError import org.lineageos.twelve.models.areContentsTheSame import org.lineageos.twelve.models.areItemsTheSame import org.lineageos.twelve.ui.recyclerview.SimpleListAdapter Loading @@ -69,6 +72,9 @@ class MainFragment : Fragment(R.layout.fragment_main) { // Views private val navigationBarView by getViewProperty<NavigationBarView>(R.id.navigationBarView) private val nowPlayingBar by getViewProperty<NowPlayingBar>(R.id.nowPlayingBar) private val playRandomSongsExtendedFloatingActionButton by getViewProperty<ExtendedFloatingActionButton>( R.id.playRandomSongsExtendedFloatingActionButton ) private val providerMaterialButton by getViewProperty<MaterialButton>(R.id.providerMaterialButton) private val searchLinearProgressIndicator by getViewProperty<LinearProgressIndicator>(R.id.searchLinearProgressIndicator) private val searchNoElementsLinearLayout by getViewProperty<LinearLayout>(R.id.searchNoElementsLinearLayout) Loading Loading @@ -315,6 +321,18 @@ class MainFragment : Fragment(R.layout.fragment_main) { startActivity(intent) } playRandomSongsExtendedFloatingActionButton.setOnClickListener { viewLifecycleOwner.lifecycleScope.launch { viewModel.playAllAudios().onError { Snackbar.make( navigationBarView, it.toString(), Snackbar.LENGTH_SHORT, ).show() } } } // View pager viewPager2.isUserInputEnabled = false viewPager2.adapter = object : FragmentStateAdapter(this) { Loading app/src/main/java/org/lineageos/twelve/viewmodels/MainViewModel.kt +7 −0 Original line number Diff line number Diff line Loading @@ -12,14 +12,17 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn import org.lineageos.twelve.models.Error import org.lineageos.twelve.models.FlowResult import org.lineageos.twelve.models.FlowResult.Companion.asFlowResult import org.lineageos.twelve.models.Result import org.lineageos.twelve.models.Result.Companion.map /** * Home page view model. Loading Loading @@ -59,4 +62,8 @@ class MainViewModel(application: Application) : NowPlayingViewModel(application) fun setSearchQuery(query: String, immediate: Boolean = false) { searchQuery.value = query to immediate } suspend fun playAllAudios() = mediaRepository.audios().firstOrNull()?.map { audios -> playAudio(audios.shuffled(), 0) } ?: Result.Error(Error.INVALID_RESPONSE) } app/src/main/res/layout-land/fragment_main.xml +17 −1 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- SPDX-FileCopyrightText: 2024 The LineageOS Project SPDX-FileCopyrightText: 2024-2025 The LineageOS Project SPDX-License-Identifier: Apache-2.0 --> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" Loading Loading @@ -67,6 +67,22 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton android:id="@+id/playRandomSongsExtendedFloatingActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="24dp" android:layout_marginBottom="12dp" android:contentDescription="@string/play_random_songs" android:text="@string/play_random_songs" android:tooltipText="@string/play_random_songs" app:backgroundTint="?attr/colorTertiaryContainer" app:collapsedSize="46dp" app:icon="@drawable/ic_shuffle_play" app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" app:layout_constraintBottom_toTopOf="@+id/nowPlayingBar" app:layout_constraintEnd_toEndOf="parent" /> <com.google.android.material.navigationrail.NavigationRailView android:id="@+id/navigationBarView" android:layout_width="wrap_content" Loading app/src/main/res/layout/fragment_main.xml +17 −1 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- SPDX-FileCopyrightText: 2024 The LineageOS Project SPDX-FileCopyrightText: 2024-2025 The LineageOS Project SPDX-License-Identifier: Apache-2.0 --> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" Loading Loading @@ -66,6 +66,22 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton android:id="@+id/playRandomSongsExtendedFloatingActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="24dp" android:layout_marginBottom="12dp" android:contentDescription="@string/play_random_songs" android:text="@string/play_random_songs" android:tooltipText="@string/play_random_songs" app:backgroundTint="?attr/colorTertiaryContainer" app:collapsedSize="46dp" app:icon="@drawable/ic_shuffle_play" app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" app:layout_constraintBottom_toTopOf="@+id/nowPlayingBar" app:layout_constraintEnd_toEndOf="parent" /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/navigationBarView" android:layout_width="0dp" Loading app/src/main/res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ <string name="main_fragment_section_search">Search</string> <string name="main_fragment_section_library">Library</string> <!-- Main fragment - Play random songs button --> <string name="play_random_songs">Play random songs</string> <!-- Search fragment --> <string name="search_hint">Search…</string> Loading Loading
app/src/main/java/org/lineageos/twelve/fragments/MainFragment.kt +18 −0 Original line number Diff line number Diff line Loading @@ -31,9 +31,11 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.button.MaterialButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.navigation.NavigationBarView import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.search.SearchView import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.lineageos.twelve.R Loading @@ -52,6 +54,7 @@ import org.lineageos.twelve.models.Genre import org.lineageos.twelve.models.MediaItem import org.lineageos.twelve.models.Playlist import org.lineageos.twelve.models.Result import org.lineageos.twelve.models.Result.Companion.onError import org.lineageos.twelve.models.areContentsTheSame import org.lineageos.twelve.models.areItemsTheSame import org.lineageos.twelve.ui.recyclerview.SimpleListAdapter Loading @@ -69,6 +72,9 @@ class MainFragment : Fragment(R.layout.fragment_main) { // Views private val navigationBarView by getViewProperty<NavigationBarView>(R.id.navigationBarView) private val nowPlayingBar by getViewProperty<NowPlayingBar>(R.id.nowPlayingBar) private val playRandomSongsExtendedFloatingActionButton by getViewProperty<ExtendedFloatingActionButton>( R.id.playRandomSongsExtendedFloatingActionButton ) private val providerMaterialButton by getViewProperty<MaterialButton>(R.id.providerMaterialButton) private val searchLinearProgressIndicator by getViewProperty<LinearProgressIndicator>(R.id.searchLinearProgressIndicator) private val searchNoElementsLinearLayout by getViewProperty<LinearLayout>(R.id.searchNoElementsLinearLayout) Loading Loading @@ -315,6 +321,18 @@ class MainFragment : Fragment(R.layout.fragment_main) { startActivity(intent) } playRandomSongsExtendedFloatingActionButton.setOnClickListener { viewLifecycleOwner.lifecycleScope.launch { viewModel.playAllAudios().onError { Snackbar.make( navigationBarView, it.toString(), Snackbar.LENGTH_SHORT, ).show() } } } // View pager viewPager2.isUserInputEnabled = false viewPager2.adapter = object : FragmentStateAdapter(this) { Loading
app/src/main/java/org/lineageos/twelve/viewmodels/MainViewModel.kt +7 −0 Original line number Diff line number Diff line Loading @@ -12,14 +12,17 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn import org.lineageos.twelve.models.Error import org.lineageos.twelve.models.FlowResult import org.lineageos.twelve.models.FlowResult.Companion.asFlowResult import org.lineageos.twelve.models.Result import org.lineageos.twelve.models.Result.Companion.map /** * Home page view model. Loading Loading @@ -59,4 +62,8 @@ class MainViewModel(application: Application) : NowPlayingViewModel(application) fun setSearchQuery(query: String, immediate: Boolean = false) { searchQuery.value = query to immediate } suspend fun playAllAudios() = mediaRepository.audios().firstOrNull()?.map { audios -> playAudio(audios.shuffled(), 0) } ?: Result.Error(Error.INVALID_RESPONSE) }
app/src/main/res/layout-land/fragment_main.xml +17 −1 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- SPDX-FileCopyrightText: 2024 The LineageOS Project SPDX-FileCopyrightText: 2024-2025 The LineageOS Project SPDX-License-Identifier: Apache-2.0 --> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" Loading Loading @@ -67,6 +67,22 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton android:id="@+id/playRandomSongsExtendedFloatingActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="24dp" android:layout_marginBottom="12dp" android:contentDescription="@string/play_random_songs" android:text="@string/play_random_songs" android:tooltipText="@string/play_random_songs" app:backgroundTint="?attr/colorTertiaryContainer" app:collapsedSize="46dp" app:icon="@drawable/ic_shuffle_play" app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" app:layout_constraintBottom_toTopOf="@+id/nowPlayingBar" app:layout_constraintEnd_toEndOf="parent" /> <com.google.android.material.navigationrail.NavigationRailView android:id="@+id/navigationBarView" android:layout_width="wrap_content" Loading
app/src/main/res/layout/fragment_main.xml +17 −1 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- SPDX-FileCopyrightText: 2024 The LineageOS Project SPDX-FileCopyrightText: 2024-2025 The LineageOS Project SPDX-License-Identifier: Apache-2.0 --> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" Loading Loading @@ -66,6 +66,22 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton android:id="@+id/playRandomSongsExtendedFloatingActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="24dp" android:layout_marginBottom="12dp" android:contentDescription="@string/play_random_songs" android:text="@string/play_random_songs" android:tooltipText="@string/play_random_songs" app:backgroundTint="?attr/colorTertiaryContainer" app:collapsedSize="46dp" app:icon="@drawable/ic_shuffle_play" app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior" app:layout_constraintBottom_toTopOf="@+id/nowPlayingBar" app:layout_constraintEnd_toEndOf="parent" /> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/navigationBarView" android:layout_width="0dp" Loading
app/src/main/res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,9 @@ <string name="main_fragment_section_search">Search</string> <string name="main_fragment_section_library">Library</string> <!-- Main fragment - Play random songs button --> <string name="play_random_songs">Play random songs</string> <!-- Search fragment --> <string name="search_hint">Search…</string> Loading