146 lines
5.2 KiB
Kotlin
146 lines
5.2 KiB
Kotlin
|
/*
|
||
|
* Copyright (c) 2020 Hemanth Savarla.
|
||
|
*
|
||
|
* 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.fragments.other
|
||
|
|
||
|
import android.content.Context
|
||
|
import android.graphics.Color
|
||
|
import android.graphics.PorterDuff
|
||
|
import android.media.AudioManager
|
||
|
import android.os.Bundle
|
||
|
import android.view.LayoutInflater
|
||
|
import android.view.View
|
||
|
import android.view.ViewGroup
|
||
|
import android.widget.SeekBar
|
||
|
import androidx.fragment.app.Fragment
|
||
|
import code.name.monkey.appthemehelper.ThemeStore
|
||
|
import code.name.monkey.retromusic.R
|
||
|
import code.name.monkey.retromusic.databinding.FragmentVolumeBinding
|
||
|
import code.name.monkey.retromusic.extensions.applyColor
|
||
|
import code.name.monkey.retromusic.helper.MusicPlayerRemote
|
||
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
||
|
import code.name.monkey.retromusic.volume.AudioVolumeObserver
|
||
|
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
|
||
|
|
||
|
class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolumeChangedListener,
|
||
|
View.OnClickListener {
|
||
|
|
||
|
private var _binding: FragmentVolumeBinding? = null
|
||
|
private val binding get() = _binding!!
|
||
|
|
||
|
private var audioVolumeObserver: AudioVolumeObserver? = null
|
||
|
|
||
|
private val audioManager: AudioManager
|
||
|
get() = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||
|
|
||
|
override fun onCreateView(
|
||
|
inflater: LayoutInflater,
|
||
|
container: ViewGroup?,
|
||
|
savedInstanceState: Bundle?
|
||
|
): View {
|
||
|
_binding = FragmentVolumeBinding.inflate(inflater, container, false)
|
||
|
return binding.root
|
||
|
}
|
||
|
|
||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||
|
super.onViewCreated(view, savedInstanceState)
|
||
|
setTintable(ThemeStore.accentColor(requireContext()))
|
||
|
binding.volumeDown.setOnClickListener(this)
|
||
|
binding.volumeUp.setOnClickListener(this)
|
||
|
}
|
||
|
|
||
|
override fun onResume() {
|
||
|
super.onResume()
|
||
|
if (audioVolumeObserver == null) {
|
||
|
audioVolumeObserver = AudioVolumeObserver(requireActivity())
|
||
|
}
|
||
|
audioVolumeObserver?.register(AudioManager.STREAM_MUSIC, this)
|
||
|
|
||
|
val audioManager = audioManager
|
||
|
binding.volumeSeekBar.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
|
||
|
binding.volumeSeekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
|
||
|
binding.volumeSeekBar.setOnSeekBarChangeListener(this)
|
||
|
}
|
||
|
|
||
|
override fun onAudioVolumeChanged(currentVolume: Int, maxVolume: Int) {
|
||
|
if (_binding != null) {
|
||
|
binding.volumeSeekBar.max = maxVolume
|
||
|
binding.volumeSeekBar.progress = currentVolume
|
||
|
binding.volumeDown.setImageResource(if (currentVolume == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
override fun onDestroyView() {
|
||
|
super.onDestroyView()
|
||
|
audioVolumeObserver?.unregister()
|
||
|
_binding = null
|
||
|
}
|
||
|
|
||
|
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
|
||
|
val audioManager = audioManager
|
||
|
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0)
|
||
|
setPauseWhenZeroVolume(i < 1)
|
||
|
binding.volumeDown.setImageResource(if (i == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
|
||
|
}
|
||
|
|
||
|
override fun onStartTrackingTouch(seekBar: SeekBar) {
|
||
|
}
|
||
|
|
||
|
override fun onStopTrackingTouch(seekBar: SeekBar) {
|
||
|
}
|
||
|
|
||
|
override fun onClick(view: View) {
|
||
|
val audioManager = audioManager
|
||
|
when (view.id) {
|
||
|
R.id.volumeDown -> audioManager.adjustStreamVolume(
|
||
|
AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0
|
||
|
)
|
||
|
R.id.volumeUp -> audioManager.adjustStreamVolume(
|
||
|
AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fun tintWhiteColor() {
|
||
|
val color = Color.WHITE
|
||
|
binding.volumeDown.setColorFilter(color, PorterDuff.Mode.SRC_IN)
|
||
|
binding.volumeUp.setColorFilter(color, PorterDuff.Mode.SRC_IN)
|
||
|
binding.volumeSeekBar.applyColor(color)
|
||
|
}
|
||
|
|
||
|
fun setTintable(color: Int) {
|
||
|
binding.volumeSeekBar.applyColor(color)
|
||
|
}
|
||
|
|
||
|
private fun setPauseWhenZeroVolume(pauseWhenZeroVolume: Boolean) {
|
||
|
if (PreferenceUtil.isPauseOnZeroVolume)
|
||
|
if (MusicPlayerRemote.isPlaying && pauseWhenZeroVolume)
|
||
|
MusicPlayerRemote.pauseSong()
|
||
|
}
|
||
|
|
||
|
fun setTintableColor(color: Int) {
|
||
|
binding.volumeDown.setColorFilter(color, PorterDuff.Mode.SRC_IN)
|
||
|
binding.volumeUp.setColorFilter(color, PorterDuff.Mode.SRC_IN)
|
||
|
// TintHelper.setTint(volumeSeekBar, color, false)
|
||
|
binding.volumeSeekBar.applyColor(color)
|
||
|
}
|
||
|
|
||
|
companion object {
|
||
|
|
||
|
fun newInstance(): VolumeFragment {
|
||
|
return VolumeFragment()
|
||
|
}
|
||
|
}
|
||
|
}
|