diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 50f044269..92ee215fc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -119,7 +119,7 @@
(EXTRA_SHOW_MIC).value == true) {
- startMicSearch()
- }
-
- back.setOnClickListener { onBackPressed() }
- voiceSearch.setOnClickListener { startMicSearch() }
- clearText.setOnClickListener { searchView.clearText() }
- searchContainer.backgroundTintList =
- ColorStateList.valueOf(ATHUtil.resolveColor(this, R.attr.colorSurface))
-
- keyboardPopup.setOnClickListener {
- val inputManager = getSystemService(Service.INPUT_METHOD_SERVICE) as InputMethodManager
- inputManager.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT)
- }
-
- keyboardPopup.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this))
- ColorStateList.valueOf(
- MaterialValueHelper.getPrimaryTextColor(
- this,
- ColorUtil.isColorLight(ThemeStore.accentColor(this))
- )
- ).apply {
- keyboardPopup.setTextColor(this)
- keyboardPopup.iconTint = this
- }
- if (savedInstanceState != null) {
- query = savedInstanceState.getString(QUERY)
- }
-
- viewModel.getSearchResult().observe(this, androidx.lifecycle.Observer {
- showData(it)
- })
- }
-
- private fun setupRecyclerView() {
- searchAdapter = SearchAdapter(this, emptyList())
- searchAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
- override fun onChanged() {
- super.onChanged()
- empty.visibility = if (searchAdapter.itemCount < 1) View.VISIBLE else View.GONE
- }
- })
- recyclerView.apply {
- layoutManager = LinearLayoutManager(this@SearchActivity)
- adapter = searchAdapter
- }
- recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
- if (dy > 0) {
- keyboardPopup.shrink()
- } else if (dy < 0) {
- keyboardPopup.extend()
- }
- }
- })
- }
-
- private fun setupSearchView() {
- searchView.addTextChangedListener(this)
- }
-
- override fun onSaveInstanceState(outState: Bundle) {
- super.onSaveInstanceState(outState)
- outState.putString(QUERY, query)
- }
-
- private fun setUpToolBar() {
- title = null
- }
-
- private fun search(query: String) {
- this.query = query
- TransitionManager.beginDelayedTransition(appBarLayout)
- voiceSearch.visibility = if (query.isNotEmpty()) View.GONE else View.VISIBLE
- clearText.visibility = if (query.isNotEmpty()) View.VISIBLE else View.GONE
- viewModel.search(query)
- }
-
- override fun onMediaStoreChanged() {
- super.onMediaStoreChanged()
- query?.let { search(it) }
- }
-
- override fun onQueryTextSubmit(query: String): Boolean {
- hideSoftKeyboard()
- return false
- }
-
- override fun onQueryTextChange(newText: String): Boolean {
- search(newText)
- return false
- }
-
- private fun hideSoftKeyboard() {
- RetroUtil.hideSoftKeyboard(this@SearchActivity)
- if (searchView != null) {
- searchView.clearFocus()
- }
- }
-
- private fun showData(data: MutableList) {
- if (data.isNotEmpty()) {
- searchAdapter.swapDataSet(data)
- } else {
- searchAdapter.swapDataSet(ArrayList())
- }
- }
-
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- when (requestCode) {
- REQ_CODE_SPEECH_INPUT -> {
- if (resultCode == Activity.RESULT_OK && null != data) {
- val result: ArrayList? =
- data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
- query = result?.get(0)
- searchView.setText(query, BufferType.EDITABLE)
- viewModel.search(query!!)
- }
- }
- }
- }
-
- private fun startMicSearch() {
- val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
- intent.putExtra(
- RecognizerIntent.EXTRA_LANGUAGE_MODEL,
- RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
- )
- intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
- intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.speech_prompt))
- try {
- startActivityForResult(
- intent,
- REQ_CODE_SPEECH_INPUT
- )
- } catch (e: ActivityNotFoundException) {
- e.printStackTrace()
- Toast.makeText(this, getString(R.string.speech_not_supported), Toast.LENGTH_SHORT)
- .show()
- }
- }
-
- override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
- }
-
- override fun onTextChanged(newText: CharSequence, start: Int, before: Int, count: Int) {
- search(newText.toString())
- }
-
- override fun afterTextChanged(s: Editable) {
- }
-
- companion object {
- val TAG: String = SearchActivity::class.java.simpleName
-
- const val EXTRA_SHOW_MIC = "extra_show_mic"
- const val QUERY: String = "query"
-
- const val REQ_CODE_SPEECH_INPUT = 9002
- }
-}
-
-fun TextInputEditText.clearText() {
- text = null
-}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt
index 20a356cc6..7c5bc3c94 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt
@@ -74,26 +74,33 @@ class HomeAdapter(
val viewHolder = holder as AlbumViewHolder
viewHolder.bindView(
list[position].arrayList as List,
- R.string.recent_albums
+ R.string.recent_albums,
+ "Most recently added albums"
)
}
TOP_ALBUMS -> {
val viewHolder = holder as AlbumViewHolder
viewHolder.bindView(
list[position].arrayList as List,
- R.string.top_albums
+ R.string.top_albums,
+ "Most played albums"
)
}
RECENT_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
viewHolder.bindView(
list[position].arrayList as List,
- R.string.recent_artists
+ R.string.recent_artists,
+ "Most recently added artists"
)
}
TOP_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder
- viewHolder.bindView(list[position].arrayList as List, R.string.top_artists)
+ viewHolder.bindView(
+ list[position].arrayList as List,
+ R.string.top_artists,
+ "Most played artists"
+ )
}
SUGGESTIONS -> {
val viewHolder = holder as SuggestionsViewHolder
@@ -148,7 +155,7 @@ class HomeAdapter(
}
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view), AlbumClickListener {
- fun bindView(list: List, titleRes: Int) {
+ fun bindView(list: List, titleRes: Int, message: String) {
if (list.isNotEmpty()) {
val albumAdapter = AlbumAdapter(activity, list, R.layout.pager_item, null, this)
recyclerView.apply {
@@ -169,7 +176,7 @@ class HomeAdapter(
}
private inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view), ArtistClickListener {
- fun bindView(list: List, titleRes: Int) {
+ fun bindView(list: List, titleRes: Int, message: String) {
if (list.isNotEmpty()) {
val manager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
val artistAdapter = ArtistAdapter(
@@ -210,7 +217,7 @@ class HomeAdapter(
fun bindView(arrayList: List) {
val color = ThemeStore.accentColor(activity)
- itemView.findViewById(R.id.text).setTextColor(color)
+ itemView.findViewById(R.id.message).setTextColor(color)
itemView.findViewById(R.id.card6).apply {
setCardBackgroundColor(ColorUtil.withAlpha(color, 0.2f))
}
@@ -230,6 +237,7 @@ class HomeAdapter(
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(arrayList: List, titleRes: Int) {
+ text.text = "You're all time favorites"
if (arrayList.isNotEmpty()) {
val songs = PlaylistSongsLoader.getPlaylistSongList(activity, arrayList[0])
if (songs.isNotEmpty()) {
@@ -250,6 +258,7 @@ class HomeAdapter(
private inner class GenreViewHolder(itemView: View) : AbsHomeViewItem(itemView) {
fun bind(genres: List, titleRes: Int) {
title.text = activity.getString(titleRes)
+ text.text = "Genres for you"
recyclerView.apply {
show()
layoutManager = GridLayoutManager(activity, 2, GridLayoutManager.HORIZONTAL, false)
@@ -262,5 +271,6 @@ class HomeAdapter(
open inner class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) {
val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView)
val title: AppCompatTextView = itemView.findViewById(R.id.title)
+ val text: AppCompatTextView = itemView.findViewById(R.id.text)
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt
index 96a9123b3..1bc47922c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt
@@ -17,9 +17,7 @@ package code.name.monkey.retromusic.appshortcuts
import android.app.Activity
import android.content.Intent
import android.os.Bundle
-import code.name.monkey.retromusic.activities.search.SearchActivity
import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
-import code.name.monkey.retromusic.appshortcuts.shortcuttype.SearchShortCutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
import code.name.monkey.retromusic.model.Playlist
@@ -45,26 +43,22 @@ class AppShortcutLauncherActivity : Activity() {
when (shortcutType) {
SHORTCUT_TYPE_SHUFFLE_ALL -> {
startServiceWithPlaylist(
- MusicService.SHUFFLE_MODE_SHUFFLE, ShuffleAllPlaylist(applicationContext)
+ SHUFFLE_MODE_SHUFFLE, ShuffleAllPlaylist(applicationContext)
)
DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.id)
}
SHORTCUT_TYPE_TOP_TRACKS -> {
startServiceWithPlaylist(
- MusicService.SHUFFLE_MODE_NONE, MyTopTracksPlaylist(applicationContext)
+ SHUFFLE_MODE_NONE, MyTopTracksPlaylist(applicationContext)
)
DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.id)
}
SHORTCUT_TYPE_LAST_ADDED -> {
startServiceWithPlaylist(
- MusicService.SHUFFLE_MODE_NONE, LastAddedPlaylist(applicationContext)
+ SHUFFLE_MODE_NONE, LastAddedPlaylist(applicationContext)
)
DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.id)
}
- SHORTCUT_TYPE_SEARCH -> {
- startActivity(Intent(this, SearchActivity::class.java))
- DynamicShortcutManager.reportShortcutUsed(this, SearchShortCutType.id)
- }
}
finish()
}
@@ -87,7 +81,6 @@ class AppShortcutLauncherActivity : Activity() {
const val SHORTCUT_TYPE_SHUFFLE_ALL = 0
const val SHORTCUT_TYPE_TOP_TRACKS = 1
const val SHORTCUT_TYPE_LAST_ADDED = 2
- const val SHORTCUT_TYPE_SEARCH = 3
const val SHORTCUT_TYPE_NONE = 4
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt
index c77df6b54..c5f0ed6dc 100644
--- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt
@@ -22,7 +22,6 @@ import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon
import android.os.Build
import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType
-import code.name.monkey.retromusic.appshortcuts.shortcuttype.SearchShortCutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType
import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType
import java.util.*
@@ -34,11 +33,9 @@ class DynamicShortcutManager(private val context: Context) {
private val defaultShortcuts: List
get() = Arrays.asList(
- SearchShortCutType(context).shortcutInfo,
ShuffleAllShortcutType(context).shortcutInfo,
TopTracksShortcutType(context).shortcutInfo,
LastAddedShortcutType(context).shortcutInfo
-
)
fun initDynamicShortcuts() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt
deleted file mode 100644
index a025688ec..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2019 Hemanth Savarala.
- *
- * Licensed under the GNU General Public License v3
- *
- * This 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.
- *
- * This software 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.
- */
-
-package code.name.monkey.retromusic.appshortcuts.shortcuttype
-
-import android.annotation.TargetApi
-import android.content.Context
-import android.content.pm.ShortcutInfo
-import android.os.Build
-import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator
-import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity
-
-@TargetApi(Build.VERSION_CODES.N_MR1)
-class SearchShortCutType(context: Context) : BaseShortcutType(context) {
- companion object {
-
- val id: String
- get() = BaseShortcutType.ID_PREFIX + "search"
- }
-
- override val shortcutInfo: ShortcutInfo
- get() = ShortcutInfo.Builder(
- context,
- id
- ).setShortLabel(context.getString(R.string.action_search))
- .setLongLabel(context.getString(R.string.search_hint)).setIcon(
- AppShortcutIconGenerator.generateThemedIcon(
- context,
- R.drawable.ic_app_shortcut_search
- )
- ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SEARCH))
- .build()
-}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
similarity index 90%
rename from app/src/main/java/code/name/monkey/retromusic/activities/search/SearchFragment.kt
rename to app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
index 75dc04422..75c1500f6 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/search/SearchFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
@@ -1,4 +1,4 @@
-package code.name.monkey.retromusic.activities.search
+package code.name.monkey.retromusic.fragments.search
import android.content.ActivityNotFoundException
import android.content.Intent
@@ -19,22 +19,30 @@ import code.name.monkey.retromusic.adapter.SearchAdapter
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.fragments.MainActivityFragment
+import com.google.android.material.textfield.TextInputEditText
import kotlinx.android.synthetic.main.fragment_search.*
+import kotlinx.android.synthetic.main.fragment_search.view.*
import org.koin.android.ext.android.inject
import java.util.*
import kotlin.collections.ArrayList
class SearchFragment : MainActivityFragment(R.layout.fragment_search), TextWatcher {
+ companion object {
+ const val QUERY = "query"
+ const val REQ_CODE_SPEECH_INPUT = 9001
+ }
+
private val viewModel: SearchViewModel by inject()
private lateinit var searchAdapter: SearchAdapter
private var query: String? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
+ mainActivity.setSupportActionBar(toolbar)
+ mainActivity.hideBottomNavigation()
+ mainActivity.setBottomBarVisibility(View.GONE)
setupRecyclerView()
setupSearchView()
- mainActivity.setSupportActionBar(toolbar)
- mainActivity.setBottomBarVisibility(View.GONE)
voiceSearch.setOnClickListener { startMicSearch() }
clearText.setOnClickListener { searchView.clearText() }
@@ -48,7 +56,7 @@ class SearchFragment : MainActivityFragment(R.layout.fragment_search), TextWatch
}
keyboardPopup.accentColor()
if (savedInstanceState != null) {
- query = savedInstanceState.getString(SearchActivity.QUERY)
+ query = savedInstanceState.getString(QUERY)
}
viewModel.getSearchResult().observe(viewLifecycleOwner, Observer {
@@ -124,11 +132,15 @@ class SearchFragment : MainActivityFragment(R.layout.fragment_search), TextWatch
try {
startActivityForResult(
intent,
- SearchActivity.REQ_CODE_SPEECH_INPUT
+ REQ_CODE_SPEECH_INPUT
)
} catch (e: ActivityNotFoundException) {
e.printStackTrace()
showToast(getString(R.string.speech_not_supported))
}
}
+}
+
+fun TextInputEditText.clearText() {
+ text = null
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/search/SearchViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
similarity index 93%
rename from app/src/main/java/code/name/monkey/retromusic/activities/search/SearchViewModel.kt
rename to app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
index 550a8d237..ee6b3b518 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/search/SearchViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
@@ -1,4 +1,4 @@
-package code.name.monkey.retromusic.activities.search
+package code.name.monkey.retromusic.fragments.search
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml
index 9c4e3b86d..335a7d5c9 100644
--- a/app/src/main/res/layout/fragment_search.xml
+++ b/app/src/main/res/layout/fragment_search.xml
@@ -27,29 +27,45 @@
app:liftOnScroll="true">
+ style="@style/Toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:navigationIcon="@drawable/ic_keyboard_backspace_black"
+ app:titleTextAppearance="@style/ToolbarTextAppearanceNormal">
-
+ app:boxCornerRadiusBottomEnd="8dp"
+ app:boxCornerRadiusBottomStart="8dp"
+ app:boxCornerRadiusTopEnd="8dp"
+ app:boxCornerRadiusTopStart="8dp"
+ app:boxStrokeColor="?attr/colorControlNormal"
+ app:boxStrokeWidth="1dp"
+ app:hintEnabled="false">
-
-
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/text">
+ app:layout_constraintTop_toBottomOf="@id/text">
+ app:layout_constraintTop_toBottomOf="@id/text">
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/section_recycler_view.xml b/app/src/main/res/layout/section_recycler_view.xml
index 4db63851b..9107539bc 100644
--- a/app/src/main/res/layout/section_recycler_view.xml
+++ b/app/src/main/res/layout/section_recycler_view.xml
@@ -13,7 +13,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
- android:paddingVertical="14dp"
+ android:paddingTop="16dp"
android:textAppearance="@style/TextViewHeadline6"
android:textStyle="bold"
app:layout_constrainedWidth="true"
@@ -22,17 +22,30 @@
app:layout_constraintTop_toTopOf="parent"
tools:text="@tools:sample/full_names" />
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml
index 2282e9fb5..9f4bba396 100644
--- a/app/src/main/res/navigation/main_graph.xml
+++ b/app/src/main/res/navigation/main_graph.xml
@@ -49,13 +49,6 @@
app:argType="integer" />
-
-
-
@@ -81,5 +74,4 @@
android:label="SettingsFragment"
tools:layout="@layout/fragment_settings" />
-
\ No newline at end of file