Skip to content
This repository has been archived by the owner on Feb 8, 2022. It is now read-only.

Commit

Permalink
fix like/dislike
Browse files Browse the repository at this point in the history
  • Loading branch information
delletenebre committed Jan 2, 2020
1 parent 5a30a98 commit 048b51b
Show file tree
Hide file tree
Showing 38 changed files with 495 additions and 682 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
20.01.02
========
* Добавлен базовый функционал поиска
* Исправлено добавление/удаление понравившихся треков
* Исправлены подборки

19.11.20
========
* Добавлена возможность изменять расположение кнопок "Нравится" и "Не нравится" в интерфейсе AA
Expand Down
12 changes: 6 additions & 6 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
defaultConfig {
multiDexEnabled true
applicationId "kg.delletenebre.yamus"
versionCode 29
versionName "19.11.20"
versionCode 30
versionName "20.01.02"

minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
Expand Down Expand Up @@ -52,19 +52,19 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'androidx.core:core-ktx:1.1.0'
implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.recyclerview:recyclerview:1.0.0"
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
implementation 'com.google.android.material:material:1.1.0-beta02'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.preference:preference:1.1.0'
implementation 'androidx.fragment:fragment-ktx:1.2.0-rc02'
implementation 'androidx.fragment:fragment-ktx:1.2.0-rc04'

// Lifecycle
def lifecycle_version = '2.2.0-rc02'
def lifecycle_version = '2.2.0-rc03'
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
Expand Down
11 changes: 9 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,20 @@
android:label="@string/title_activity_login"
android:launchMode="singleTop" />
<activity
android:name=".MainActivity">
android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>

<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>

<!-- App links for http -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
Expand Down
137 changes: 127 additions & 10 deletions app/src/main/java/kg/delletenebre/yamus/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
package kg.delletenebre.yamus

import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.database.Cursor
import android.database.MatrixCursor
import android.media.AudioManager
import android.os.Bundle
import android.provider.BaseColumns
import android.util.Log
import android.view.Menu
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.AutoCompleteTextView
import android.widget.LinearLayout
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.SearchView.OnQueryTextListener
import androidx.appcompat.widget.Toolbar
import androidx.core.app.ActivityCompat
import androidx.core.os.bundleOf
import androidx.cursoradapter.widget.CursorAdapter
import androidx.cursoradapter.widget.SimpleCursorAdapter
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.setupWithNavController
Expand All @@ -32,20 +46,22 @@ import kg.delletenebre.yamus.databinding.ActivityMainBinding
import kg.delletenebre.yamus.media.actions.CustomActionsHelper
import kg.delletenebre.yamus.media.library.CurrentPlaylist
import kg.delletenebre.yamus.ui.login.LoginActivity
import kg.delletenebre.yamus.ui.search.SearchViewModel
import kg.delletenebre.yamus.ui.settings.SettingsActivity
import kg.delletenebre.yamus.utils.InjectorUtils
import kg.delletenebre.yamus.utils.UI
import kg.delletenebre.yamus.viewmodels.MainActivityViewModel
import kg.delletenebre.yamus.viewmodels.NowPlayingViewModel
import kotlinx.coroutines.launch
import kotlin.system.exitProcess


class MainActivity : AppCompatActivity() {
class MainActivity : ScopedAppActivity() {
private val PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 1

private lateinit var navigationController: NavController
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MainActivityViewModel
private lateinit var nowPlayingViewModel: NowPlayingViewModel
private var searchViewModel: SearchViewModel? = null
private lateinit var firebaseAnalytics: FirebaseAnalytics

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -59,15 +75,20 @@ class MainActivity : AppCompatActivity() {

firebaseAnalytics = FirebaseAnalytics.getInstance(this)

viewModel = ViewModelProvider(this, InjectorUtils.provideMainActivityViewModel(this))
.get(MainActivityViewModel::class.java)
nowPlayingViewModel = ViewModelProvider(this, InjectorUtils.provideNowPlayingViewModel(this))
.get(NowPlayingViewModel::class.java)
viewModel = ViewModelProvider(this, InjectorUtils.provideMainActivityViewModel(this)).get()

binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.lifecycleOwner = this
binding.viewModel = viewModel
binding.nowPlayingModel = nowPlayingViewModel
binding.currentPlaylist = CurrentPlaylist

CurrentPlaylist.currentTrack.observe(this, Observer {
if (it == null) {

} else {

}
})

volumeControlStream = AudioManager.STREAM_MUSIC

Expand Down Expand Up @@ -157,7 +178,10 @@ class MainActivity : AppCompatActivity() {
}
}

fun setupMainToolbar(toolbar: Toolbar) {
fun setupMainToolbar(toolbar: Toolbar, searchQuery: String? = null) {
initSearch(toolbar.menu, searchQuery)

UI.setMenuIconsColor(this, toolbar.menu)
toolbar.setOnMenuItemClickListener {
when (it.itemId) {
R.id.action_settings -> {
Expand All @@ -176,6 +200,8 @@ class MainActivity : AppCompatActivity() {
}
}



override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE -> {
Expand Down Expand Up @@ -210,4 +236,95 @@ class MainActivity : AppCompatActivity() {
)
}
}

private fun initSearch(menu: Menu, searchQuery: String? = null) {
val searchItem = menu.findItem(R.id.action_search)
val searchView = searchItem?.actionView as SearchView
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager

val from = arrayOf(SearchManager.SUGGEST_COLUMN_TEXT_1)
val to = intArrayOf(R.id.item_label)
val cursorAdapter = SimpleCursorAdapter(
this,
R.layout.search_item,
null,
from,
to,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
)
searchView.suggestionsAdapter = cursorAdapter
searchView.setOnQueryTextListener(object : OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
hideKeyboard(searchView)

if (navigationController.currentDestination?.id != R.id.fragmentSearch) {
val bundle = bundleOf("searchQuery" to query)
navigationController.navigate(R.id.fragmentSearch, bundle)
} else {
searchViewModel?.search(query ?: "")
}

return false
}

override fun onQueryTextChange(query: String?): Boolean {
launch {
val cursor = MatrixCursor(arrayOf(BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1))
query?.let {
if (query.length > 2) {
YaApi.searchSuggest(it).forEachIndexed { index, suggestion ->
cursor.addRow(arrayOf(index, suggestion))
}
}
}
cursorAdapter.changeCursor(cursor)
cursorAdapter.notifyDataSetChanged()
}
return true
}
})

searchView.setOnSuggestionListener(object: SearchView.OnSuggestionListener {
override fun onSuggestionSelect(position: Int): Boolean {
return false
}

override fun onSuggestionClick(position: Int): Boolean {
hideKeyboard(searchView)
val cursor = searchView.suggestionsAdapter.getItem(position) as Cursor
val selection = cursor.getString(cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1))
searchView.setQuery(selection, false)

// Do something with selection
return true
}
})

searchView.apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName))
val textView = findViewById<AutoCompleteTextView>(R.id.search_src_text)
textView.threshold = 3
if (searchQuery != null) {
searchItem.expandActionView()
searchView.setQuery(searchQuery, true)
searchView.clearFocus()
}

}
}

fun setSearchViewModel(viewModel: SearchViewModel?) {
searchViewModel = viewModel
}

fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

fun Fragment.hideKeyboard() {
view?.let {
activity?.hideKeyboard(it)
}
}
}
24 changes: 24 additions & 0 deletions app/src/main/java/kg/delletenebre/yamus/ScopedAppActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kg.delletenebre.yamus

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlin.coroutines.CoroutineContext

abstract class ScopedAppActivity: AppCompatActivity(), CoroutineScope {
protected lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}

override fun onDestroy() {
super.onDestroy()
job.cancel()
}
}
Loading

0 comments on commit 048b51b

Please sign in to comment.