Skip to content

hw-8 #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-parcelize'
}

android {
compileSdk 30
compileSdk 31

defaultConfig {
applicationId "com.itis.androidlabproject"
minSdk 23
targetSdk 30
targetSdk 31
versionCode 1
versionName "1.0"

Expand Down Expand Up @@ -37,12 +38,13 @@ android {

dependencies {

implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'android.arch.navigation:navigation-fragment:2.3.5'
implementation 'android.arch.navigation:navigation-ui:2.3.5'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
implementation "androidx.media:media:1.2.0"
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Expand Down
7 changes: 6 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.itis.androidlabproject">

<application
Expand All @@ -10,14 +11,18 @@
android:supportsRtl="true"
android:theme="@style/Theme.AndroidLabProject">
<activity
android:name=".MainActivity"
android:name=".view.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".services.MusicService"
android:exported="false"
tools:ignore="Instantiatable" />
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// IMyMusicInterface.aidl
package com.itis.androidlabproject;

// Declare any non-default types here with import statements

interface IMyMusicInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void playPreviousTrack();
void playNextTrack();
void pauseTrack();
void playTrack();
void setTrack(int id);
}
11 changes: 0 additions & 11 deletions app/src/main/java/com/itis/androidlabproject/MainActivity.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.itis.androidlabproject.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.itis.androidlabproject.databinding.TrackListItemBinding
import com.itis.androidlabproject.models.Track

class TrackHolder(
private val binding: TrackListItemBinding,
private val itemClick: (Int) -> (Unit)
) : RecyclerView.ViewHolder(binding.root) {

private var trackToDisplay: Track? = null


init {
itemView.setOnClickListener {
trackToDisplay?.also {
itemClick(it.id)
}
}
}

fun bind(track: Track) {
trackToDisplay = track
with(binding) {
trackListItemTitle.text = track.title
trackListItemAuthor.text = track.author
trackListItemCover.setImageResource(track.cover)
}
}

companion object {
fun create(
parent: ViewGroup,
itemClick: (Int) -> Unit
) = TrackHolder(
TrackListItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
), itemClick
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.itis.androidlabproject.adapter

import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.itis.androidlabproject.models.Track

class TrackListAdapter(
private val trackList: ArrayList<Track>,
private val itemClick: (Int) -> (Unit)

) : RecyclerView.Adapter<TrackHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrackHolder {
return TrackHolder.create(parent, itemClick)
}

override fun onBindViewHolder(holder: TrackHolder, position: Int) {
holder.bind(trackList[position])
}

override fun getItemCount() = trackList.size
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.itis.androidlabproject.decorator

import android.content.Context
import android.graphics.Rect
import android.util.TypedValue
import android.view.View
import androidx.recyclerview.widget.RecyclerView

class SpaceItemDecorator(
context: Context,
spacing: Float = 16f,
) : RecyclerView.ItemDecoration() {

private val spacingPx: Int = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
spacing,
context.resources.displayMetrics
).toInt()

override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
val position = parent.getChildAdapterPosition(view)
val spacingMiddle: Int = spacingPx / 2
when (position) {
0 -> {
outRect.top = spacingPx
outRect.bottom = spacingMiddle
}
state.itemCount - 1 -> {
outRect.top = spacingMiddle
outRect.bottom = spacingPx
}
else -> {
outRect.top = spacingMiddle
outRect.bottom = spacingMiddle
}
}
outRect.left = spacingPx
outRect.right = spacingPx
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.itis.androidlabproject.extensions

import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment

fun AppCompatActivity.findController (id: Int) : NavController {
return (supportFragmentManager.findFragmentById(id) as NavHostFragment).navController
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package com.itis.androidlabproject.fragments

import android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment
import com.itis.androidlabproject.IMyMusicInterface
import com.itis.androidlabproject.R
import com.itis.androidlabproject.databinding.FragmentTrackDetailsBinding
import com.itis.androidlabproject.models.Track
import com.itis.androidlabproject.repository.TrackRepository
import com.itis.androidlabproject.services.MusicService

class TrackDetailsFragment : Fragment(R.layout.fragment_track_details) {
private var binding: FragmentTrackDetailsBinding? = null

private var binderAidl: IMyMusicInterface? = null

private val connectionAidl =object : ServiceConnection {
override fun onServiceConnected(
name: ComponentName?,
service: IBinder?
) {
binderAidl = IMyMusicInterface.Stub.asInterface(service)
initView()
}

override fun onServiceDisconnected(
name: ComponentName?
) {
binderAidl = null
}
}

private var currentTrack: Track? = null

private fun initView() {
val id = arguments?.getInt("trackId")

id?.let {
currentTrack = TrackRepository.tracksList[id]
}

binding?.run {
tvTitle.text = currentTrack?.title
tvAuthor.text = currentTrack?.author
currentTrack?.cover?.let { ivCover.setImageResource(it) }
}

initMusicNavigationView(id)
}

private fun initMusicNavigationView(id: Int?) {
id?.let {id ->
binderAidl?.setTrack(id)
binderAidl?.playTrack()

binding?.run {
btnPlay.setOnClickListener {
binderAidl?.playTrack()
showPauseButton()
}
btnPrevious.setOnClickListener {
binderAidl?.playPreviousTrack()
if (id== 0) {
updateView(TrackRepository.tracksList.size-1)
} else {
updateView(id-1)
}
}
btnNext.setOnClickListener {
binderAidl?.playNextTrack()
if (id == TrackRepository.tracksList.size-1) {
updateView(0)
} else {
updateView(id+1)
}
}
btnPause.setOnClickListener {
binderAidl?.pauseTrack()
showPlayButton()
}
}
}
}

private fun updateView(id:Int){
id.let {
currentTrack = TrackRepository.tracksList[id];
}

binding?.run {
tvTitle.text = currentTrack?.title
tvAuthor.text = currentTrack?.author
currentTrack?.cover?.let { ivCover.setImageResource(it) }
}

showPauseButton()
initMusicNavigationView(id)
}


private fun showPauseButton(){
binding?.run {
btnPlay.visibility = View.GONE
btnPause.visibility = View.VISIBLE
}
}

private fun showPlayButton(){
binding?.run {
btnPause.visibility = View.GONE
btnPlay.visibility = View.VISIBLE
}
}


override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): ConstraintLayout? {
binding = FragmentTrackDetailsBinding.inflate(inflater, container, false)
activity?.bindService(
Intent(activity, MusicService::class.java),
connectionAidl,
AppCompatActivity.BIND_AUTO_CREATE
)
return binding?.root
}
}
Loading