diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 50f04426..92ee215f 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 20a356cc..7c5bc3c9 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 96a9123b..1bc47922 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 c77df6b5..c5f0ed6d 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 a025688e..00000000 --- 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 75dc0442..75c1500f 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 550a8d23..ee6b3b51 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 9c4e3b86..335a7d5c 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 4db63851..9107539b 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 2282e9fb..9f4bba39 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