From 725d9281bfcfe43898535f3a19e252a4f4c1c970 Mon Sep 17 00:00:00 2001
From: birdbird <6892457-tzugen@users.noreply.gitlab.com>
Date: Wed, 14 Jun 2023 12:07:13 +0000
Subject: [PATCH] Move search button in to main Topbar menu
---
gradle/libs.versions.toml | 2 +-
.../provider/SearchSuggestionProvider.java | 37 -----
.../ultrasonic/activity/NavigationActivity.kt | 131 +++++++++++++-----
.../ultrasonic/fragment/SearchFragment.kt | 87 +-----------
.../fragment/TrackCollectionFragment.kt | 15 +-
.../ultrasonic/playback/PlaybackService.kt | 1 +
.../provider/SearchSuggestionProvider.kt | 24 ++++
.../provider/UltrasonicAppWidgetProvider.kt | 4 +-
.../org/moire/ultrasonic/util/Constants.kt | 1 -
ultrasonic/src/main/res/menu/search.xml | 9 --
.../src/main/res/menu/search_view_menu.xml | 12 ++
...ct_album.xml => track_collection_menu.xml} | 0
ultrasonic/src/main/res/values-cs/strings.xml | 1 -
ultrasonic/src/main/res/values-de/strings.xml | 1 -
ultrasonic/src/main/res/values-es/strings.xml | 1 -
ultrasonic/src/main/res/values-fr/strings.xml | 1 -
ultrasonic/src/main/res/values-hu/strings.xml | 1 -
ultrasonic/src/main/res/values-it/strings.xml | 1 -
ultrasonic/src/main/res/values-ja/strings.xml | 1 -
.../src/main/res/values-nb-rNO/strings.xml | 1 -
ultrasonic/src/main/res/values-nl/strings.xml | 1 -
ultrasonic/src/main/res/values-pl/strings.xml | 1 -
.../src/main/res/values-pt-rBR/strings.xml | 1 -
ultrasonic/src/main/res/values-pt/strings.xml | 1 -
ultrasonic/src/main/res/values-ru/strings.xml | 1 -
.../src/main/res/values-zh-rCN/strings.xml | 1 -
.../src/main/res/values-zh-rTW/strings.xml | 1 -
ultrasonic/src/main/res/values/strings.xml | 1 -
28 files changed, 144 insertions(+), 195 deletions(-)
delete mode 100644 ultrasonic/src/main/java/org/moire/ultrasonic/provider/SearchSuggestionProvider.java
create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/SearchSuggestionProvider.kt
delete mode 100644 ultrasonic/src/main/res/menu/search.xml
create mode 100644 ultrasonic/src/main/res/menu/search_view_menu.xml
rename ultrasonic/src/main/res/menu/{select_album.xml => track_collection_menu.xml} (100%)
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 390d79a3..a18ca95a 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -2,7 +2,7 @@
# You need to run ./gradlew wrapper after updating the version
gradle = "8.1.1"
-navigation = "2.5.3"
+navigation = "2.6.0"
gradlePlugin = "8.0.2"
androidxcore = "1.10.1"
ktlint = "0.43.2"
diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/provider/SearchSuggestionProvider.java b/ultrasonic/src/main/java/org/moire/ultrasonic/provider/SearchSuggestionProvider.java
deleted file mode 100644
index 4cca8444..00000000
--- a/ultrasonic/src/main/java/org/moire/ultrasonic/provider/SearchSuggestionProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- This file is part of Subsonic.
-
- Subsonic is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Subsonic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Subsonic. If not, see .
-
- Copyright 2010 (C) Sindre Mehus
- */
-package org.moire.ultrasonic.provider;
-
-import android.content.SearchRecentSuggestionsProvider;
-
-/**
- * Provides search suggestions based on recent searches.
- *
- * @author Sindre Mehus
- */
-public class SearchSuggestionProvider extends SearchRecentSuggestionsProvider
-{
- public static final String AUTHORITY = SearchSuggestionProvider.class.getName();
- public static final int MODE = DATABASE_MODE_QUERIES;
-
- public SearchSuggestionProvider()
- {
- setupSuggestions(AUTHORITY, MODE);
- }
-}
\ No newline at end of file
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
index 24d0d95a..76df1ea5 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
@@ -18,16 +18,20 @@ import android.os.Bundle
import android.provider.MediaStore
import android.provider.SearchRecentSuggestions
import android.view.Menu
+import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
+import androidx.core.view.MenuProvider
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.FragmentContainerView
+import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.media3.common.MediaItem
import androidx.media3.common.Player.STATE_BUFFERING
@@ -94,6 +98,10 @@ class NavigationActivity : AppCompatActivity() {
private var selectServerButton: MaterialButton? = null
private var headerBackgroundImage: ImageView? = null
+ // We store the last search string in this variable.
+ // Seems a bit like a hack, is there a better way?
+ var searchQuery: String? = null
+
private lateinit var appBarConfiguration: AppBarConfiguration
private var rxBusSubscription: CompositeDisposable = CompositeDisposable()
@@ -221,10 +229,57 @@ class NavigationActivity : AppCompatActivity() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 && !UApp.instance!!.isFirstRun) {
ShortcutUtil.registerShortcuts(this)
}
+
+ // Register our options menu
+ addMenuProvider(
+ searchMenuProvider,
+ this,
+ Lifecycle.State.RESUMED
+ )
+ }
+
+ private val searchMenuProvider: MenuProvider = object : MenuProvider {
+ override fun onPrepareMenu(menu: Menu) {
+ setupSearchField(menu)
+ }
+
+ override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
+ inflater.inflate(R.menu.search_view_menu, menu)
+ }
+
+ override fun onMenuItemSelected(item: MenuItem): Boolean {
+ return false
+ }
+ }
+
+ fun setupSearchField(menu: Menu) {
+ Timber.i("Recreating search field")
+ val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
+ val searchItem = menu.findItem(R.id.action_search)
+ val searchView = searchItem.actionView as SearchView
+ val searchableInfo = searchManager.getSearchableInfo(this.componentName)
+ searchView.setSearchableInfo(searchableInfo)
+ searchView.setIconifiedByDefault(false)
+
+ if (searchQuery != null) {
+ Timber.e("Found existing search query")
+ searchItem.expandActionView()
+ searchView.isIconified = false
+ searchView.setQuery(searchQuery, false)
+ searchView.clearFocus()
+ // Restore search text only once!
+ searchQuery = null
+ }
}
private fun setupDrawerLayout(drawerLayout: DrawerLayout) {
+ // Set initial state passed on drawer state
+ closeNavigationDrawerOnBack.isEnabled = drawerLayout.isOpen
+
+ // Add the back press listener
onBackPressedDispatcher.addCallback(this, closeNavigationDrawerOnBack)
+
+ // Listen to changes in the drawer state and enable the back press listener accordingly.
drawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener {
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
// Nothing
@@ -392,47 +447,55 @@ class NavigationActivity : AppCompatActivity() {
return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration)
}
- // TODO: Test if this works with external Intents
- // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
- if (intent == null) return
- if (intent.action == Constants.INTENT_PLAY_RANDOM_SONGS) {
- val currentFragment = host?.childFragmentManager?.fragments?.last() ?: return
- val service = MusicServiceFactory.getMusicService()
- val musicDirectory = service.getRandomSongs(Settings.maxSongs)
- val downloadHandler: DownloadHandler by inject()
- downloadHandler.addTracksToMediaController(
- songs = musicDirectory.getTracks(),
- append = false,
- playNext = false,
- autoPlay = true,
- shuffle = false,
- fragment = currentFragment,
- playlistName = null
- )
- return
+ when (intent?.action) {
+ Constants.INTENT_PLAY_RANDOM_SONGS -> {
+ playRandomSongs()
+ }
+ Intent.ACTION_MAIN -> {
+ if (intent.getBooleanExtra(Constants.INTENT_SHOW_PLAYER, false)) {
+ findNavController(R.id.nav_host_fragment).navigate(R.id.playerFragment)
+ }
+ }
+ Intent.ACTION_SEARCH -> {
+ searchQuery = intent.getStringExtra(SearchManager.QUERY)
+ handleSearchIntent(searchQuery, false)
+ }
+ MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH -> {
+ searchQuery = intent.getStringExtra(SearchManager.QUERY)
+ handleSearchIntent(searchQuery, true)
+ }
}
+ }
- if (intent.getBooleanExtra(Constants.INTENT_SHOW_PLAYER, false)) {
- findNavController(R.id.nav_host_fragment).navigate(R.id.playerFragment)
- return
- }
+ private fun handleSearchIntent(query: String?, autoPlay: Boolean) {
+ val suggestions = SearchRecentSuggestions(
+ this,
+ SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE
+ )
+ suggestions.saveRecentQuery(query, null)
- val query = intent.getStringExtra(SearchManager.QUERY)
+ val action = NavigationGraphDirections.toSearchFragment(query, autoPlay)
+ findNavController(R.id.nav_host_fragment).navigate(action)
+ }
- if (query != null) {
- val autoPlay = intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- val suggestions = SearchRecentSuggestions(
- this,
- SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE
- )
- suggestions.saveRecentQuery(query, null)
-
- val action = NavigationGraphDirections.toSearchFragment(query, autoPlay)
- findNavController(R.id.nav_host_fragment).navigate(action)
- }
+ private fun playRandomSongs() {
+ val currentFragment = host?.childFragmentManager?.fragments?.last() ?: return
+ val service = MusicServiceFactory.getMusicService()
+ val musicDirectory = service.getRandomSongs(Settings.maxSongs)
+ val downloadHandler: DownloadHandler by inject()
+ downloadHandler.addTracksToMediaController(
+ songs = musicDirectory.getTracks(),
+ append = false,
+ playNext = false,
+ autoPlay = true,
+ shuffle = false,
+ fragment = currentFragment,
+ playlistName = null
+ )
+ return
}
/**
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt
index bd70f431..cd4d1104 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SearchFragment.kt
@@ -7,19 +7,11 @@
package org.moire.ultrasonic.fragment
-import android.app.SearchManager
-import android.content.Context
import android.os.Bundle
-import android.view.Menu
-import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
-import androidx.appcompat.widget.SearchView
-import androidx.core.view.MenuHost
-import androidx.core.view.MenuProvider
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
-import androidx.lifecycle.Lifecycle
import androidx.lifecycle.viewModelScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
@@ -54,16 +46,14 @@ import org.moire.ultrasonic.util.CommunicationError
import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Util
import org.moire.ultrasonic.util.Util.toast
-import timber.log.Timber
/**
* Initiates a search on the media library and displays the results
- * TODO: Switch to material3 class
+
*/
class SearchFragment : MultiListFragment(), KoinComponent {
private var searchResult: SearchResult? = null
private var searchRefresh: SwipeRefreshLayout? = null
- private var searchView: SearchView? = null
private val mediaPlayerManager: MediaPlayerManager by inject()
@@ -83,13 +73,6 @@ class SearchFragment : MultiListFragment(), KoinComponent {
cancellationToken = CancellationToken()
setTitle(this, R.string.search_title)
- // Register our options menu
- (requireActivity() as MenuHost).addMenuProvider(
- menuProvider,
- viewLifecycleOwner,
- Lifecycle.State.RESUMED
- )
-
listModel.searchResult.observe(
viewLifecycleOwner
) {
@@ -148,73 +131,6 @@ class SearchFragment : MultiListFragment(), KoinComponent {
}
}
- /**
- * This provide creates the search bar above the recycler view
- */
- private val menuProvider: MenuProvider = object : MenuProvider {
- override fun onPrepareMenu(menu: Menu) {
- setupOptionsMenu(menu)
- }
-
- override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
- menuInflater.inflate(R.menu.search, menu)
- }
-
- override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
- return true
- }
- }
- fun setupOptionsMenu(menu: Menu) {
- val activity = activity ?: return
- val searchManager = activity.getSystemService(Context.SEARCH_SERVICE) as SearchManager
- val searchItem = menu.findItem(R.id.search_item)
- searchView = searchItem.actionView as SearchView
- val searchableInfo = searchManager.getSearchableInfo(requireActivity().componentName)
- searchView!!.setSearchableInfo(searchableInfo)
-
- val autoPlay = navArgs.autoplay
- val query = navArgs.query
-
- // If started with a query, enter it to the searchView
- if (query != null) {
- searchView!!.setQuery(query, false)
- searchView!!.clearFocus()
- }
-
- searchView!!.setOnSuggestionListener(object : SearchView.OnSuggestionListener {
- override fun onSuggestionSelect(position: Int): Boolean {
- return true
- }
-
- override fun onSuggestionClick(position: Int): Boolean {
- Timber.d("onSuggestionClick: %d", position)
- val cursor = searchView!!.suggestionsAdapter.cursor
- cursor.moveToPosition(position)
-
- // 2 is the index of col containing suggestion name.
- val suggestion = cursor.getString(2)
- searchView!!.setQuery(suggestion, true)
- return true
- }
- })
-
- searchView!!.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
- override fun onQueryTextSubmit(query: String): Boolean {
- Timber.d("onQueryTextSubmit: %s", query)
- searchView!!.clearFocus()
- search(query, autoPlay)
- return true
- }
-
- override fun onQueryTextChange(newText: String): Boolean {
- return true
- }
- })
-
- searchView!!.setIconifiedByDefault(false)
- searchItem.expandActionView()
- }
-
override fun onDestroyView() {
Util.hideKeyboard(activity)
cancellationToken?.cancel()
@@ -313,7 +229,6 @@ class SearchFragment : MultiListFragment(), KoinComponent {
}
private fun onAlbumSelected(album: Album, autoplay: Boolean) {
-
val action = SearchFragmentDirections.searchToTrackCollection(
id = album.id,
name = album.title,
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
index 5491bca0..ecb7df54 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt
@@ -36,7 +36,6 @@ import org.moire.ultrasonic.adapters.AlbumHeader
import org.moire.ultrasonic.adapters.AlbumRowDelegate
import org.moire.ultrasonic.adapters.HeaderViewBinder
import org.moire.ultrasonic.adapters.TrackViewBinder
-import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline
import org.moire.ultrasonic.domain.Identifiable
import org.moire.ultrasonic.domain.MusicDirectory
@@ -64,7 +63,6 @@ import timber.log.Timber
* In most cases the data should be just a list of Entries, but there are some cases
* where the list can contain Albums as well. This happens especially when having ID3 tags disabled,
* or using Offline mode, both in which Indexes instead of Artists are being used.
- *
*/
@Suppress("TooManyFunctions")
open class TrackCollectionFragment(
@@ -268,6 +266,9 @@ open class TrackCollectionFragment(
private val menuProvider: MenuProvider = object : MenuProvider {
override fun onPrepareMenu(menu: Menu) {
+ // Hide search button (from xml)
+ menu.findItem(R.id.action_search).isVisible = false
+
playAllButton = menu.findItem(R.id.select_album_play_all)
if (playAllButton != null) {
@@ -282,7 +283,7 @@ open class TrackCollectionFragment(
}
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
- inflater.inflate(R.menu.select_album, menu)
+ inflater.inflate(R.menu.track_collection_menu, menu)
}
override fun onMenuItemSelected(item: MenuItem): Boolean {
@@ -584,12 +585,8 @@ open class TrackCollectionFragment(
} else {
setTitle(name)
- if (ActiveServerProvider.shouldUseId3Tags()) {
- if (isAlbum) {
- listModel.getAlbum(refresh2, id, name)
- } else {
- throw IllegalAccessException("Use AlbumFragment instead!")
- }
+ if (isAlbum) {
+ listModel.getAlbum(refresh2, id, name)
} else {
listModel.getMusicDirectory(refresh2, id, name)
}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt
index 6dd656a3..7965558e 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt
@@ -340,6 +340,7 @@ class PlaybackService :
// needed starting Android 12 (S = 31)
flags = flags or FLAG_IMMUTABLE
}
+ intent.action = Intent.ACTION_MAIN
intent.putExtra(Constants.INTENT_SHOW_PLAYER, true)
return PendingIntent.getActivity(this, 0, intent, flags)
}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/SearchSuggestionProvider.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/SearchSuggestionProvider.kt
new file mode 100644
index 00000000..06803c17
--- /dev/null
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/SearchSuggestionProvider.kt
@@ -0,0 +1,24 @@
+/*
+ * SearchSuggestionProvider.kt
+ * Copyright (C) 2009-2023 Ultrasonic developers
+ *
+ * Distributed under terms of the GNU GPLv3 license.
+ */
+package org.moire.ultrasonic.provider
+
+import android.content.SearchRecentSuggestionsProvider
+import org.moire.ultrasonic.BuildConfig
+
+/**
+ * Provides search suggestions based on recent searches.
+ */
+class SearchSuggestionProvider : SearchRecentSuggestionsProvider() {
+ init {
+ setupSuggestions(AUTHORITY, MODE)
+ }
+
+ companion object {
+ val AUTHORITY = "${BuildConfig.APPLICATION_ID}.provider.SearchSuggestionProvider"
+ const val MODE = DATABASE_MODE_QUERIES
+ }
+}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/UltrasonicAppWidgetProvider.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/UltrasonicAppWidgetProvider.kt
index 5902d772..3a422a2b 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/UltrasonicAppWidgetProvider.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/provider/UltrasonicAppWidgetProvider.kt
@@ -219,8 +219,8 @@ open class UltrasonicAppWidgetProvider : AppWidgetProvider() {
NavigationActivity::class.java
).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
if (playerActive) intent.putExtra(Constants.INTENT_SHOW_PLAYER, true)
- intent.action = "android.intent.action.MAIN"
- intent.addCategory("android.intent.category.LAUNCHER")
+ intent.action = Intent.ACTION_MAIN
+ intent.addCategory(Intent.CATEGORY_LAUNCHER)
var flags = PendingIntent.FLAG_UPDATE_CURRENT
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// needed starting Android 12 (S = 31)
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt
index 1db5cffe..fceee797 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt
@@ -30,7 +30,6 @@ object Constants {
// Legacy Preferences keys
// Warning: Don't add any new here!
// Use setting_keys.xml
- const val PREFERENCES_KEY_USE_FIVE_STAR_RATING = "use_five_star_rating"
const val PREFERENCE_VALUE_ALL = 0
const val PREFERENCE_VALUE_A2DP = 1
const val PREFERENCE_VALUE_DISABLED = 2
diff --git a/ultrasonic/src/main/res/menu/search.xml b/ultrasonic/src/main/res/menu/search.xml
deleted file mode 100644
index 1fba16c6..00000000
--- a/ultrasonic/src/main/res/menu/search.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
\ No newline at end of file
diff --git a/ultrasonic/src/main/res/menu/search_view_menu.xml b/ultrasonic/src/main/res/menu/search_view_menu.xml
new file mode 100644
index 00000000..9b39a8b2
--- /dev/null
+++ b/ultrasonic/src/main/res/menu/search_view_menu.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/ultrasonic/src/main/res/menu/select_album.xml b/ultrasonic/src/main/res/menu/track_collection_menu.xml
similarity index 100%
rename from ultrasonic/src/main/res/menu/select_album.xml
rename to ultrasonic/src/main/res/menu/track_collection_menu.xml
diff --git a/ultrasonic/src/main/res/values-cs/strings.xml b/ultrasonic/src/main/res/values-cs/strings.xml
index c06ae0b5..2bcf7604 100644
--- a/ultrasonic/src/main/res/values-cs/strings.xml
+++ b/ultrasonic/src/main/res/values-cs/strings.xml
@@ -104,7 +104,6 @@
Chyba aktualizace informací playlistu %s
Alba
Umělci
- Vyhledávání
Zobrazit více
Nenalezeno, zkuste znovu
Skladby
diff --git a/ultrasonic/src/main/res/values-de/strings.xml b/ultrasonic/src/main/res/values-de/strings.xml
index 728688b9..b60c265f 100644
--- a/ultrasonic/src/main/res/values-de/strings.xml
+++ b/ultrasonic/src/main/res/values-de/strings.xml
@@ -139,7 +139,6 @@
Aktualisierung der Wiedergabeliste %s ist fehlgeschlagen
Alben
Künstler*innen
- Suche
Zeige mehr
Keine Treffer, bitte erneut versuchen
Titel
diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml
index fd477225..0f66c28f 100644
--- a/ultrasonic/src/main/res/values-es/strings.xml
+++ b/ultrasonic/src/main/res/values-es/strings.xml
@@ -141,7 +141,6 @@
Fallo al actualizar la información de la lista de reproducción para %s
Álbumes
Artistas
- Buscar
Mostrar mas
Sin resultados, por favor inténtalo de nuevo
Canciones
diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml
index a310becd..73226555 100644
--- a/ultrasonic/src/main/res/values-fr/strings.xml
+++ b/ultrasonic/src/main/res/values-fr/strings.xml
@@ -137,7 +137,6 @@
Échec de la mise à jour des informations de la liste de lecture pour %s
Albums
Artistes
- Recherche
Afficher plus
Aucun résultat, veuillez essayer à nouveau
Titres
diff --git a/ultrasonic/src/main/res/values-hu/strings.xml b/ultrasonic/src/main/res/values-hu/strings.xml
index f85bf6b3..853d1e7f 100644
--- a/ultrasonic/src/main/res/values-hu/strings.xml
+++ b/ultrasonic/src/main/res/values-hu/strings.xml
@@ -110,7 +110,6 @@
Lejátszási lista módosítása sikertelen %s
Albumok
Előadók
- Keresés
Továbbiak
Nincs találat, próbálja újra!
Dalok
diff --git a/ultrasonic/src/main/res/values-it/strings.xml b/ultrasonic/src/main/res/values-it/strings.xml
index 0b778491..b0f2faa9 100644
--- a/ultrasonic/src/main/res/values-it/strings.xml
+++ b/ultrasonic/src/main/res/values-it/strings.xml
@@ -100,7 +100,6 @@
Impossibile aggiornare informazioni playlist per %s
Album
Artisti
- Cerca
Mostra di più
Nessun risultato, riprova per favore
Canzoni
diff --git a/ultrasonic/src/main/res/values-ja/strings.xml b/ultrasonic/src/main/res/values-ja/strings.xml
index 0c749feb..d09880f5 100644
--- a/ultrasonic/src/main/res/values-ja/strings.xml
+++ b/ultrasonic/src/main/res/values-ja/strings.xml
@@ -106,7 +106,6 @@
%s のプレイリスト情報をアップデートできません
アルバム
アーティスト
- 検索
もっと表示
一致するものはありません、やり直してください
曲
diff --git a/ultrasonic/src/main/res/values-nb-rNO/strings.xml b/ultrasonic/src/main/res/values-nb-rNO/strings.xml
index 5d530829..86e58df5 100644
--- a/ultrasonic/src/main/res/values-nb-rNO/strings.xml
+++ b/ultrasonic/src/main/res/values-nb-rNO/strings.xml
@@ -186,7 +186,6 @@
Oppdater info
Album
Artister
- Søk
Vis mer
Spor
Søk
diff --git a/ultrasonic/src/main/res/values-nl/strings.xml b/ultrasonic/src/main/res/values-nl/strings.xml
index 882ba982..2fea5e44 100644
--- a/ultrasonic/src/main/res/values-nl/strings.xml
+++ b/ultrasonic/src/main/res/values-nl/strings.xml
@@ -142,7 +142,6 @@
Kan afspeellijstinformatie voor %s niet bijwerken
Albums
Artiesten
- Zoeken
Meer tonen
Geen overeenkomsten; probeer het opnieuw
Nummers
diff --git a/ultrasonic/src/main/res/values-pl/strings.xml b/ultrasonic/src/main/res/values-pl/strings.xml
index 253d858a..2e87a7ad 100644
--- a/ultrasonic/src/main/res/values-pl/strings.xml
+++ b/ultrasonic/src/main/res/values-pl/strings.xml
@@ -103,7 +103,6 @@
Błąd podczas aktualizacji playlisty %s
Albumy
Wykonawcy
- Wyszukaj
Wyświetl więcej
Brak wyników, proszę spróbować ponownie
Utwory
diff --git a/ultrasonic/src/main/res/values-pt-rBR/strings.xml b/ultrasonic/src/main/res/values-pt-rBR/strings.xml
index b61c8b15..96691401 100644
--- a/ultrasonic/src/main/res/values-pt-rBR/strings.xml
+++ b/ultrasonic/src/main/res/values-pt-rBR/strings.xml
@@ -140,7 +140,6 @@
Falha ao atualizar a informação da playlist para %s
Álbuns
Artistas
- Pesquisar
Mostrar Mais
Nada coincide, tente novamente
Músicas
diff --git a/ultrasonic/src/main/res/values-pt/strings.xml b/ultrasonic/src/main/res/values-pt/strings.xml
index 682ecc02..e0cf7285 100644
--- a/ultrasonic/src/main/res/values-pt/strings.xml
+++ b/ultrasonic/src/main/res/values-pt/strings.xml
@@ -103,7 +103,6 @@
Falha ao atualizar a informação da playlist para %s
Álbuns
Artistas
- Pesquisar
Mostrar Mais
Nada coincide, tente novamente
Músicas
diff --git a/ultrasonic/src/main/res/values-ru/strings.xml b/ultrasonic/src/main/res/values-ru/strings.xml
index 93eb988a..0d9e5ff4 100644
--- a/ultrasonic/src/main/res/values-ru/strings.xml
+++ b/ultrasonic/src/main/res/values-ru/strings.xml
@@ -128,7 +128,6 @@
Не удалось обновить информацию о плейлисте для %s
Альбомы
Исполнители
- Поиск
Показать еще
Нет совпадений, пожалуйста попробуйте еще раз
Песни
diff --git a/ultrasonic/src/main/res/values-zh-rCN/strings.xml b/ultrasonic/src/main/res/values-zh-rCN/strings.xml
index 769c22ae..f704d2a1 100644
--- a/ultrasonic/src/main/res/values-zh-rCN/strings.xml
+++ b/ultrasonic/src/main/res/values-zh-rCN/strings.xml
@@ -128,7 +128,6 @@
更新播放列表信息失败 - %s
专辑
艺人
- 搜索
显示更多
没有匹配的结果,请重试
歌曲
diff --git a/ultrasonic/src/main/res/values-zh-rTW/strings.xml b/ultrasonic/src/main/res/values-zh-rTW/strings.xml
index 0610cc46..ced7be3b 100644
--- a/ultrasonic/src/main/res/values-zh-rTW/strings.xml
+++ b/ultrasonic/src/main/res/values-zh-rTW/strings.xml
@@ -67,7 +67,6 @@
播放清單
專輯
歌手
- 搜尋
搜尋
無符合類型
已停用
diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml
index 73763394..f8d91b62 100644
--- a/ultrasonic/src/main/res/values/strings.xml
+++ b/ultrasonic/src/main/res/values/strings.xml
@@ -142,7 +142,6 @@
Failed to update playlist information for %s
Albums
Artists
- Search
Show More
No matches, please try again
Songs