Compare commits

...
Sign in to create a new pull request.

10 commits

Author SHA1 Message Date
Hemanth S
a051bb7722
Revert "Revert "Scroll helper"" 2020-04-20 21:53:32 +05:30
h4h13
886112d7df WIP equalizer 2020-04-20 19:43:12 +05:30
Hemanth S
98f1d23ebe
Merge pull request #712 from h4h13/revert-710-scroll-helper
Revert "Scroll helper"
2020-04-19 02:19:48 +05:30
Hemanth S
5de5fc1c3a
Revert "Scroll helper" 2020-04-19 02:19:30 +05:30
Hemanth S
f2be4720ad
Merge pull request #710 from ologe/scroll-helper
Scroll helper
2020-04-19 00:30:16 +05:30
h4h13
459b1bd668 Equalizer WIP 2020-04-19 00:14:24 +05:30
h4h13
6065c994ad Fix crashing when changing theme 2020-04-18 12:19:35 +05:30
Eugeniu Olog
23c882bdb7 removed previous bottomnavigation translation 2020-04-17 21:18:50 +02:00
Eugeniu Olog
5d34055fd0 added scroll helper to main activity 2020-04-17 21:01:35 +02:00
Eugeniu Olog
967c6fb5ac fixed statusbar implementation:
`r.getIdentifier("status_bar_height", "dimen", "android")` was returning
always about 24 dp, with notch not being considered. A best approach is to
use WindowInset API
2020-04-17 18:34:05 +02:00
53 changed files with 2249 additions and 249 deletions

View file

@ -99,6 +99,11 @@ android {
kapt { kapt {
generateStubs = true generateStubs = true
} }
kotlin {
experimental {
coroutines "enable"
}
}
} }
@ -168,6 +173,9 @@ dependencies {
def kotlin_coroutines_version = "1.3.3" def kotlin_coroutines_version = "1.3.3"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
def arch_version = '2.2.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$arch_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$arch_version"
implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:3.4.0.201406110918-r' implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:3.4.0.201406110918-r'
@ -176,6 +184,8 @@ dependencies {
implementation 'com.github.AdrienPoupa:jaudiotagger:2.2.3' implementation 'com.github.AdrienPoupa:jaudiotagger:2.2.3'
implementation 'com.github.ologe:scroll-helper:2.0.0-beta01'
implementation 'com.anjlab.android.iab.v3:library:1.1.0' implementation 'com.anjlab.android.iab.v3:library:1.1.0'
implementation 'com.r0adkll:slidableactivity:2.1.0' implementation 'com.r0adkll:slidableactivity:2.1.0'
implementation 'com.heinrichreimersoftware:material-intro:1.6' implementation 'com.heinrichreimersoftware:material-intro:1.6'
@ -184,4 +194,8 @@ dependencies {
def dagger_version = "2.23.1" def dagger_version = "2.23.1"
implementation "com.google.dagger:dagger:$dagger_version" implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation 'com.github.ologe:scroll-helper:1.1.5'
implementation 'com.diogobernardino:williamchart:2.2'
implementation 'com.h6ah4i.android.widget.verticalseekbar:verticalseekbar:0.7.0'
} }

View file

@ -17,7 +17,6 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="com.android.vending.BILLING" />
<application <application
android:name=".App" android:name=".App"
android:allowBackup="true" android:allowBackup="true"
@ -30,6 +29,7 @@
android:usesCleartextTraffic="false" android:usesCleartextTraffic="false"
tools:ignore="AllowBackup,GoogleAppIndexingWarning" tools:ignore="AllowBackup,GoogleAppIndexingWarning"
tools:targetApi="m"> tools:targetApi="m">
<activity <activity
android:name=".activities.MainActivity" android:name=".activities.MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
@ -122,20 +122,19 @@
<activity android:name=".activities.bugreport.BugReportActivity" /> <activity android:name=".activities.bugreport.BugReportActivity" />
<activity android:name=".activities.ShareInstagramStory" /> <activity android:name=".activities.ShareInstagramStory" />
<activity android:name=".activities.DriveModeActivity" /> <activity android:name=".activities.DriveModeActivity" />
<activity android:name=".activities.EqualizerActivity" />
<activity android:name=".activities.TestActivity" />
<activity <activity
android:name=".activities.SearchActivity" android:name=".activities.SearchActivity"
android:windowSoftInputMode="stateVisible" /> android:windowSoftInputMode="stateVisible" />
<activity <activity
android:name=".activities.LockScreenActivity" android:name=".activities.LockScreenActivity"
android:noHistory="true" android:noHistory="true"
android:showOnLockScreen="true" /> android:showOnLockScreen="true" />
<activity <activity
android:name=".appshortcuts.AppShortcutLauncherActivity" android:name=".appshortcuts.AppShortcutLauncherActivity"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:theme="@android:style/Theme.Translucent.NoTitleBar" /> android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity <activity
android:name=".activities.saf.SAFGuideActivity" android:name=".activities.saf.SAFGuideActivity"
android:theme="@style/Theme.Intro" /> android:theme="@style/Theme.Intro" />
@ -149,8 +148,6 @@
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" /> android:resource="@xml/provider_paths" />
</provider> </provider>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}" android:authorities="${applicationId}"
@ -166,14 +163,12 @@
<action android:name="android.intent.action.MEDIA_BUTTON" /> <action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".appwidgets.BootReceiver"> <receiver android:name=".appwidgets.BootReceiver">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver <receiver
android:name=".appwidgets.AppWidgetBig" android:name=".appwidgets.AppWidgetBig"
android:exported="false" android:exported="false"
@ -186,7 +181,6 @@
android:name="android.appwidget.provider" android:name="android.appwidget.provider"
android:resource="@xml/app_widget_big_info" /> android:resource="@xml/app_widget_big_info" />
</receiver> </receiver>
<receiver <receiver
android:name=".appwidgets.AppWidgetClassic" android:name=".appwidgets.AppWidgetClassic"
android:exported="false" android:exported="false"
@ -236,6 +230,16 @@
android:resource="@xml/app_widget_card_info" /> android:resource="@xml/app_widget_card_info" />
</receiver> </receiver>
<receiver
android:name=".equalizer.AudioEffectsReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="org.oucho.musicplayer.OPEN_AUDIO_EFFECT_SESSION" />
<action android:name="org.oucho.musicplayer.CLOSE_AUDIO_EFFECT_SESSION" />
</intent-filter>
</receiver>
<service <service
android:name=".service.MusicService" android:name=".service.MusicService"
android:enabled="true" android:enabled="true"
@ -250,15 +254,12 @@
<meta-data <meta-data
android:name="android.max_aspect" android:name="android.max_aspect"
android:value="2.1" /> android:value="2.1" />
<meta-data <meta-data
android:name="com.lge.support.SPLIT_WINDOW" android:name="com.lge.support.SPLIT_WINDOW"
android:value="true" /> android:value="true" />
<meta-data <meta-data
android:name="code.name.monkey.retromusic.glide.RetroMusicGlideModule" android:name="code.name.monkey.retromusic.glide.RetroMusicGlideModule"
android:value="GlideModule" /> android:value="GlideModule" />
<meta-data <meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule" android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
android:value="GlideModule" /> android:value="GlideModule" />
@ -266,4 +267,5 @@
android:name="com.android.vending.splits.required" android:name="com.android.vending.splits.required"
android:value="true" /> android:value="true" />
</application> </application>
</manifest> </manifest>

View file

@ -22,6 +22,7 @@ import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
import code.name.monkey.retromusic.dagger.DaggerMusicComponent import code.name.monkey.retromusic.dagger.DaggerMusicComponent
import code.name.monkey.retromusic.dagger.MusicComponent import code.name.monkey.retromusic.dagger.MusicComponent
import code.name.monkey.retromusic.dagger.module.AppModule import code.name.monkey.retromusic.dagger.module.AppModule
import code.name.monkey.retromusic.equalizer.AudioEffects
import com.anjlab.android.iab.v3.BillingProcessor import com.anjlab.android.iab.v3.BillingProcessor
import com.anjlab.android.iab.v3.TransactionDetails import com.anjlab.android.iab.v3.TransactionDetails
@ -63,6 +64,8 @@ class App : MultiDexApplication() {
override fun onBillingInitialized() {} override fun onBillingInitialized() {}
}) })
AudioEffects.init(this)
} }
private fun initDagger(app: App): MusicComponent = private fun initDagger(app: App): MusicComponent =

View file

@ -0,0 +1,67 @@
package code.name.monkey.retromusic
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
import dev.olog.scrollhelper.ScrollHelper
class RetroScrollHelper(
private val activity: FragmentActivity
) : ScrollHelper(activity,
true,
false // TODO when true, scrolls both bottomsheet and bottom navigation
) {
private val skipFragment = listOf(
PlayerFragment::class.java.name
)
// TODO every fragment has to have it's unique tag in order to work correctly
// here you can decide what fragment will be processed by the library
// probably you want to skip player fragments, ecc ..
override fun shouldSkipFragment(fragment: Fragment): Boolean {
return fragment::class.java.name in skipFragment
}
override fun findBottomNavigation(): View? {
return activity.findViewById(R.id.bottomNavigationView)
}
override fun findBottomSheet(): View? {
return activity.findViewById(R.id.slidingPanel)
}
override fun findFab(fragment: Fragment): View? {
return null
}
override fun findRecyclerView(fragment: Fragment): RecyclerView? {
return fragment.requireView().findViewById(R.id.recyclerView)
}
override fun findToolbar(fragment: Fragment): View? {
return fragment.requireActivity().findViewById(R.id.toolbarContainer)
}
override fun findTabLayout(fragment: Fragment): View? {
return null
}
override fun findViewPager(fragment: Fragment): ViewPager2? {
return null
}
// TODO override this if you want to apply custom padding
override fun updateRecyclerViewPadding(
fragment: Fragment,
recyclerView: RecyclerView,
topPadding: Int,
bottomPadding: Int
) {
super.updateRecyclerViewPadding(fragment, recyclerView, topPadding, bottomPadding)
}
}

View file

@ -0,0 +1,177 @@
package code.name.monkey.retromusic.activities
import android.os.Bundle
import android.transition.TransitionManager
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.*
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import code.name.monkey.retromusic.equalizer.AudioEffects
import code.name.monkey.retromusic.helper.EqualizerHelper
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.util.ViewUtil
import kotlinx.android.synthetic.main.activity_equalizer.*
/**
* @author Hemanth S (h4h13).
*/
class EqualizerActivity : AbsMusicServiceActivity(), AdapterView.OnItemSelectedListener {
private val seekBarChangeListener = object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
if (seekBar === bassBoostStrength) {
bassBoost.isEnabled = progress > 0
EqualizerHelper.instance!!.bassBoostStrength = progress
EqualizerHelper.instance!!.isBassBoostEnabled = progress > 0
} else if (seekBar === virtualizerStrength) {
virtualizer.isEnabled = progress > 0
EqualizerHelper.instance!!.isVirtualizerEnabled = progress > 0
EqualizerHelper.instance!!.virtualizerStrength = progress
}
}
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
}
}
private lateinit var presetsNamesAdapter: ArrayAdapter<String>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_equalizer)
setStatusbarColorAuto()
setNavigationbarColorAuto()
setTaskDescriptionColorAuto()
setLightNavigationBar(true)
setupToolbar()
equalizerSwitch.isChecked = AudioEffects.areAudioEffectsEnabled()
val widgetColor = MaterialValueHelper.getPrimaryTextColor(
this,
ColorUtil.isColorLight(ThemeStore.accentColor(this))
)
equalizerSwitch.setTextColor(widgetColor)
TintHelper.setTintAuto(equalizerSwitch, ThemeStore.accentColor(this), false)
equalizerSwitch.setOnCheckedChangeListener { buttonView, isChecked ->
when (buttonView.id) {
R.id.equalizerSwitch -> {
AudioEffects.setAudioEffectsEnabled(isChecked)
TransitionManager.beginDelayedTransition(content)
content.visibility = if (isChecked) View.VISIBLE else View.GONE
}
}
}
presetsNamesAdapter =
ArrayAdapter(this, R.layout.dropdown_item, AudioEffects.getEqualizerPresets(this))
presets.adapter = presetsNamesAdapter
presets.onItemSelectedListener = this
presets.setSelection(AudioEffects.getCurrentPreset())
bassBoostStrength.progress = AudioEffects.getBassBoostStrength().toInt()
ViewUtil.setProgressDrawable(bassBoostStrength, ThemeStore.accentColor(this), true)
bassBoostStrength.setOnSeekBarChangeListener(seekBarChangeListener)
virtualizerStrength.progress = AudioEffects.getVirtualizerStrength().toInt()
ViewUtil.setProgressDrawable(virtualizerStrength, ThemeStore.accentColor(this), true)
virtualizerStrength.setOnSeekBarChangeListener(seekBarChangeListener)
setupUI()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressed()
return true
}
return super.onOptionsItemSelected(item)
}
private fun setupToolbar() {
val toolbarColor = ATHUtil.resolveColor(this, R.attr.colorSurface)
toolbar.setBackgroundColor(toolbarColor)
ToolbarContentTintHelper.colorBackButton(toolbar)
setSupportActionBar(toolbar)
}
private fun setupUI() {
frequencyBands.removeAllViews()
// get number of supported bands
try {
val bands: Short = AudioEffects.getNumberOfBands()
val range: ShortArray = AudioEffects.getBandLevelRange()
// for each of the supported bands, we will set up a slider from -10dB to 10dB boost/attenuation,
// as well as text labels to assist the user
for (band in 0 until bands) {
val view = LayoutInflater.from(this)
.inflate(R.layout.retro_seekbar, frequencyBands, false)
val freqTextView = view.findViewById<TextView>(R.id.hurtz)
freqTextView.text =
String.format("%d Hz", EqualizerHelper.instance!!.getCenterFreq(band) / 1000)
val bar = view.findViewById<SeekBar>(R.id.seekbar)
ViewUtil.setProgressDrawable(bar, ThemeStore.accentColor(this), true)
val seekBarMax = range[1] - range[0]
bar.max = seekBarMax
println("AudioEffect ${AudioEffects.getBandLevel(band.toShort())}")
bar.progress = EqualizerHelper.instance!!.getBandLevel(band)
bar.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() {
override fun onProgressChanged(
seekBar: SeekBar,
progress: Int,
fromUser: Boolean
) {
if (fromUser) {
//val level: Short = (progress + AudioEffects.getBandLevelRange(0)).toShort()
//AudioEffects.setBandLevel(band.toShort(), level)
EqualizerHelper.instance!!.setBandLevel(
band, progress + EqualizerHelper.instance!!.bandLevelLow
)
println("AudioEffect: ${progress + EqualizerHelper.instance!!.bandLevelLow}")
presets.setSelection(0)
}
}
})
frequencyBands.addView(view)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
println("AudioEffect: $position")
AudioEffects.usePreset((position).toShort())
//EqualizerHelper.instance!!.equalizer.usePreset((position - 1).toShort())
setupUI()
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
}

View file

@ -55,6 +55,7 @@ import java.util.List;
import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.RetroScrollHelper;
import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity; import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity;
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog; import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog;
import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment; import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
@ -83,6 +84,7 @@ import code.name.monkey.retromusic.util.NavigationUtil;
import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.RetroColorUtil;
import code.name.monkey.retromusic.util.RetroUtil; import code.name.monkey.retromusic.util.RetroUtil;
import dev.olog.scrollhelper.ScrollHelper;
/** /**
* Created by hemanths on 2020-02-19. * Created by hemanths on 2020-02-19.
@ -119,6 +121,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
private Toolbar mToolbar; private Toolbar mToolbar;
private MaterialCardView mToolbarContainer; private MaterialCardView mToolbarContainer;
@SuppressWarnings("FieldCanBeLocal")
private ScrollHelper scrollHelper;
@Override @Override
protected void onCreate(@Nullable final Bundle savedInstanceState) { protected void onCreate(@Nullable final Bundle savedInstanceState) {
setDrawUnderStatusBar(); setDrawUnderStatusBar();
@ -151,6 +156,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
checkShowChangelog(); checkShowChangelog();
AppRater.appLaunched(this); AppRater.appLaunched(this);
setupToolbar(); setupToolbar();
scrollHelper = new RetroScrollHelper(this);
} }
@Override @Override

View file

@ -0,0 +1,40 @@
package code.name.monkey.retromusic.activities
import android.os.Bundle
import android.view.MenuItem
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
import code.name.monkey.retromusic.fragments.EqualizerFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote.audioSessionId
import kotlinx.android.synthetic.main.activity_about.*
class TestActivity : AbsMusicServiceActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.test)
setStatusbarColorAuto()
setNavigationbarColorAuto()
setLightNavigationBar(true)
val toolbarColor = ATHUtil.resolveColor(this, R.attr.colorSurface)
toolbar.setBackgroundColor(toolbarColor)
ToolbarContentTintHelper.colorBackButton(toolbar)
setSupportActionBar(toolbar)
val equalizerFragment = EqualizerFragment.newInstance(audioSessionId)
supportFragmentManager.beginTransaction()
.replace(R.id.contentFrame, equalizerFragment)
.commit()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressed()
return true
}
return super.onOptionsItemSelected(item)
}
}

View file

@ -111,10 +111,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
} }
} }
override fun onPause() {
super.onPause()
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList)
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) navigationBarColorAnimator?.cancel() // just in case
if (navigationBarColorAnimator != null) navigationBarColorAnimator?.cancel() // just in case
} }
protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View { protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View {
@ -142,7 +146,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
// necessary to make the views below clickable // necessary to make the views below clickable
miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE
bottomNavigationView.translationY = progress * 500
//bottomNavigationView.alpha = alpha //bottomNavigationView.alpha = alpha
} }
@ -217,8 +220,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
} }
} }
fun setBottomBarVisibility(gone: Int) { fun setBottomBarVisibility(visibility: Int) {
bottomNavigationView.visibility = gone bottomNavigationView.visibility = visibility
hideBottomBar(false) hideBottomBar(false)
} }

View file

@ -4,8 +4,10 @@ import android.app.Activity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.GenreAdapter.ViewHolder
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.NavigationUtil
@ -19,7 +21,7 @@ class GenreAdapter(
private val activity: Activity, private val activity: Activity,
var dataSet: List<Genre>, var dataSet: List<Genre>,
private val mItemLayoutRes: Int private val mItemLayoutRes: Int
) : RecyclerView.Adapter<GenreAdapter.ViewHolder>() { ) : ListAdapter<Genre, ViewHolder>(GenreDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@ -54,3 +56,19 @@ class GenreAdapter(
} }
} }
} }
/**
* Callback for calculating the diff between two non-null items in a list.
*
* Used by ListAdapter to calculate the minimum number of changes between and old list and a new
* list that's been passed to `submitList`.
*/
class GenreDiffCallback : DiffUtil.ItemCallback<Genre>() {
override fun areItemsTheSame(oldItem: Genre, newItem: Genre): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Genre, newItem: Genre): Boolean {
return oldItem == newItem
}
}

View file

@ -0,0 +1,203 @@
package code.name.monkey.retromusic.equalizer;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ATHUtil;
/**
* Created by Harjot on 23-May-16.
*/
public class AnalogController extends View {
public Paint circlePaint2;
public Paint linePaint;
float midx, midy;
Paint textPaint;
Paint circlePaint;
String angle;
float currdeg, deg = 3, downdeg;
int progressColor, lineColor;
onProgressChangedListener mListener;
String label;
public AnalogController(Context context) {
super(context);
init();
}
public AnalogController(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public AnalogController(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void setOnProgressChangedListener(onProgressChangedListener listener) {
mListener = listener;
}
void init() {
textPaint = new Paint();
textPaint.setColor(ATHUtil.INSTANCE.resolveColor(getContext(), android.R.attr.textColorSecondary));
textPaint.setStyle(Paint.Style.FILL);
textPaint.setTextSize(33);
textPaint.setFakeBoldText(true);
textPaint.setTextAlign(Paint.Align.CENTER);
circlePaint = new Paint();
circlePaint.setColor(Color.BLUE);
circlePaint.setStyle(Paint.Style.FILL);
circlePaint2 = new Paint();
circlePaint2.setColor(Color.RED);
circlePaint2.setStyle(Paint.Style.FILL);
linePaint = new Paint();
linePaint.setColor(ThemeStore.Companion.accentColor(getContext()));
linePaint.setStrokeWidth(16);
angle = "0.0";
label = "Label";
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
midx = canvas.getWidth() / 2;
midy = canvas.getHeight() / 2;
int ang = 0;
float x = 0, y = 0;
int radius = (int) (Math.min(midx, midy) * ((float) 14.5 / 16));
float deg2 = Math.max(3, deg);
float deg3 = Math.min(deg, 21);
for (int i = (int) (deg2); i < 22; i++) {
float tmp = (float) i / 24;
x = midx + (float) (radius * Math.sin(2 * Math.PI * (1.0 - tmp)));
y = midy + (float) (radius * Math.cos(2 * Math.PI * (1.0 - tmp)));
circlePaint.setColor(Color.parseColor("#777777"));
canvas.drawCircle(x, y, ((float) radius / 15), circlePaint);
}
for (int i = 3; i <= deg3; i++) {
float tmp = (float) i / 24;
x = midx + (float) (radius * Math.sin(2 * Math.PI * (1.0 - tmp)));
y = midy + (float) (radius * Math.cos(2 * Math.PI * (1.0 - tmp)));
canvas.drawCircle(x, y, ((float) radius / 15), circlePaint2);
}
float tmp2 = deg / 24;
float x1 = midx + (float) (radius * ((float) 2 / 5) * Math.sin(2 * Math.PI * (1.0 - tmp2)));
float y1 = midy + (float) (radius * ((float) 2 / 5) * Math.cos(2 * Math.PI * (1.0 - tmp2)));
float x2 = midx + (float) (radius * ((float) 3 / 5) * Math.sin(2 * Math.PI * (1.0 - tmp2)));
float y2 = midy + (float) (radius * ((float) 3 / 5) * Math.cos(2 * Math.PI * (1.0 - tmp2)));
circlePaint.setColor(Color.parseColor("#888888"));
canvas.drawCircle(midx, midy, radius * ((float) 13 / 15), circlePaint);
circlePaint.setColor(Color.parseColor("#999999"));
canvas.drawCircle(midx, midy, radius * ((float) 11 / 15), circlePaint);
canvas.drawText(label, midx, midy + (float) (radius * 1.1), textPaint);
canvas.drawLine(x1, y1, x2, y2, linePaint);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
mListener.onProgressChanged((int) (deg - 2));
if (e.getAction() == MotionEvent.ACTION_DOWN) {
float dx = e.getX() - midx;
float dy = e.getY() - midy;
downdeg = (float) ((Math.atan2(dy, dx) * 180) / Math.PI);
downdeg -= 90;
if (downdeg < 0) {
downdeg += 360;
}
downdeg = (float) Math.floor(downdeg / 15);
return true;
}
if (e.getAction() == MotionEvent.ACTION_MOVE) {
float dx = e.getX() - midx;
float dy = e.getY() - midy;
currdeg = (float) ((Math.atan2(dy, dx) * 180) / Math.PI);
currdeg -= 90;
if (currdeg < 0) {
currdeg += 360;
}
currdeg = (float) Math.floor(currdeg / 15);
if (currdeg == 0 && downdeg == 23) {
deg++;
if (deg > 21) {
deg = 21;
}
downdeg = currdeg;
} else if (currdeg == 23 && downdeg == 0) {
deg--;
if (deg < 3) {
deg = 3;
}
downdeg = currdeg;
} else {
deg += (currdeg - downdeg);
if (deg > 21) {
deg = 21;
}
if (deg < 3) {
deg = 3;
}
downdeg = currdeg;
}
angle = String.valueOf(deg);
invalidate();
return true;
}
return e.getAction() == MotionEvent.ACTION_UP || super.onTouchEvent(e);
}
public int getProgress() {
return (int) (deg - 2);
}
public void setProgress(int param) {
deg = param + 2;
}
public String getLabel() {
return label;
}
public void setLabel(String txt) {
label = txt;
}
public int getLineColor() {
return lineColor;
}
public void setLineColor(int lineColor) {
this.lineColor = lineColor;
}
public int getProgressColor() {
return progressColor;
}
public void setProgressColor(int progressColor) {
this.progressColor = progressColor;
}
public interface onProgressChangedListener {
void onProgressChanged(int progress);
}
}

View file

@ -0,0 +1,342 @@
package code.name.monkey.retromusic.equalizer;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.audiofx.BassBoost;
import android.media.audiofx.Equalizer;
import android.media.audiofx.Virtualizer;
import android.util.Log;
import code.name.monkey.retromusic.R;
public class AudioEffects {
public static final short BASSBOOST_MAX_STRENGTH = 1000;
private static final String PREF_EQ_ENABLED = "enabled";
private static final String PREF_VIRTUALIZER_ENABLED = "pref_virtualizer_enabled";
private static final String PREF_BAND_LEVEL = "level";
private static final String PREF_PRESET = "preset";
private static final String PREF_BASSBOOST = "bassboost";
private static final String PREF_VIRTUALIZER = "pref_virtualizer";
private static final String AUDIO_EFFECTS_PREFS = "audioeffects";
private static final BassBoostValues sBassBoostValues = new BassBoostValues();
private static final VirtualizerValues sVirtualizerValues = new VirtualizerValues();
private static final EqualizerValues sEqualizerValues = new EqualizerValues();
private static BassBoost sBassBoost;
private static Equalizer sEqualizer;
private static Virtualizer sVirtualizer;
private static boolean sCustomPreset;
public static void init(Context context) {
SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, Context.MODE_PRIVATE);
initBassBoostValues(prefs);
initEqualizerValues(prefs);
}
public static void openAudioEffectSession(Context context, int audioSessionId) {
SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, Context.MODE_PRIVATE);
initBassBoost(audioSessionId);
initEqualizer(prefs, audioSessionId);
}
public static void closeAudioEffectSession() {
if (sBassBoost != null) {
sBassBoost.release();
sBassBoost = null;
}
if (sEqualizer != null) {
sEqualizer.release();
sEqualizer = null;
}
if (sVirtualizer != null) {
sVirtualizer.release();
sVirtualizer = null;
}
}
private static void initBassBoostValues(SharedPreferences prefs) {
sBassBoostValues.enabled = prefs.getBoolean(PREF_EQ_ENABLED, false);
sBassBoostValues.strength = (short) prefs.getInt(PREF_BASSBOOST, 0);
sVirtualizerValues.enabled = prefs.getBoolean(PREF_VIRTUALIZER_ENABLED, false);
sVirtualizerValues.strength = (short) prefs.getInt(PREF_VIRTUALIZER, 0);
}
private static void initBassBoost(int audioSessionId) {
if (sBassBoost != null) {
sBassBoost.release();
sBassBoost = null;
}
sBassBoost = new BassBoost(0, audioSessionId);
sBassBoost.setEnabled(sBassBoostValues.enabled);
short strength = sBassBoostValues.strength;
if (strength >= 0 && strength <= BASSBOOST_MAX_STRENGTH) {
sBassBoost.setStrength(strength);
}
}
private static void initVirtualizerBoost(int audioSessionId) {
if (sVirtualizer != null) {
sVirtualizer.release();
sVirtualizer = null;
}
sVirtualizer = new Virtualizer(0, audioSessionId);
sVirtualizer.setEnabled(sVirtualizerValues.enabled);
short strength = sVirtualizerValues.strength;
if (strength >= 0 && strength <= BASSBOOST_MAX_STRENGTH) {
sVirtualizer.setStrength(strength);
}
}
private static void initEqualizerValues(SharedPreferences prefs) {
sEqualizerValues.enabled = prefs.getBoolean(PREF_EQ_ENABLED, false);
sEqualizerValues.preset = (short) prefs.getInt(PREF_PRESET, -1);
if (sEqualizerValues.preset == -1) {
sCustomPreset = true;
}
}
private static void initEqualizer(SharedPreferences prefs, int audioSessionId) {
if (sEqualizer != null) {
sEqualizer.release();
sEqualizer = null;
}
if (sVirtualizer != null) {
sVirtualizer.release();
sVirtualizer = null;
}
sEqualizer = new Equalizer(0, audioSessionId);
sEqualizer.setEnabled(sEqualizerValues.enabled);
sVirtualizer = new Virtualizer(0, audioSessionId);
sVirtualizer.setEnabled(sEqualizerValues.enabled);
if (!sCustomPreset) {
usePreset(sEqualizerValues.preset);
}
sEqualizerValues.numberOfBands = sEqualizer.getNumberOfBands();
if (!sEqualizerValues.levelsSet) {
sEqualizerValues.bandLevels = new short[sEqualizerValues.numberOfBands];
}
for (short b = 0; b < sEqualizerValues.numberOfBands; b++) {
if (!sEqualizerValues.levelsSet) {
short level = (short) prefs.getInt(PREF_BAND_LEVEL + b, sEqualizer.getBandLevel(b));
sEqualizerValues.bandLevels[b] = level;
if (sCustomPreset) {
sEqualizer.setBandLevel(b, level);
}
} else {
sEqualizer.setBandLevel(b, sEqualizerValues.bandLevels[b]);
}
}
sEqualizerValues.levelsSet = true;
}
public static short getBassBoostStrength() {
return sBassBoostValues.strength;
}
public static void setBassBoostStrength(short strength) {
sBassBoostValues.strength = strength;
if (sBassBoost != null) {
sBassBoost.setStrength(strength);
}
}
public static short getVirtualizerStrength() {
return sVirtualizer.getRoundedStrength();
}
public static void setVirtualizerStrength(short strength) {
sVirtualizerValues.strength = strength;
if (sVirtualizer != null) {
sVirtualizer.setStrength(strength);
}
}
public static short[] getBandLevelRange() {
if (sEqualizer == null) {
return null;
}
return sEqualizer.getBandLevelRange();
}
public static short getBandLevel(short band) {
/*if (sEqualizer == null) {
if (sEqualizerValues.levelsSet && sEqualizerValues.bandLevels.length > band) {
return sEqualizerValues.bandLevels[band];
}
}*/
if (sEqualizer != null) {
Log.d("audiofx", "eeeD");
return sEqualizer.getBandLevel(band);
}
return 0;
}
public static short getBandLevelRange(int i) {
if (sEqualizer != null) {
Log.i("AudioEffect", "getBandLevelRange: " + sEqualizer.getBandLevelRange()[i]);
return sEqualizer.getBandLevelRange()[i];
}
return 0;
}
public static int getBandLevelOfPreset(short i) {
if (sEqualizer != null) {
return (int) sEqualizer.getBandLevel(i) - getBandLevelRange(0);
}
return 0;
}
public static boolean areAudioEffectsEnabled() {
if (sEqualizer == null) {
return sEqualizerValues.enabled;
}
return sEqualizer.getEnabled();
}
public static void setAudioEffectsEnabled(boolean enabled) {
if (sEqualizer == null || sBassBoost == null) {
return;
}
sBassBoost.setEnabled(true);
sEqualizer.setEnabled(enabled);
}
public static void setBandLevel(short band, short level) {
sCustomPreset = true;
if (sEqualizerValues.bandLevels.length > band) {
sEqualizerValues.preset = -1;
sEqualizerValues.bandLevels[band] = level;
}
if (sEqualizer != null) {
sEqualizer.setBandLevel(band, level);
}
}
public static String[] getEqualizerPresets(Context context) {
if (sEqualizer == null) {
return new String[]{};
}
short numberOfPresets = sEqualizer.getNumberOfPresets();
String[] presets = new String[numberOfPresets + 1];
presets[0] = context.getResources().getString(R.string.custom);
for (short n = 0; n < numberOfPresets; n++) {
presets[n + 1] = sEqualizer.getPresetName(n);
}
return presets;
}
public static int getCurrentPreset() {
if (sEqualizer == null || sCustomPreset) {
return 0;
}
return sEqualizer.getCurrentPreset() + 1;
}
public static void usePreset(short preset) {
if (sEqualizer == null) {
return;
}
sCustomPreset = false;
sEqualizer.usePreset(preset);
}
public static short getNumberOfBands() {
if (sEqualizer == null) {
return 0;
}
return sEqualizer.getNumberOfBands();
}
public static int getCenterFreq(short band) {
if (sEqualizer == null) {
return 0;
}
return sEqualizer.getCenterFreq(band);
}
@SuppressLint("CommitPrefEdits")
public static void savePrefs(Context context) {
if (sEqualizer == null || sBassBoost == null) {
return;
}
SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(PREF_BASSBOOST, sBassBoostValues.strength);
short preset = sCustomPreset ? -1 : sEqualizer.getCurrentPreset();
editor.putInt(PREF_PRESET, preset);
short bands = sEqualizer.getNumberOfBands();
for (short b = 0; b < bands; b++) {
short level = sEqualizer.getBandLevel(b);
editor.putInt(PREF_BAND_LEVEL + b, level);
}
editor.putBoolean(PREF_EQ_ENABLED,
sEqualizer.getEnabled());
editor.commit();
}
public static String getPresetAtIndex(short i) {
if (sEqualizer != null) {
return sEqualizer.getPresetName(i);
}
return null;
}
private static class BassBoostValues {
public boolean enabled;
public short strength;
}
private static class VirtualizerValues {
public boolean enabled;
public short strength;
}
private static class EqualizerValues {
public boolean enabled;
public short preset;
public short numberOfBands;
public short[] bandLevels;
public boolean levelsSet = false;
}
}

View file

@ -0,0 +1,27 @@
package code.name.monkey.retromusic.equalizer;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AudioEffectsReceiver extends BroadcastReceiver {
public static final String EXTRA_AUDIO_SESSION_ID = "org.oucho.musicplayer.EXTRA_AUDIO_SESSION_ID";
public static final String ACTION_OPEN_AUDIO_EFFECT_SESSION = "org.oucho.musicplayer.OPEN_AUDIO_EFFECT_SESSION";
public static final String ACTION_CLOSE_AUDIO_EFFECT_SESSION = "org.oucho.musicplayer.CLOSE_AUDIO_EFFECT_SESSION";
public AudioEffectsReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
int audioSessionId = intent.getIntExtra(EXTRA_AUDIO_SESSION_ID, 0);
if (ACTION_OPEN_AUDIO_EFFECT_SESSION.equals(action)) {
AudioEffects.openAudioEffectSession(context, audioSessionId);
} else if (ACTION_CLOSE_AUDIO_EFFECT_SESSION.equals(action)) {
AudioEffects.closeAudioEffectSession();
}
}
}

View file

@ -0,0 +1,70 @@
package code.name.monkey.retromusic.equalizer;
import java.io.Serializable;
/**
* Created by Harjot on 09-Dec-16.
*/
public class EqualizerModel implements Serializable {
private boolean isEqualizerEnabled;
private int[] seekbarpos = new int[5];
private int presetPos;
private short reverbPreset;
private short bassStrength;
private short virtualizerStrength;
public EqualizerModel() {
isEqualizerEnabled = true;
reverbPreset = -1;
bassStrength = -1;
}
public boolean isEqualizerEnabled() {
return isEqualizerEnabled;
}
public void setEqualizerEnabled(boolean equalizerEnabled) {
isEqualizerEnabled = equalizerEnabled;
}
public int[] getSeekbarpos() {
return seekbarpos;
}
public void setSeekbarpos(int[] seekbarpos) {
this.seekbarpos = seekbarpos;
}
public int getPresetPos() {
return presetPos;
}
public void setPresetPos(int presetPos) {
this.presetPos = presetPos;
}
public short getReverbPreset() {
return reverbPreset;
}
public void setReverbPreset(short reverbPreset) {
this.reverbPreset = reverbPreset;
}
public short getBassStrength() {
return bassStrength;
}
public void setBassStrength(short bassStrength) {
this.bassStrength = bassStrength;
}
public short getVirtualizerStrength() {
return virtualizerStrength;
}
public void setVirtualizerStrength(short virtualizerStrength) {
this.virtualizerStrength = virtualizerStrength;
}
}

View file

@ -0,0 +1,12 @@
package code.name.monkey.retromusic.equalizer;
public class Settings {
public static boolean isEqualizerEnabled = true;
public static boolean isEqualizerReloaded = true;
public static int[] seekbarpos = new int[6];
public static int presetPos;
public static short reverbPreset = -1, bassStrength = -1, virtualizerStrength = -1;
public static EqualizerModel equalizerModel;
public static double ratio = 1.0;
public static boolean isEditing = false;
}

View file

@ -0,0 +1,10 @@
package code.name.monkey.retromusic.extensions
import android.content.Context
import androidx.annotation.DimenRes
@Suppress("NOTHING_TO_INLINE")
inline fun Context.dip(value: Int): Int = (value * resources.displayMetrics.density).toInt()
@Suppress("NOTHING_TO_INLINE")
inline fun Context.dimen(@DimenRes resource: Int): Int = resources.getDimensionPixelSize(resource)

View file

@ -0,0 +1,399 @@
package code.name.monkey.retromusic.fragments;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.media.audiofx.BassBoost;
import android.media.audiofx.Equalizer;
import android.media.audiofx.PresetReverb;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat;
import androidx.fragment.app.Fragment;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ATHUtil;
import code.name.monkey.appthemehelper.util.TintHelper;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.equalizer.EqualizerModel;
import code.name.monkey.retromusic.equalizer.Settings;
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener;
import code.name.monkey.retromusic.util.ViewUtil;
/**
* A simple {@link Fragment} subclass.
*/
public class EqualizerFragment extends Fragment {
private static final String ARG_AUDIO_SESSIOIN_ID = "audio_session_id";
private Equalizer mEqualizer;
private BassBoost bassBoost;
private PresetReverb presetReverb;
private int y = 0;
private SeekBar[] seekBarFinal = new SeekBar[5];
private Spinner presetSpinner;
private int audioSesionId;
public EqualizerFragment() {
// Required empty public constructor
}
public static EqualizerFragment newInstance(int audioSessionId) {
Bundle args = new Bundle();
args.putInt(ARG_AUDIO_SESSIOIN_ID, audioSessionId);
EqualizerFragment fragment = new EqualizerFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Settings.isEditing = true;
if (getArguments() != null && getArguments().containsKey(ARG_AUDIO_SESSIOIN_ID)) {
audioSesionId = getArguments().getInt(ARG_AUDIO_SESSIOIN_ID);
}
if (Settings.equalizerModel == null) {
Settings.equalizerModel = new EqualizerModel();
Settings.equalizerModel.setReverbPreset(PresetReverb.PRESET_NONE);
Settings.equalizerModel.setBassStrength((short) (1000 / 19));
}
mEqualizer = new Equalizer(0, audioSesionId);
bassBoost = new BassBoost(0, audioSesionId);
bassBoost.setEnabled(Settings.isEqualizerEnabled);
BassBoost.Settings bassBoostSettingTemp = bassBoost.getProperties();
BassBoost.Settings bassBoostSetting = new BassBoost.Settings(bassBoostSettingTemp.toString());
bassBoostSetting.strength = Settings.equalizerModel.getBassStrength();
bassBoost.setProperties(bassBoostSetting);
presetReverb = new PresetReverb(0, audioSesionId);
presetReverb.setPreset(Settings.equalizerModel.getReverbPreset());
presetReverb.setEnabled(Settings.isEqualizerEnabled);
mEqualizer.setEnabled(Settings.isEqualizerEnabled);
if (Settings.presetPos == 0) {
for (short bandIdx = 0; bandIdx < mEqualizer.getNumberOfBands(); bandIdx++) {
mEqualizer.setBandLevel(bandIdx, (short) Settings.seekbarpos[bandIdx]);
}
} else {
mEqualizer.usePreset((short) Settings.presetPos);
}
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_equalizer, container, false);
}
@SuppressLint("SetTextI18n")
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SwitchCompat equalizerSwitch = view.findViewById(R.id.equalizer_switch);
equalizerSwitch.setChecked(Settings.isEqualizerEnabled);
TintHelper.setTint(equalizerSwitch, ThemeStore.Companion.accentColor(requireContext()), ATHUtil.INSTANCE.isWindowBackgroundDark(requireContext()));
equalizerSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mEqualizer.setEnabled(isChecked);
bassBoost.setEnabled(isChecked);
presetReverb.setEnabled(isChecked);
Settings.isEqualizerEnabled = isChecked;
Settings.equalizerModel.setEqualizerEnabled(isChecked);
}
});
presetSpinner = view.findViewById(R.id.equalizer_preset_spinner);
FrameLayout equalizerBlocker = view.findViewById(R.id.equalizerBlocker);
SeekBar bassController = view.findViewById(R.id.bassController);
SeekBar reverbController = view.findViewById(R.id.reverbController);
if (!Settings.isEqualizerReloaded) {
int x = 0;
if (bassBoost != null) {
try {
x = ((bassBoost.getRoundedStrength() * 19) / 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
if (presetReverb != null) {
try {
y = (presetReverb.getPreset() * 19) / 6;
} catch (Exception e) {
e.printStackTrace();
}
}
if (x == 0) {
bassController.setProgress(1);
} else {
bassController.setProgress(x);
}
if (y == 0) {
reverbController.setProgress(1);
} else {
reverbController.setProgress(y);
}
} else {
int x = ((Settings.bassStrength * 19) / 1000);
y = (Settings.reverbPreset * 19) / 6;
if (x == 0) {
bassController.setProgress(1);
} else {
bassController.setProgress(x);
}
if (y == 0) {
reverbController.setProgress(1);
} else {
reverbController.setProgress(y);
}
}
TintHelper.setTint(bassController, ThemeStore.Companion.accentColor(requireContext()), ATHUtil.INSTANCE.isWindowBackgroundDark(requireContext()));
bassController.setOnSeekBarChangeListener(new SimpleOnSeekbarChangeListener() {
@Override
public void onProgressChanged(@NotNull SeekBar seekBar, int progress, boolean fromUser) {
super.onProgressChanged(seekBar, progress, fromUser);
Settings.bassStrength = (short) (((float) 1000 / 19) * (progress));
try {
bassBoost.setStrength(Settings.bassStrength);
Settings.equalizerModel.setBassStrength(Settings.bassStrength);
} catch (Exception e) {
e.printStackTrace();
}
}
});
TintHelper.setTint(reverbController, ThemeStore.Companion.accentColor(requireContext()), ATHUtil.INSTANCE.isWindowBackgroundDark(requireContext()));
reverbController.setOnSeekBarChangeListener(new SimpleOnSeekbarChangeListener() {
@Override
public void onProgressChanged(@NotNull SeekBar seekBar, int progress, boolean fromUser) {
super.onProgressChanged(seekBar, progress, fromUser);
Settings.reverbPreset = (short) ((progress * 6) / 19);
Settings.equalizerModel.setReverbPreset(Settings.reverbPreset);
try {
presetReverb.setPreset(Settings.reverbPreset);
} catch (Exception e) {
e.printStackTrace();
}
y = progress;
}
});
TextView equalizerHeading = new TextView(getContext());
equalizerHeading.setText(R.string.equalizer);
equalizerHeading.setTextSize(20);
equalizerHeading.setGravity(Gravity.CENTER_HORIZONTAL);
short numberOfFrequencyBands = 5;
final short lowerEqualizerBandLevel = mEqualizer.getBandLevelRange()[0];
final short upperEqualizerBandLevel = mEqualizer.getBandLevelRange()[1];
for (short i = 0; i < numberOfFrequencyBands; i++) {
final short equalizerBandIndex = i;
final TextView frequencyHeaderTextView = new TextView(getContext());
frequencyHeaderTextView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
));
frequencyHeaderTextView.setGravity(Gravity.CENTER_HORIZONTAL);
frequencyHeaderTextView.setTextColor(Color.parseColor("#FFFFFF"));
frequencyHeaderTextView.setText((mEqualizer.getCenterFreq(equalizerBandIndex) / 1000) + "Hz");
LinearLayout seekBarRowLayout = new LinearLayout(getContext());
seekBarRowLayout.setOrientation(LinearLayout.VERTICAL);
TextView lowerEqualizerBandLevelTextView = new TextView(getContext());
lowerEqualizerBandLevelTextView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.MATCH_PARENT
));
lowerEqualizerBandLevelTextView.setTextColor(Color.parseColor("#FFFFFF"));
lowerEqualizerBandLevelTextView.setText((lowerEqualizerBandLevel / 100) + "dB");
TextView upperEqualizerBandLevelTextView = new TextView(getContext());
lowerEqualizerBandLevelTextView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
));
upperEqualizerBandLevelTextView.setTextColor(Color.parseColor("#FFFFFF"));
upperEqualizerBandLevelTextView.setText((upperEqualizerBandLevel / 100) + "dB");
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
layoutParams.weight = 1;
SeekBar seekBar = new SeekBar(getContext());
TextView textView = new TextView(getContext());
switch (i) {
case 0:
seekBar = view.findViewById(R.id.seekBar1);
textView = view.findViewById(R.id.textView1);
break;
case 1:
seekBar = view.findViewById(R.id.seekBar2);
textView = view.findViewById(R.id.textView2);
break;
case 2:
seekBar = view.findViewById(R.id.seekBar3);
textView = view.findViewById(R.id.textView3);
break;
case 3:
seekBar = view.findViewById(R.id.seekBar4);
textView = view.findViewById(R.id.textView4);
break;
case 4:
seekBar = view.findViewById(R.id.seekBar5);
textView = view.findViewById(R.id.textView5);
break;
}
seekBarFinal[i] = seekBar;
ViewUtil.INSTANCE.setProgressDrawable(seekBar, ThemeStore.Companion.accentColor(requireContext()), true);
seekBar.setId(i);
seekBar.setMax(upperEqualizerBandLevel - lowerEqualizerBandLevel);
textView.setText(frequencyHeaderTextView.getText());
if (Settings.isEqualizerReloaded) {
seekBar.setProgress(Settings.seekbarpos[i] - lowerEqualizerBandLevel);
} else {
seekBar.setProgress(mEqualizer.getBandLevel(equalizerBandIndex) - lowerEqualizerBandLevel);
Settings.seekbarpos[i] = mEqualizer.getBandLevel(equalizerBandIndex);
Settings.isEqualizerReloaded = true;
}
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mEqualizer.setBandLevel(equalizerBandIndex, (short) (progress + lowerEqualizerBandLevel));
Settings.seekbarpos[seekBar.getId()] = (progress + lowerEqualizerBandLevel);
Settings.equalizerModel.getSeekbarpos()[seekBar.getId()] = (progress + lowerEqualizerBandLevel);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
presetSpinner.setSelection(0);
Settings.presetPos = 0;
Settings.equalizerModel.setPresetPos(0);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
equalizeSound();
}
void equalizeSound() {
ArrayList<String> equalizerPresetNames = new ArrayList<>();
ArrayAdapter<String> equalizerPresetSpinnerAdapter = new ArrayAdapter<>(requireContext(),
R.layout.dropdown_item,
equalizerPresetNames);
equalizerPresetSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
equalizerPresetNames.add("Custom");
for (short i = 0; i < mEqualizer.getNumberOfPresets(); i++) {
equalizerPresetNames.add(mEqualizer.getPresetName(i));
}
presetSpinner.setAdapter(equalizerPresetSpinnerAdapter);
if (Settings.isEqualizerReloaded && Settings.presetPos != 0) {
presetSpinner.setSelection(Settings.presetPos);
}
presetSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
try {
if (position != 0) {
mEqualizer.usePreset((short) (position - 1));
Settings.presetPos = position;
short numberOfFreqBands = 5;
final short lowerEqualizerBandLevel = mEqualizer.getBandLevelRange()[0];
for (short i = 0; i < numberOfFreqBands; i++) {
seekBarFinal[i].setProgress(mEqualizer.getBandLevel(i) - lowerEqualizerBandLevel);
Settings.seekbarpos[i] = mEqualizer.getBandLevel(i);
Settings.equalizerModel.getSeekbarpos()[i] = mEqualizer.getBandLevel(i);
}
}
} catch (Exception e) {
Toast.makeText(requireContext(), "Error while updating Equalizer", Toast.LENGTH_SHORT).show();
}
Settings.equalizerModel.setPresetPos(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
if (mEqualizer != null) {
mEqualizer.release();
}
if (bassBoost != null) {
bassBoost.release();
}
if (presetReverb != null) {
presetReverb.release();
}
Settings.isEditing = false;
}
}

View file

@ -8,17 +8,13 @@ import androidx.annotation.NonNull
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.DensityUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create import code.name.monkey.retromusic.util.ThemedFastScroller.create
import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener
import com.google.android.material.appbar.AppBarLayout
import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.* import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.*
import me.zhanghai.android.fastscroll.FastScroller import me.zhanghai.android.fastscroll.FastScroller
import me.zhanghai.android.fastscroll.FastScrollerBuilder import me.zhanghai.android.fastscroll.FastScrollerBuilder
abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> : abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : RecyclerView.LayoutManager> :
AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener { AbsLibraryPagerFragment() {
protected var adapter: A? = null protected var adapter: A? = null
protected var layoutManager: LM? = null protected var layoutManager: LM? = null
@ -31,7 +27,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
mainActivity.addOnAppBarOffsetChangedListener(this)
initLayoutManager() initLayoutManager()
initAdapter() initAdapter()
setUpRecyclerView() setUpRecyclerView()
@ -41,13 +36,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
recyclerView.layoutManager = layoutManager recyclerView.layoutManager = layoutManager
recyclerView.adapter = adapter recyclerView.adapter = adapter
val fastScroller = create(recyclerView) val fastScroller = create(recyclerView)
recyclerView.setOnApplyWindowInsetsListener(
ScrollingViewOnApplyWindowInsetsListener(
recyclerView,
fastScroller
)
)
checkForPadding()
} }
protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller { protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller {
@ -60,7 +48,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
override fun onChanged() { override fun onChanged() {
super.onChanged() super.onChanged()
checkIsEmpty() checkIsEmpty()
checkForPadding()
} }
}) })
} }
@ -78,18 +65,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
empty.visibility = if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE empty.visibility = if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE
} }
private fun checkForPadding() {
val itemCount: Int = adapter?.itemCount ?: 0
val params = container.layoutParams as ViewGroup.MarginLayoutParams
if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
val height = DensityUtil.dip2px(requireContext(), 104f)
params.bottomMargin = height
} else {
val height = DensityUtil.dip2px(requireContext(), 52f)
params.bottomMargin = height
}
}
private fun initLayoutManager() { private fun initLayoutManager() {
layoutManager = createLayoutManager() layoutManager = createLayoutManager()
} }
@ -99,25 +74,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
@NonNull @NonNull
protected abstract fun createAdapter(): A protected abstract fun createAdapter(): A
override fun onOffsetChanged(p0: AppBarLayout?, i: Int) {
container.setPadding(
container.paddingLeft,
container.paddingTop,
container.paddingRight,
mainActivity.totalAppBarScrollingRange + i
)
}
override fun onQueueChanged() {
super.onQueueChanged()
checkForPadding()
}
override fun onServiceConnected() {
super.onServiceConnected()
checkForPadding()
}
protected fun invalidateLayoutManager() { protected fun invalidateLayoutManager() {
initLayoutManager() initLayoutManager()
recyclerView.layoutManager = layoutManager recyclerView.layoutManager = layoutManager
@ -129,11 +85,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment<A : RecyclerView.Adapter<*>,
recyclerView.adapter = adapter recyclerView.adapter = adapter
} }
override fun onDestroyView() {
super.onDestroyView()
mainActivity.removeOnAppBarOffsetChangedListener(this)
}
fun recyclerView(): RecyclerView { fun recyclerView(): RecyclerView {
return recyclerView return recyclerView
} }

View file

@ -12,6 +12,7 @@ import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter
import code.name.monkey.retromusic.mvp.presenter.AlbumsView import code.name.monkey.retromusic.mvp.presenter.AlbumsView
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import dev.olog.scrollhelper.layoutmanagers.OverScrollGridLayoutManager
import javax.inject.Inject import javax.inject.Inject
class AlbumsFragment : class AlbumsFragment :
@ -51,7 +52,7 @@ class AlbumsFragment :
get() = R.string.no_albums get() = R.string.no_albums
override fun createLayoutManager(): GridLayoutManager { override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(requireActivity(), getGridSize()) return OverScrollGridLayoutManager(requireActivity(), getGridSize())
} }
override fun createAdapter(): AlbumAdapter { override fun createAdapter(): AlbumAdapter {

View file

@ -12,6 +12,7 @@ import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter
import code.name.monkey.retromusic.mvp.presenter.ArtistsView import code.name.monkey.retromusic.mvp.presenter.ArtistsView
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import dev.olog.scrollhelper.layoutmanagers.OverScrollGridLayoutManager
import javax.inject.Inject import javax.inject.Inject
class ArtistsFragment : class ArtistsFragment :
@ -63,7 +64,7 @@ class ArtistsFragment :
} }
override fun createLayoutManager(): GridLayoutManager { override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(requireActivity(), getGridSize()) return OverScrollGridLayoutManager(requireActivity(), getGridSize())
} }
override fun createAdapter(): ArtistAdapter { override fun createAdapter(): ArtistAdapter {

View file

@ -20,6 +20,7 @@ import android.util.DisplayMetrics
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.Constants import code.name.monkey.retromusic.Constants
@ -41,9 +42,12 @@ import code.name.monkey.retromusic.util.NavigationUtil
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager
import kotlinx.android.synthetic.main.abs_playlists.* import kotlinx.android.synthetic.main.abs_playlists.*
import kotlinx.android.synthetic.main.fragment_banner_home.* import kotlinx.android.synthetic.main.fragment_banner_home.*
import kotlinx.android.synthetic.main.home_content.* import kotlinx.android.synthetic.main.home_content.*
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.io.File import java.io.File
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@ -119,7 +123,10 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
} }
actionShuffle.setOnClickListener { actionShuffle.setOnClickListener {
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(requireActivity()), true) lifecycleScope.launch {
val songs = async { SongLoader.getAllSongs(requireContext()) }
MusicPlayerRemote.openAndShuffleQueue(songs.await(), true)
}
} }
history.setOnClickListener { history.setOnClickListener {
@ -141,7 +148,7 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
homeAdapter = HomeAdapter(mainActivity, displayMetrics) homeAdapter = HomeAdapter(mainActivity, displayMetrics)
recyclerView.apply { recyclerView.apply {
layoutManager = LinearLayoutManager(mainActivity) layoutManager = OverScrollLinearLayoutManager(mainActivity)
adapter = homeAdapter adapter = homeAdapter
} }
homePresenter.attachView(this) homePresenter.attachView(this)

View file

@ -74,6 +74,7 @@ import code.name.monkey.retromusic.util.RetroColorUtil;
import code.name.monkey.retromusic.util.ThemedFastScroller; import code.name.monkey.retromusic.util.ThemedFastScroller;
import code.name.monkey.retromusic.views.BreadCrumbLayout; import code.name.monkey.retromusic.views.BreadCrumbLayout;
import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener; import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener;
import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager;
import me.zhanghai.android.fastscroll.FastScroller; import me.zhanghai.android.fastscroll.FastScroller;
public class FoldersFragment extends AbsMainActivityFragment implements public class FoldersFragment extends AbsMainActivityFragment implements
@ -478,7 +479,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
} }
private void setUpRecyclerView() { private void setUpRecyclerView() {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setLayoutManager(new OverScrollLinearLayoutManager(getActivity()));
FastScroller fastScroller = ThemedFastScroller.INSTANCE.create(recyclerView); FastScroller fastScroller = ThemedFastScroller.INSTANCE.create(recyclerView);
recyclerView.setOnApplyWindowInsetsListener( recyclerView.setOnApplyWindowInsetsListener(
new ScrollingViewOnApplyWindowInsetsListener(recyclerView, fastScroller)); new ScrollingViewOnApplyWindowInsetsListener(recyclerView, fastScroller));

View file

@ -25,6 +25,7 @@ import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.mvp.presenter.GenresPresenter import code.name.monkey.retromusic.mvp.presenter.GenresPresenter
import code.name.monkey.retromusic.mvp.presenter.GenresView import code.name.monkey.retromusic.mvp.presenter.GenresView
import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager
import javax.inject.Inject import javax.inject.Inject
class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(), class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearLayoutManager>(),
@ -42,7 +43,7 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment<GenreAdapter, LinearL
} }
override fun createLayoutManager(): LinearLayoutManager { override fun createLayoutManager(): LinearLayoutManager {
return LinearLayoutManager(activity) return OverScrollLinearLayoutManager(activity)
} }
override fun createAdapter(): GenreAdapter { override fun createAdapter(): GenreAdapter {

View file

@ -28,6 +28,7 @@ import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropM
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager
import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils
import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager
import kotlinx.android.synthetic.main.activity_playing_queue.* import kotlinx.android.synthetic.main.activity_playing_queue.*
/** /**
@ -73,7 +74,7 @@ class PlayingQueueFragment :
} }
override fun createLayoutManager(): LinearLayoutManager { override fun createLayoutManager(): LinearLayoutManager {
return LinearLayoutManager(requireContext()) return OverScrollLinearLayoutManager(requireContext())
} }
override fun createAdapter(): PlayingQueueAdapter { override fun createAdapter(): PlayingQueueAdapter {

View file

@ -13,6 +13,7 @@ import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.Playlist
import code.name.monkey.retromusic.mvp.presenter.PlaylistView import code.name.monkey.retromusic.mvp.presenter.PlaylistView
import code.name.monkey.retromusic.mvp.presenter.PlaylistsPresenter import code.name.monkey.retromusic.mvp.presenter.PlaylistsPresenter
import dev.olog.scrollhelper.layoutmanagers.OverScrollGridLayoutManager
import javax.inject.Inject import javax.inject.Inject
class PlaylistsFragment : class PlaylistsFragment :
@ -40,7 +41,7 @@ class PlaylistsFragment :
} }
override fun createLayoutManager(): GridLayoutManager { override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(requireContext(), 1) return OverScrollGridLayoutManager(requireContext(), 1)
} }
override fun createAdapter(): PlaylistAdapter { override fun createAdapter(): PlaylistAdapter {

View file

@ -14,6 +14,7 @@ import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.mvp.presenter.SongPresenter import code.name.monkey.retromusic.mvp.presenter.SongPresenter
import code.name.monkey.retromusic.mvp.presenter.SongView import code.name.monkey.retromusic.mvp.presenter.SongView
import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil
import dev.olog.scrollhelper.layoutmanagers.OverScrollGridLayoutManager
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@ -39,7 +40,7 @@ class SongsFragment :
} }
override fun createLayoutManager(): GridLayoutManager { override fun createLayoutManager(): GridLayoutManager {
return GridLayoutManager(requireActivity(), getGridSize()).apply { return OverScrollGridLayoutManager(requireActivity(), getGridSize()).apply {
spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int { override fun getSpanSize(position: Int): Int {
return if (position == 0) { return if (position == 0) {

View file

@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.settings
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference import androidx.preference.TwoStatePreference
import code.name.monkey.appthemehelper.ACCENT_COLORS import code.name.monkey.appthemehelper.ACCENT_COLORS
@ -54,9 +53,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme)) requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
} }
Handler().postDelayed({ requireActivity().recreate()
requireActivity().recreate()
}, 400)
true true
} }
} }
@ -78,9 +75,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
ThemeStore.editTheme(requireContext()).accentColor(color).commit() ThemeStore.editTheme(requireContext()).accentColor(color).commit()
if (VersionUtils.hasNougatMR()) if (VersionUtils.hasNougatMR())
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
Handler().postDelayed({ requireActivity().recreate()
requireActivity().recreate()
}, 400)
} }
} }
return@setOnPreferenceClickListener true return@setOnPreferenceClickListener true
@ -96,9 +91,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue("black")) requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue("black"))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
} }
Handler().postDelayed({ requireActivity().recreate()
requireActivity().recreate()
}, 400)
true true
} }
@ -109,9 +102,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
ThemeStore.prefs(requireContext()).edit().putBoolean("desaturated_color", desaturated) ThemeStore.prefs(requireContext()).edit().putBoolean("desaturated_color", desaturated)
.apply() .apply()
PreferenceUtil.getInstance(requireContext()).setDesaturatedColor(desaturated) PreferenceUtil.getInstance(requireContext()).setDesaturatedColor(desaturated)
Handler().postDelayed({ requireActivity().recreate()
requireActivity().recreate()
}, 400)
true true
} }

View file

@ -0,0 +1,29 @@
package code.name.monkey.retromusic.model;
public class Band {
public final int centerFreq;
public short level;
private final int[] freqRange;
public final int freqLow;
public final int freqHigh;
public final short rangeMin;
public final short rangeMax;
public Band(int centerFreq, short level, int[] freqRange, short rangeMin, short rangeMax) {
this.centerFreq = centerFreq;
this.level = level;
this.freqRange = freqRange;
if (0 < freqRange.length) {
freqLow = freqRange[0];
freqHigh = freqRange[freqRange.length - 1];
} else {
freqLow = 0;
freqHigh = 0;
}
this.rangeMin = rangeMin;
this.rangeMax = rangeMax;
}
}

View file

@ -68,6 +68,7 @@ import code.name.monkey.retromusic.appwidgets.AppWidgetCard;
import code.name.monkey.retromusic.appwidgets.AppWidgetClassic; import code.name.monkey.retromusic.appwidgets.AppWidgetClassic;
import code.name.monkey.retromusic.appwidgets.AppWidgetSmall; import code.name.monkey.retromusic.appwidgets.AppWidgetSmall;
import code.name.monkey.retromusic.appwidgets.AppWidgetText; import code.name.monkey.retromusic.appwidgets.AppWidgetText;
import code.name.monkey.retromusic.equalizer.AudioEffectsReceiver;
import code.name.monkey.retromusic.glide.BlurTransformation; import code.name.monkey.retromusic.glide.BlurTransformation;
import code.name.monkey.retromusic.glide.SongGlideRequest; import code.name.monkey.retromusic.glide.SongGlideRequest;
import code.name.monkey.retromusic.helper.ShuffleHelper; import code.name.monkey.retromusic.helper.ShuffleHelper;
@ -392,6 +393,11 @@ public class MusicService extends Service implements
registerHeadsetEvents(); registerHeadsetEvents();
registerBluetoothConnected(); registerBluetoothConnected();
Intent i = new Intent(this, AudioEffectsReceiver.class);
i.setAction(AudioEffectsReceiver.ACTION_OPEN_AUDIO_EFFECT_SESSION);
i.putExtra(AudioEffectsReceiver.EXTRA_AUDIO_SESSION_ID, getAudioSessionId());
sendBroadcast(i);
} }
@Override @Override
@ -416,7 +422,9 @@ public class MusicService extends Service implements
getContentResolver().unregisterContentObserver(mediaStoreObserver); getContentResolver().unregisterContentObserver(mediaStoreObserver);
PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this); PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this);
wakeLock.release(); wakeLock.release();
Intent i = new Intent(this, AudioEffectsReceiver.class);
i.setAction(AudioEffectsReceiver.ACTION_CLOSE_AUDIO_EFFECT_SESSION);
sendBroadcast(i);
sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED")); sendBroadcast(new Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED"));
} }

View file

@ -0,0 +1,16 @@
package code.name.monkey.retromusic.util
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
const val THREAD_COUNT = 3
/**
* Global executor pools for the whole application.
*
* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind
* webservice requests).
*/
open class AppExecutors constructor(
val ioContext: CoroutineDispatcher = Dispatchers.IO
)

View file

@ -18,11 +18,13 @@ import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import code.name.monkey.appthemehelper.util.ColorUtil.isColorLight import code.name.monkey.appthemehelper.util.ColorUtil.isColorLight
import code.name.monkey.appthemehelper.util.MaterialValueHelper.getPrimaryTextColor import code.name.monkey.appthemehelper.util.MaterialValueHelper.getPrimaryTextColor
import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.dimen
import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.views.PopupBackground import code.name.monkey.retromusic.views.PopupBackground
import me.zhanghai.android.fastscroll.FastScroller import me.zhanghai.android.fastscroll.FastScroller
import me.zhanghai.android.fastscroll.FastScrollerBuilder import me.zhanghai.android.fastscroll.FastScrollerBuilder
import me.zhanghai.android.fastscroll.PopupStyles import me.zhanghai.android.fastscroll.PopupStyles
import me.zhanghai.android.fastscroll.R
object ThemedFastScroller { object ThemedFastScroller {
fun create(view: ViewGroup): FastScroller { fun create(view: ViewGroup): FastScroller {
@ -37,6 +39,13 @@ object ThemedFastScroller {
popupText.setTextColor(textColor) popupText.setTextColor(textColor)
} }
fastScrollerBuilder.setPadding(
0,
view.context.dimen(R.dimen.toolbar_height) + view.context.dip(8),
0,
view.context.dimen(R.dimen.mini_player_height)
)
fastScrollerBuilder.setThumbDrawable( fastScrollerBuilder.setThumbDrawable(
TintHelper.createTintedDrawable( TintHelper.createTintedDrawable(
context, context,

View file

@ -1,59 +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.views;
import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
public class StatusBarView extends View {
public StatusBarView(@NonNull Context context) {
super(context);
init(context);
}
public StatusBarView(@NonNull Context context, @NonNull AttributeSet attrs) {
super(context, attrs);
init(context);
}
public StatusBarView(@NonNull Context context, @NonNull AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public static int getStatusBarHeight(@NonNull Resources r) {
int result = 0;
int resourceId = r.getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = r.getDimensionPixelSize(resourceId);
}
return result;
}
private void init(Context context) {
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), getStatusBarHeight(getResources()));
}
}

View file

@ -0,0 +1,30 @@
package code.name.monkey.retromusic.views
import android.content.Context
import android.util.AttributeSet
import android.view.View
class StatusBarView(
context: Context,
attrs: AttributeSet
) : View(context, attrs) {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
if (isInEditMode){
return
}
setOnApplyWindowInsetsListener { _, insets ->
val height = insets?.systemWindowInsetTop ?: 0
setHeight(height)
insets
}
}
private fun setHeight(px: Int) {
val params = layoutParams ?: return
params.height = px
layoutParams = params
}
}

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/custom_thumb_src" android:state_enabled="false" />
<item android:drawable="@drawable/custom_thumb_src" android:state_pressed="true" />
<item android:drawable="@drawable/custom_thumb_src" android:state_selected="true" />
<item android:drawable="@drawable/custom_thumb_src" />
</selector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#FFFFFF" />
<!--<solid android:color="#FFA036" />-->
<size
android:width="16dp"
android:height="16dp" />
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="rectangle">
<corners android:radius="35dp" /> <corners android:radius="4dp" />
<stroke <stroke
android:width="2dp" android:width="1dp"
android:color="@color/md_white_1000" /> android:color="?android:attr/textColorSecondary" />
</shape> </shape>

View file

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_keyboard_backspace_black_24dp"
app:title="@string/equalizer">
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/equalizerSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:padding="16dp"
android:textAppearance="@style/TextViewSubtitle2" />
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@drawable/line_button"
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="16dp"
android:text="@string/select_preset"
android:textAppearance="@style/TextViewSubtitle1" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/presets"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:spinnerMode="dialog" />
</LinearLayout>
<LinearLayout
android:id="@+id/frequencyBands"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="8dp"
android:paddingEnd="8dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_margin="16dp"
android:background="?android:attr/dividerHorizontal" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/bassBoost"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:padding="16dp"
android:text="@string/bass_boost"
android:textAppearance="@style/TextViewSubtitle1" />
<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/bassBoostStrength"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="1000"
android:maxHeight="3dp"
android:padding="16dp"
android:progressDrawable="@drawable/color_progress_seek"
android:splitTrack="false"
tools:progress="20" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/virtualizer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:padding="16dp"
android:text="@string/virtualizer"
android:textAppearance="@style/TextViewSubtitle1" />
<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/virtualizerStrength"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="1000"
android:maxHeight="3dp"
android:padding="16dp"
android:progressDrawable="@drawable/color_progress_seek"
android:splitTrack="false"
tools:progress="20" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="*Warning: It's alpha version. We don't recommend to use Equalizer, We believe without using Equalizer songs has better sound quality." />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -1,79 +1,71 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?colorSurface" android:background="?colorSurface">
android:orientation="vertical">
<!-- TODO in order to work, children has to be defined in reverse drawing order-->
<!-- TODO so: first fragment_container, than toolbar, than statusbar -->
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:id="@+id/fragment_container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/status_bar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<com.google.android.material.card.MaterialCardView
android:id="@+id/toolbarContainer"
app:layout_constraintTop_toBottomOf="@+id/status_bar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elevation="0dp" app:cardCornerRadius="8dp"
tools:ignore="UnusedAttribute"> app:cardUseCompatPadding="true"
app:layout_scrollFlags="scroll|enterAlways">
<include layout="@layout/status_bar" />
</FrameLayout>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:elevation="0dp"
app:elevation="0dp"
app:liftOnScroll="true">
<com.google.android.material.card.MaterialCardView
android:id="@+id/toolbarContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
app:cardUseCompatPadding="true"
app:layout_scrollFlags="scroll|enterAlways">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height"
android:background="?attr/colorSurface"
app:popupTheme="?attr/toolbarPopupTheme"
app:titleTextColor="?attr/colorControlNormal"
app:titleTextAppearance="@style/TextViewHeadline6"
tools:ignore="UnusedAttribute">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/appTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_name"
android:textColor="?attr/colorControlNormal"
android:textAppearance="@style/TextViewHeadline6" />
</androidx.appcompat.widget.Toolbar>
<ViewStub
android:id="@+id/cab_stub"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height" />
</FrameLayout>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout <FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> <androidx.appcompat.widget.Toolbar
</LinearLayout> android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height"
android:background="?attr/colorSurface"
app:popupTheme="?attr/toolbarPopupTheme"
app:titleTextColor="?attr/colorControlNormal"
app:titleTextAppearance="@style/TextViewHeadline6"
tools:ignore="UnusedAttribute">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/appTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/app_name"
android:textColor="?attr/colorControlNormal"
android:textAppearance="@style/TextViewHeadline6" />
</androidx.appcompat.widget.Toolbar>
<ViewStub
android:id="@+id/cab_stub"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height" />
</FrameLayout>
</com.google.android.material.card.MaterialCardView>
<include layout="@layout/status_bar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp"
tools:layout_height="24dp"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -97,7 +97,8 @@
app:retroCornerSize="36dp" app:retroCornerSize="36dp"
app:srcCompat="@drawable/ic_person_flat" app:srcCompat="@drawable/ic_person_flat"
app:strokeColor="?attr/colorSurface" app:strokeColor="?attr/colorSurface"
app:strokeWidth="2dp" /> app:strokeWidth="2dp"
tools:src="@tools:sample/avatars" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.textview.MaterialTextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textAppearance="@style/TextViewBody1"
tools:text="@tools:sample/full_names" />

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/frequency"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center"
android:maxLines="1" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="5" />
<TextView
android:id="@+id/dbLevel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center"
android:maxLines="1" />
</LinearLayout>

View file

@ -17,6 +17,7 @@
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/toolbar_height"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout

View file

@ -0,0 +1,318 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/equalizer_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_gravity="end|center_vertical"
android:padding="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/equalizer_preset_spinner"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:background="@drawable/line_button"
android:spinnerMode="dialog"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/equalizer_switch" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/equalizerContainer"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="4:3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/equalizer_preset_spinner">
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper
android:id="@+id/seekBar1Wrap"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/textView1"
app:layout_constraintEnd_toStartOf="@+id/seekBar2Wrap"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar
android:id="@+id/seekBar1"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="22dp"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:seekBarRotation="CW270"
tools:progress="100" />
</com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/seekBar1Wrap"
app:layout_constraintStart_toStartOf="@id/seekBar1Wrap"
app:layout_constraintTop_toBottomOf="@id/seekBar1Wrap"
tools:text="10000 Hz" />
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper
android:id="@+id/seekBar2Wrap"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/textView2"
app:layout_constraintEnd_toStartOf="@+id/seekBar3Wrap"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/seekBar1Wrap"
app:layout_constraintTop_toTopOf="parent">
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar
android:id="@+id/seekBar2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="22dp"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:seekBarRotation="CW270"
tools:progress="100" />
</com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/seekBar2Wrap"
app:layout_constraintStart_toStartOf="@id/seekBar2Wrap"
app:layout_constraintTop_toBottomOf="@id/seekBar2Wrap"
tools:text="10000 Hz" />
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper
android:id="@+id/seekBar3Wrap"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="8"
app:layout_constraintBottom_toTopOf="@id/textView3"
app:layout_constraintEnd_toStartOf="@+id/seekBar4Wrap"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/seekBar2Wrap"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteY="3dp">
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar
android:id="@+id/seekBar3"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="22dp"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:seekBarRotation="CW270" />
</com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/seekBar3Wrap"
app:layout_constraintStart_toStartOf="@id/seekBar3Wrap"
app:layout_constraintTop_toBottomOf="@id/seekBar3Wrap"
tools:text="10000 Hz" />
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper
android:id="@+id/seekBar4Wrap"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/textView4"
app:layout_constraintEnd_toStartOf="@+id/seekBar5Wrap"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/seekBar3Wrap"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteY="3dp">
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar
android:id="@+id/seekBar4"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="22dp"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:seekBarRotation="CW270" />
</com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/seekBar4Wrap"
app:layout_constraintStart_toStartOf="@id/seekBar4Wrap"
app:layout_constraintTop_toBottomOf="@id/seekBar4Wrap"
tools:text="10000 Hz" />
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper
android:id="@+id/seekBar5Wrap"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/textView5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/seekBar4Wrap"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteY="3dp">
<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar
android:id="@+id/seekBar5"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="22dp"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:seekBarRotation="CW270" />
</com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/seekBar5Wrap"
app:layout_constraintStart_toStartOf="@id/seekBar5Wrap"
app:layout_constraintTop_toBottomOf="@id/seekBar5Wrap"
tools:text="10000 Hz" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/equalizerContainer" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/bassBoostText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@string/bass_boost"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider"
app:layout_constraintVertical_bias="0.5" />
<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/bassController"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:layout_constraintBottom_toBottomOf="@id/bassBoostText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/bassBoostText"
app:layout_constraintTop_toTopOf="@id/bassBoostText" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/controllerText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@string/virtualizer"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/bassBoostText"
app:layout_constraintVertical_bias="0.5" />
<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/reverbController"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:thumb="@drawable/switch_thumb_material"
app:layout_constraintBottom_toBottomOf="@id/controllerText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/controllerText"
app:layout_constraintTop_toTopOf="@id/controllerText" />
<!--<code.name.monkey.retromusic.equalizer.AnalogController
android:id="@+id/controllerBass"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toStartOf="@+id/controller3D"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/equalizer_preset_spinner" />
<code.name.monkey.retromusic.equalizer.AnalogController
android:id="@+id/controller3D"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/controllerBass"
app:layout_constraintTop_toBottomOf="@id/equalizer_preset_spinner" />-->
<FrameLayout
android:id="@+id/equalizerBlocker"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.7"
android:background="@android:color/transparent"
android:clickable="true"
android:visibility="invisible" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -17,6 +17,7 @@
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/toolbar_height"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout

View file

@ -6,15 +6,16 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<!-- TODO note that recycler view has to cover the entire screen -->
<!-- TODO so has to be drawn under bottom navigation, toolbar, ecc, but has to be below statusbar-->
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:clipToPadding="false" android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation_fall_down" android:layoutAnimation="@anim/layout_animation_fall_down"
android:overScrollMode="never" android:overScrollMode="never"
android:scrollbars="none" android:scrollbars="none"
app:layout_dodgeInsetEdges="bottom"
tools:listitem="@layout/item_list" /> tools:listitem="@layout/item_list" />
<LinearLayout <LinearLayout

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/centerFreq"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="12Khz" />
<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/currentLevel"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
</LinearLayout>

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/hurtz"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingStart="8dp"
android:paddingEnd="0dp"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toStartOf="@id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="10000 Hz" />
<androidx.appcompat.widget.AppCompatSeekBar
android:id="@+id/seekbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxHeight="3dp"
android:progressDrawable="@drawable/color_progress_seek"
android:splitTrack="false"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/guideline"
app:layout_constraintTop_toTopOf="parent"
tools:progress="20" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="72dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -37,7 +37,7 @@
android:id="@+id/miniPlayerFragment" android:id="@+id/miniPlayerFragment"
android:name="code.name.monkey.retromusic.fragments.MiniPlayerFragment" android:name="code.name.monkey.retromusic.fragments.MiniPlayerFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="@dimen/mini_player_height"
tools:layout="@layout/fragment_mini_player" /> tools:layout="@layout/fragment_mini_player" />
</FrameLayout> </FrameLayout>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:liftOnScroll="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_keyboard_backspace_black_24dp"
app:title="@string/equalizer"
app:titleTextAppearance="@style/ToolbarTextAppearanceNormal" />
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/contentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -844,5 +844,7 @@
<string name="start_payment">Start payment</string> <string name="start_payment">Start payment</string>
<string name="pref_title_expand_now_playing_panel">Show now playing screen</string> <string name="pref_title_expand_now_playing_panel">Show now playing screen</string>
<string name="pref_summary_expand_now_playing_panel">Clicking on the notification will show now playing screen instead of the home screen</string> <string name="pref_summary_expand_now_playing_panel">Clicking on the notification will show now playing screen instead of the home screen</string>
<string name="custom">Custom</string>
<string name="select_preset">Select preset</string>
</resources> </resources>

View file

@ -2,15 +2,15 @@
<style name="Theme.RetroMusic" parent="Theme.RetroMusic.Base" /> <style name="Theme.RetroMusic" parent="Theme.RetroMusic.Base" />
<style name="Theme.RetroMusic.Light" parent="Theme.RetroMusic.Base.Light" > <style name="Theme.RetroMusic.Light" parent="Theme.RetroMusic.Base.Light">
<item name="android:windowBackground">@color/window_color_light</item> <item name="android:windowBackground">@color/window_color_light</item>
</style> </style>
<style name="Theme.RetroMusic.Black" parent="Theme.RetroMusic.Base.Black" > <style name="Theme.RetroMusic.Black" parent="Theme.RetroMusic.Base.Black">
<item name="android:windowBackground">@color/window_color_dark</item> <item name="android:windowBackground">@color/window_color_dark</item>
</style> </style>
<style name="Theme.RetroMusic.FollowSystem" parent="Theme.RetroMusic.Base.Adaptive" > <style name="Theme.RetroMusic.FollowSystem" parent="Theme.RetroMusic.Base.Adaptive">
<item name="android:windowBackground">@color/window_color</item> <item name="android:windowBackground">@color/window_color</item>
</style> </style>
@ -211,4 +211,10 @@
<item name="android:background">@color/md_white_1000</item> <item name="android:background">@color/md_white_1000</item>
<item name="android:textColor">@color/md_red_400</item> <item name="android:textColor">@color/md_red_400</item>
</style> </style>
<style name="AppRadioButton" parent="Widget.AppCompat.CompoundButton.RadioButton">
<item name="android:textSize">16dp</item>
<item name="android:textColor">#b4b4ba</item>
<item name="android:minHeight">40dp</item>
</style>
</resources> </resources>

View file

@ -10,22 +10,14 @@ import code.name.monkey.appthemehelper.ThemeStore
/** /**
* @author Aidan Follestad (afollestad) * @author Aidan Follestad (afollestad)
*/ */
class ATESwitch : SwitchCompat { class ATESwitch @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : SwitchCompat(context, attrs, defStyleAttr) {
constructor(context: Context) : super(context) { init {
init(context) ATH.setTint(this, ThemeStore.accentColor(getContext()))
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init(context)
}
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
init(context)
}
private fun init(context: Context) {
ATH.setTint(this, ThemeStore.accentColor(context))
} }
override fun isShown(): Boolean { override fun isShown(): Boolean {