diff --git a/app/build.gradle b/app/build.gradle index 9bb293e..53c125c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" @@ -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' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 69ebd0a..d122c6a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -18,6 +19,10 @@ + diff --git a/app/src/main/aidl/com/itis/androidlabproject/IMyMusicInterface.aidl b/app/src/main/aidl/com/itis/androidlabproject/IMyMusicInterface.aidl new file mode 100644 index 0000000..e35eb81 --- /dev/null +++ b/app/src/main/aidl/com/itis/androidlabproject/IMyMusicInterface.aidl @@ -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); +} diff --git a/app/src/main/java/com/itis/androidlabproject/MainActivity.kt b/app/src/main/java/com/itis/androidlabproject/MainActivity.kt deleted file mode 100644 index d85e6eb..0000000 --- a/app/src/main/java/com/itis/androidlabproject/MainActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.itis.androidlabproject - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/TrackHolder.kt b/app/src/main/java/com/itis/androidlabproject/adapter/TrackHolder.kt new file mode 100644 index 0000000..146607b --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/TrackHolder.kt @@ -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 + ) + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/TrackListAdapter.kt b/app/src/main/java/com/itis/androidlabproject/adapter/TrackListAdapter.kt new file mode 100644 index 0000000..ad36cf6 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/TrackListAdapter.kt @@ -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, + private val itemClick: (Int) -> (Unit) + +) : RecyclerView.Adapter() { + 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 +} diff --git a/app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt b/app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt new file mode 100644 index 0000000..072a6f6 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt @@ -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 + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/extensions/ActivityExt.kt b/app/src/main/java/com/itis/androidlabproject/extensions/ActivityExt.kt new file mode 100644 index 0000000..c52375f --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/extensions/ActivityExt.kt @@ -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 +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragments/TrackDetailsFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragments/TrackDetailsFragment.kt new file mode 100644 index 0000000..3a63636 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragments/TrackDetailsFragment.kt @@ -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 + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragments/TrackListFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragments/TrackListFragment.kt new file mode 100644 index 0000000..52aa44d --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragments/TrackListFragment.kt @@ -0,0 +1,60 @@ +package com.itis.androidlabproject.fragments + +import android.os.Bundle +import android.view.View +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.RecyclerView +import com.itis.androidlabproject.R +import com.itis.androidlabproject.adapter.TrackListAdapter +import com.itis.androidlabproject.databinding.FragmentTrackListBinding +import com.itis.androidlabproject.decorator.SpaceItemDecorator +import com.itis.androidlabproject.repository.TrackRepository + +class TrackListFragment : Fragment(R.layout.fragment_track_list) { + private var binding: FragmentTrackListBinding? = null + private var trackListAdapter: TrackListAdapter? = null + + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentTrackListBinding.bind(view) + + trackListAdapter = TrackListAdapter(TrackRepository.tracksList) { id -> + var args = bundleOf( + "trackId" to id + ) + + findNavController().navigate(R.id.action_trackListFragment_to_trackDetailsFragment, args) + } + + val decorator = DividerItemDecoration(requireContext(), RecyclerView.VERTICAL) + val spacing = SpaceItemDecorator(requireContext(), 16f) + binding?.run { + rvTracks.run { + adapter = trackListAdapter + addItemDecoration(decorator) + addItemDecoration(spacing) + } + } + + activity?.intent?.extras?.getInt("id")?.let { id -> + var args = bundleOf( + "trackId" to id + ) + findNavController().navigate(R.id.action_trackListFragment_to_trackDetailsFragment, args) + } + activity?.intent?.removeExtra("id") + } + + override fun onDestroy() { + super.onDestroy() + binding = null + trackListAdapter = null + } + +} diff --git a/app/src/main/java/com/itis/androidlabproject/models/Track.kt b/app/src/main/java/com/itis/androidlabproject/models/Track.kt new file mode 100644 index 0000000..d2e49ec --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/models/Track.kt @@ -0,0 +1,14 @@ +package com.itis.androidlabproject.models + +import androidx.annotation.DrawableRes +import androidx.annotation.RawRes + +class Track( + val id: Int, + val title: String, + val author:String, + @DrawableRes val cover:Int, + @RawRes val sound:Int +) { + +} diff --git a/app/src/main/java/com/itis/androidlabproject/notifications/NotificationController.kt b/app/src/main/java/com/itis/androidlabproject/notifications/NotificationController.kt new file mode 100644 index 0000000..4aecb92 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/notifications/NotificationController.kt @@ -0,0 +1,94 @@ +package com.itis.androidlabproject.notifications + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Build +import androidx.core.app.NotificationCompat +import androidx.core.os.bundleOf +import com.itis.androidlabproject.R +import com.itis.androidlabproject.fragments.TrackDetailsFragment +import com.itis.androidlabproject.repository.TrackRepository +import com.itis.androidlabproject.services.MusicService +import com.itis.androidlabproject.view.MainActivity + + +class NotificationController( + private val context: Context +) { + + private val CHANNEL_ID = "music_channel" + private val notificationId = 1 + + private val notificationManager by lazy { + context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + } + private var nBuilder: NotificationCompat.Builder + + init { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val name = "Player" + val descriptionText = "Notificaton Channel" + val importance = NotificationManager.IMPORTANCE_DEFAULT + val channel = + notificationManager.getNotificationChannel(CHANNEL_ID) ?: NotificationChannel( + CHANNEL_ID, + name, + importance + ).apply { + description = descriptionText + } + notificationManager.createNotificationChannel(channel) + } + + val previousIntent = Intent(context, MusicService::class.java).apply { + action = "PREVIOUS" + } + val resumeIntent = Intent(context, MusicService::class.java).apply { + action = "RESUME" + } + val nextIntent = Intent(context, MusicService::class.java).apply { + action = "NEXT" + } + val previousPendingIntent = PendingIntent.getService(context, 0, previousIntent, 0) + val resumePendingIntent = PendingIntent.getService(context, 1, resumeIntent, 0) + val nextPendingIntent = PendingIntent.getService(context, 2, nextIntent, 0) + + nBuilder = NotificationCompat.Builder(context, CHANNEL_ID) + .setSmallIcon(R.drawable.play_arrow_24px) + .addAction(R.drawable.skip_previous_24px, "Previous", previousPendingIntent) + .addAction(R.drawable.games_24px, "Pause/Play", resumePendingIntent) + .addAction(R.drawable.skip_next_24px, "Next", nextPendingIntent) + } + + + fun build(trackId: Int) { + val track = TrackRepository.tracksList[trackId] + val cover = BitmapFactory.decodeResource(context.resources, track.cover) + + val contentIntent = Intent(context, MainActivity::class.java) + .putExtras(bundleOf( + "id" to trackId + )).let { + PendingIntent.getActivities( + context, + 0, + arrayOf(it), + PendingIntent.FLAG_ONE_SHOT + ) + } + + val builder = nBuilder + .setContentTitle(track.title) + .setContentText(track.author) + .setLargeIcon(cover) + .setContentIntent(contentIntent) + + val notification: Notification = builder.build() + notificationManager.notify(notificationId, notification) + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/repository/TrackRepository.kt b/app/src/main/java/com/itis/androidlabproject/repository/TrackRepository.kt new file mode 100644 index 0000000..cfd39a0 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/repository/TrackRepository.kt @@ -0,0 +1,24 @@ +package com.itis.androidlabproject.repository + +import com.itis.androidlabproject.R +import com.itis.androidlabproject.models.Track + +object TrackRepository { + var idCounter=0; + + val tracksList: ArrayList = arrayListOf( + Track(idCounter++,"Темные Мысли","AnteeOne", R.drawable.dt,R.raw.dt), + Track(idCounter++,"JoJo","Jojo OST",R.drawable.jojo,R.raw.jojo), + Track(idCounter++,"Cadillac","MORGENTSHTERN",R.drawable.cdl,R.raw.cdl), + Track(idCounter++,"По глазам","Slava Marlow",R.drawable.slava,R.raw.slava), + Track(idCounter++,"ICE","MORGENTSHTERN",R.drawable.ice,R.raw.ice), + Track(idCounter++,"AUF","Nurminckiy",R.drawable.auf,R.raw.auf), + Track(idCounter++,"Pososi","MORGENTSHTERN",R.drawable.pososi,R.raw.pososi), + Track(idCounter++,"Новый Мерин","MORGENTSHTERN",R.drawable.merin,R.raw.merin), + Track(idCounter++,"Мне пох","MORGENTSHTERN",R.drawable.poh,R.raw.poh), + Track(idCounter++,"Темные Мысли","AnteeOne", R.drawable.dt,R.raw.dt), + Track(idCounter++,"JoJo","Jojo OST",R.drawable.jojo,R.raw.jojo), + Track(idCounter++,"Cadillac","MORGENTSHTERN",R.drawable.cdl,R.raw.cdl), + Track(idCounter++,"По глазам","Slava Marlow",R.drawable.slava,R.raw.slava), + ) +} diff --git a/app/src/main/java/com/itis/androidlabproject/services/MusicService.kt b/app/src/main/java/com/itis/androidlabproject/services/MusicService.kt new file mode 100644 index 0000000..aede9a2 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/services/MusicService.kt @@ -0,0 +1,130 @@ +package com.itis.androidlabproject.services + +import android.app.Service +import android.content.Intent +import android.media.AudioAttributes +import android.media.MediaPlayer +import android.os.IBinder +import com.itis.androidlabproject.IMyMusicInterface +import com.itis.androidlabproject.notifications.NotificationController +import com.itis.androidlabproject.repository.TrackRepository + +class MusicService : Service() { + private val CHANNEL_ID = "music_channel" + private var currentTrackId: Int? = null + + private var mediaPlayer: MediaPlayer = MediaPlayer().apply { + setAudioAttributes( + AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .setUsage(AudioAttributes.USAGE_MEDIA) + .build() + ) + } + + private var notificationController: NotificationController? = null + + private fun initNotificationController () { + notificationController = NotificationController(this) + } + + override fun onCreate() { + super.onCreate() + currentTrackId = 0 + initNotificationController() + } + + override fun onStartCommand( + intent: Intent?, + flags: Int, + startId: Int + ): Int { + when (intent?.action) { + "PREVIOUS" -> { + playPreviousTrack() + } + "RESUME" -> { + if (mediaPlayer.isPlaying) pauseTrack() else playTrack() + } + "NEXT" -> { + playNextTrack() + } + } + return super.onStartCommand(intent, flags, startId) + } + + inner class AidlBinder : IMyMusicInterface.Stub() { + override fun playPreviousTrack() { + this@MusicService.playPreviousTrack() + } + + override fun playNextTrack() { + this@MusicService.playNextTrack() + } + + override fun pauseTrack() { + this@MusicService.pauseTrack() + } + + override fun playTrack() { + this@MusicService.playTrack() + } + + override fun setTrack(id: Int) { + this@MusicService.setTrack(id) + } + + } + + private fun playPreviousTrack() { + currentTrackId?.let { id -> + currentTrackId = if (id == 0) { + TrackRepository.tracksList.size - 1 + } else { + id - 1 + } + } + setTrack(currentTrackId?: 0) + playTrack() + } + + private fun playNextTrack() { + currentTrackId?.let { id -> + currentTrackId = if (id == TrackRepository.tracksList.size - 1) { + 0 + } else { + id + 1 + } + } + setTrack(currentTrackId?: 0) + playTrack() + } + + private fun setTrack(id: Int) { + if (mediaPlayer.isPlaying) mediaPlayer.stop() + mediaPlayer = MediaPlayer.create(applicationContext, TrackRepository.tracksList[id].sound) + currentTrackId = id + mediaPlayer.run { + setOnCompletionListener { + stop() + } + } + notificationController?.build(id) + } + + private fun playTrack() { + mediaPlayer.start() + } + + private fun pauseTrack() { + mediaPlayer.pause(); + } + + + override fun onBind(intent: Intent?): IBinder = AidlBinder() + + override fun onDestroy() { + super.onDestroy() + mediaPlayer.release() + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/view/MainActivity.kt b/app/src/main/java/com/itis/androidlabproject/view/MainActivity.kt new file mode 100644 index 0000000..52e903a --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/view/MainActivity.kt @@ -0,0 +1,29 @@ +package com.itis.androidlabproject.view + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.navigation.NavController +import com.itis.androidlabproject.R +import com.itis.androidlabproject.databinding.ActivityMainBinding +import com.itis.androidlabproject.extensions.findController + +class MainActivity : AppCompatActivity() { + private var binding: ActivityMainBinding? = null + private var navController: NavController? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater).also { + setContentView(it.root) + } + navController = findController(R.id.fragment_container) + +// binding?.fragmentContainer?.findNavController() + } + + override fun onDestroy() { + super.onDestroy() + binding = null + navController = null + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index 7706ab9..2b068d1 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -27,4 +27,4 @@ android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" android:strokeWidth="1" android:strokeColor="#00000000" /> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/album_24px.xml b/app/src/main/res/drawable/album_24px.xml new file mode 100644 index 0000000..93ba0e6 --- /dev/null +++ b/app/src/main/res/drawable/album_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/auf.jpg b/app/src/main/res/drawable/auf.jpg new file mode 100644 index 0000000..31d2eb9 Binary files /dev/null and b/app/src/main/res/drawable/auf.jpg differ diff --git a/app/src/main/res/drawable/cdl.jpg b/app/src/main/res/drawable/cdl.jpg new file mode 100644 index 0000000..b39209e Binary files /dev/null and b/app/src/main/res/drawable/cdl.jpg differ diff --git a/app/src/main/res/drawable/dt.jpg b/app/src/main/res/drawable/dt.jpg new file mode 100644 index 0000000..f558953 Binary files /dev/null and b/app/src/main/res/drawable/dt.jpg differ diff --git a/app/src/main/res/drawable/gachi.jpg b/app/src/main/res/drawable/gachi.jpg new file mode 100644 index 0000000..4480244 Binary files /dev/null and b/app/src/main/res/drawable/gachi.jpg differ diff --git a/app/src/main/res/drawable/games_24px.xml b/app/src/main/res/drawable/games_24px.xml new file mode 100644 index 0000000..cfd37f9 --- /dev/null +++ b/app/src/main/res/drawable/games_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ice.jpg b/app/src/main/res/drawable/ice.jpg new file mode 100644 index 0000000..437773f Binary files /dev/null and b/app/src/main/res/drawable/ice.jpg differ diff --git a/app/src/main/res/drawable/jojo.jpg b/app/src/main/res/drawable/jojo.jpg new file mode 100644 index 0000000..0cb21d9 Binary files /dev/null and b/app/src/main/res/drawable/jojo.jpg differ diff --git a/app/src/main/res/drawable/merin.jpg b/app/src/main/res/drawable/merin.jpg new file mode 100644 index 0000000..6df478d Binary files /dev/null and b/app/src/main/res/drawable/merin.jpg differ diff --git a/app/src/main/res/drawable/play_arrow_24px.xml b/app/src/main/res/drawable/play_arrow_24px.xml new file mode 100644 index 0000000..af5ca4a --- /dev/null +++ b/app/src/main/res/drawable/play_arrow_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/poh.jpg b/app/src/main/res/drawable/poh.jpg new file mode 100644 index 0000000..c5d2d88 Binary files /dev/null and b/app/src/main/res/drawable/poh.jpg differ diff --git a/app/src/main/res/drawable/pososi.jpg b/app/src/main/res/drawable/pososi.jpg new file mode 100644 index 0000000..a66c902 Binary files /dev/null and b/app/src/main/res/drawable/pososi.jpg differ diff --git a/app/src/main/res/drawable/skip_next_24px.xml b/app/src/main/res/drawable/skip_next_24px.xml new file mode 100644 index 0000000..6f0a774 --- /dev/null +++ b/app/src/main/res/drawable/skip_next_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/skip_previous_24px.xml b/app/src/main/res/drawable/skip_previous_24px.xml new file mode 100644 index 0000000..da683fe --- /dev/null +++ b/app/src/main/res/drawable/skip_previous_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/slava.jpg b/app/src/main/res/drawable/slava.jpg new file mode 100644 index 0000000..3a406b5 Binary files /dev/null and b/app/src/main/res/drawable/slava.jpg differ diff --git a/app/src/main/res/drawable/stop_24px.xml b/app/src/main/res/drawable/stop_24px.xml new file mode 100644 index 0000000..d6510b5 --- /dev/null +++ b/app/src/main/res/drawable/stop_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fa45b0..b9e338d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,21 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context=".view.MainActivity"> - + app:navGraph="@navigation/nav_graph" /> diff --git a/app/src/main/res/layout/fragment_track_details.xml b/app/src/main/res/layout/fragment_track_details.xml new file mode 100644 index 0000000..7419916 --- /dev/null +++ b/app/src/main/res/layout/fragment_track_details.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_track_list.xml b/app/src/main/res/layout/fragment_track_list.xml new file mode 100644 index 0000000..b5e98c0 --- /dev/null +++ b/app/src/main/res/layout/fragment_track_list.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/layout/track_list_item.xml b/app/src/main/res/layout/track_list_item.xml new file mode 100644 index 0000000..7357865 --- /dev/null +++ b/app/src/main/res/layout/track_list_item.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml new file mode 100644 index 0000000..79b4a53 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/app/src/main/res/raw/auf.mp3 b/app/src/main/res/raw/auf.mp3 new file mode 100644 index 0000000..86dcf7f Binary files /dev/null and b/app/src/main/res/raw/auf.mp3 differ diff --git a/app/src/main/res/raw/cdl.mp3 b/app/src/main/res/raw/cdl.mp3 new file mode 100644 index 0000000..c0c5698 Binary files /dev/null and b/app/src/main/res/raw/cdl.mp3 differ diff --git a/app/src/main/res/raw/dt.mp3 b/app/src/main/res/raw/dt.mp3 new file mode 100644 index 0000000..870f2cc Binary files /dev/null and b/app/src/main/res/raw/dt.mp3 differ diff --git a/app/src/main/res/raw/gachi.mp3 b/app/src/main/res/raw/gachi.mp3 new file mode 100644 index 0000000..bb54d6c Binary files /dev/null and b/app/src/main/res/raw/gachi.mp3 differ diff --git a/app/src/main/res/raw/ice.mp3 b/app/src/main/res/raw/ice.mp3 new file mode 100644 index 0000000..ca4ea3e Binary files /dev/null and b/app/src/main/res/raw/ice.mp3 differ diff --git a/app/src/main/res/raw/jojo.mp3 b/app/src/main/res/raw/jojo.mp3 new file mode 100644 index 0000000..6af0180 Binary files /dev/null and b/app/src/main/res/raw/jojo.mp3 differ diff --git a/app/src/main/res/raw/merin.mp3 b/app/src/main/res/raw/merin.mp3 new file mode 100644 index 0000000..1e3d3eb Binary files /dev/null and b/app/src/main/res/raw/merin.mp3 differ diff --git a/app/src/main/res/raw/poh.mp3 b/app/src/main/res/raw/poh.mp3 new file mode 100644 index 0000000..5f9d1e3 Binary files /dev/null and b/app/src/main/res/raw/poh.mp3 differ diff --git a/app/src/main/res/raw/pososi.mp3 b/app/src/main/res/raw/pososi.mp3 new file mode 100644 index 0000000..abd1495 Binary files /dev/null and b/app/src/main/res/raw/pososi.mp3 differ diff --git a/app/src/main/res/raw/slava.mp3 b/app/src/main/res/raw/slava.mp3 new file mode 100644 index 0000000..e713828 Binary files /dev/null and b/app/src/main/res/raw/slava.mp3 differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ca1931b..7809f8f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,6 +5,7 @@ #FF3700B3 #FF03DAC5 #FF018786 + #1DB954 #FF000000 #FFFFFFFF diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f931ae8..9f49b54 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ - AndroidLabProject - \ No newline at end of file + Media Player + Default Title + Default Author +