Merge pull request #505 from h4h13/darktheme

Fix text views, update queue time
This commit is contained in:
Hemanth S 2019-09-03 23:25:18 +05:30 committed by GitHub
commit 074298dcb0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 367 additions and 196 deletions

View file

@ -27,14 +27,21 @@ class PlayingQueueActivity : AbsMusicServiceActivity() {
private var playingQueueAdapter: PlayingQueueAdapter? = null private var playingQueueAdapter: PlayingQueueAdapter? = null
private lateinit var linearLayoutManager: LinearLayoutManager private lateinit var linearLayoutManager: LinearLayoutManager
private val upNextAndQueueTime: String
get() = resources.getString(R.string.up_next) + "" + MusicUtil.getReadableDurationString(MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position)) protected fun getUpNextAndQueueTime(): String {
val duration = MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position)
return MusicUtil.buildInfoString(
resources.getString(R.string.up_next),
MusicUtil.getReadableDurationString(duration)
)
}
override fun onCreate( override fun onCreate(
savedInstanceState: Bundle? savedInstanceState: Bundle?
) { ) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_playing_queue) setContentView(code.name.monkey.retromusic.R.layout.activity_playing_queue)
setStatusbarColorAuto() setStatusbarColorAuto()
setNavigationbarColorAuto() setNavigationbarColorAuto()
@ -67,7 +74,7 @@ class PlayingQueueActivity : AbsMusicServiceActivity() {
this, this,
MusicPlayerRemote.playingQueue, MusicPlayerRemote.playingQueue,
MusicPlayerRemote.position, MusicPlayerRemote.position,
R.layout.item_queue) code.name.monkey.retromusic.R.layout.item_queue)
wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(playingQueueAdapter!!) wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(playingQueueAdapter!!)
linearLayoutManager = LinearLayoutManager(this) linearLayoutManager = LinearLayoutManager(this)
@ -107,7 +114,9 @@ class PlayingQueueActivity : AbsMusicServiceActivity() {
updateCurrentSong() updateCurrentSong()
} }
private fun updateCurrentSong() {} private fun updateCurrentSong() {
playerQueueSubHeader.text = getUpNextAndQueueTime()
}
override fun onPlayingMetaChanged() { override fun onPlayingMetaChanged() {
updateQueuePosition() updateQueuePosition()
@ -116,6 +125,7 @@ class PlayingQueueActivity : AbsMusicServiceActivity() {
private fun updateQueuePosition() { private fun updateQueuePosition() {
playingQueueAdapter!!.setCurrent(MusicPlayerRemote.position) playingQueueAdapter!!.setCurrent(MusicPlayerRemote.position)
resetToCurrentPosition() resetToCurrentPosition()
playerQueueSubHeader.text = getUpNextAndQueueTime()
} }
private fun updateQueue() { private fun updateQueue() {
@ -141,8 +151,6 @@ class PlayingQueueActivity : AbsMusicServiceActivity() {
recyclerViewDragDropManager = null recyclerViewDragDropManager = null
} }
if (wrappedAdapter != null) { if (wrappedAdapter != null) {
WrapperAdapterUtils.releaseAll(wrappedAdapter) WrapperAdapterUtils.releaseAll(wrappedAdapter)
wrappedAdapter = null wrappedAdapter = null
@ -152,7 +160,7 @@ class PlayingQueueActivity : AbsMusicServiceActivity() {
} }
private fun setupToolbar() { private fun setupToolbar() {
playerQueueSubHeader.text = upNextAndQueueTime playerQueueSubHeader.text = getUpNextAndQueueTime()
playerQueueSubHeader.setTextColor(ThemeStore.accentColor(this)) playerQueueSubHeader.setTextColor(ThemeStore.accentColor(this))
applyToolbar(toolbar) applyToolbar(toolbar)

View file

@ -22,9 +22,9 @@ import android.widget.Toast
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat
import code.name.monkey.retromusic.preferences.* import code.name.monkey.retromusic.preferences.*
import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.NavigationUtil
@ -32,7 +32,7 @@ import code.name.monkey.retromusic.util.NavigationUtil
* @author Hemanth S (h4h13). * @author Hemanth S (h4h13).
*/ */
abstract class AbsSettingsFragment : PreferenceFragmentCompat() { abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
internal fun showProToastAndNavigate(message: String) { internal fun showProToastAndNavigate(message: String) {
Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT).show()
@ -67,7 +67,7 @@ abstract class AbsSettingsFragment : PreferenceFragmentCompat() {
invalidateSettings() invalidateSettings()
} }
override fun onDisplayPreferenceDialog(preference: Preference) { /*override fun onDisplayPreferenceDialog(preference: Preference) {
var dialogFragment: DialogFragment? = null// Dialog creation could not be handled here. Try with the super method. var dialogFragment: DialogFragment? = null// Dialog creation could not be handled here. Try with the super method.
// The dialog was created (it was one of our custom Preferences), show the dialog for it // The dialog was created (it was one of our custom Preferences), show the dialog for it
when (preference) { when (preference) {
@ -89,5 +89,18 @@ abstract class AbsSettingsFragment : PreferenceFragmentCompat() {
// Dialog creation could not be handled here. Try with the super method. // Dialog creation could not be handled here. Try with the super method.
super.onDisplayPreferenceDialog(preference); super.onDisplayPreferenceDialog(preference);
} }
}*/
override fun onCreatePreferenceDialog(preference: Preference): DialogFragment? {
return when (preference) {
is LibraryPreference -> LibraryPreferenceDialog.newInstance(preference.key)
is NowPlayingScreenPreference -> NowPlayingScreenPreferenceDialog.newInstance(preference.key)
is AlbumCoverStylePreference -> AlbumCoverStylePreferenceDialog.newInstance(preference.key)
is MaterialListPreference -> {
preference.entries
MaterialListPreferenceDialog.newInstance(preference)
}
is BlacklistPreference -> BlacklistPreferenceDialog.newInstance()
else -> super.onCreatePreferenceDialog(preference)
}
} }
} }

View file

@ -15,15 +15,15 @@
package code.name.monkey.retromusic.fragments.settings package code.name.monkey.retromusic.fragments.settings
import android.graphics.Color import android.graphics.Color
import android.graphics.Color.BLUE
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference import androidx.preference.TwoStatePreference
import code.name.monkey.appthemehelper.* import code.name.monkey.appthemehelper.ACCENT_COLORS
import code.name.monkey.appthemehelper.ACCENT_COLORS_SUB
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEColorPreference import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEColorPreference
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory
import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
@ -49,45 +49,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
override fun invalidateSettings() { override fun invalidateSettings() {
val categoryColor: ATEPreferenceCategory? = findPreference("category_color")
val primaryColorPref = ATEColorPreference(preferenceScreen.context)
val primaryColor = ThemeStore.primaryColor(requireContext())
primaryColorPref.apply {
key = "primary_color"
isPersistent = false
setSummary(R.string.primary_color_desc)
setTitle(R.string.primary_color)
isCopyingEnabled = true
setIcon(R.drawable.ic_colorize_white_24dp)
setColor(primaryColor, ColorUtil.darkenColor(primaryColor))
setOnPreferenceClickListener {
materialDialog = MaterialDialog(requireContext(), BottomSheet()).show {
title(R.string.primary_color)
positiveButton(R.string.set)
colorChooser(initialSelection = BLUE,
allowCustomArgb = true,
colors = PRIMARY_COLORS,
subColors = PRIMARY_COLORS_SUB) { _, color ->
val theme = if (ColorUtil.isColorLight(color))
PreferenceUtil.getThemeResFromPrefValue("light")
else
PreferenceUtil.getThemeResFromPrefValue("dark")
ThemeStore.editTheme(requireContext()).activityTheme(theme).primaryColor(color).commit()
if (VersionUtils.hasNougatMR())
DynamicShortcutManager(context).updateDynamicShortcuts()
requireActivity().recreate()
}
}
true
}
}
val generalTheme: Preference? = findPreference("general_theme") val generalTheme: Preference? = findPreference("general_theme")
generalTheme?.let { generalTheme?.let {
setSummary(it) setSummary(it)
it.setOnPreferenceChangeListener { _, newValue -> it.setOnPreferenceChangeListener { _, newValue ->
@ -100,17 +62,20 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
setSummary(generalTheme, newValue) setSummary(generalTheme, newValue)
when (theme) { val color = when (theme) {
"light" -> ThemeStore.editTheme(requireContext()).primaryColor(Color.WHITE).commit() "light" -> Color.WHITE
"black" -> ThemeStore.editTheme(requireContext()).primaryColor(Color.BLACK).commit() "black" -> Color.BLACK
"dark" -> ThemeStore.editTheme(requireContext()).primaryColor(ContextCompat.getColor(requireContext(), R.color.md_grey_900)).commit() "dark" -> ContextCompat.getColor(requireContext(), R.color.md_grey_900)
"color" -> ThemeStore.editTheme(requireContext()).primaryColor(ContextCompat.getColor(requireContext(), R.color.md_blue_grey_800)).commit() else -> Color.WHITE
} }
ThemeStore.editTheme(requireContext()) ThemeStore.editTheme(requireContext())
.activityTheme(PreferenceUtil.getThemeResFromPrefValue(theme)) .activityTheme(PreferenceUtil.getThemeResFromPrefValue(theme))
.primaryColor(color)
.commit() .commit()
ThemeStore.markChanged(requireContext())
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme)) requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
@ -129,10 +94,6 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
title(R.string.accent_color) title(R.string.accent_color)
positiveButton(R.string.set) positiveButton(R.string.set)
colorChooser(colors = ACCENT_COLORS, allowCustomArgb = true, subColors = ACCENT_COLORS_SUB) { _, color -> colorChooser(colors = ACCENT_COLORS, allowCustomArgb = true, subColors = ACCENT_COLORS_SUB) { _, color ->
/*var colorFinal = Color.BLACK;
if (!ColorUtil.isColorSaturated(color)) {
colorFinal = color
}*/
ThemeStore.editTheme(requireContext()).accentColor(color).commit() ThemeStore.editTheme(requireContext()).accentColor(color).commit()
if (VersionUtils.hasNougatMR()) if (VersionUtils.hasNougatMR())
DynamicShortcutManager(requireContext()).updateDynamicShortcuts() DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
@ -154,10 +115,6 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
true true
} }
} }
if (PreferenceUtil.getInstance().generalTheme == R.style.Theme_RetroMusic_Color && App.isProVersion) {
categoryColor?.addPreference(primaryColorPref)
}
} }
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

View file

@ -78,20 +78,23 @@ class MaterialListPreferenceDialog : PreferenceDialogFragmentCompat() {
val entries = arguments?.getStringArrayList(EXTRA_ENTRIES) val entries = arguments?.getStringArrayList(EXTRA_ENTRIES)
val entriesValues = arguments?.getStringArrayList(EXTRA_ENTRIES_VALUES) val entriesValues = arguments?.getStringArrayList(EXTRA_ENTRIES_VALUES)
materialDialog = MaterialDialog(activity!!, BottomSheet()) materialDialog = MaterialDialog(requireContext(), BottomSheet())
.show { .title(text = materialListPreference.title.toString())
title(text = materialListPreference.title.toString()) .positiveButton(R.string.set)
positiveButton(R.string.set) .listItemsSingleChoice(items = entries, initialSelection = position, waitForPositiveButton = true) { _, index, _ ->
listItemsSingleChoice(items = entries, initialSelection = position, waitForPositiveButton = true) { _, index, _ ->
materialListPreference.callChangeListener(entriesValues!![index]) materialListPreference.callChangeListener(entriesValues!![index])
materialListPreference.setCustomValue(entriesValues[index]) materialListPreference.setCustomValue(entriesValues[index])
materialListPreference.summary = entries!![index] materialListPreference.summary = entries!![index]
dismiss() dismiss()
} }
}
return materialDialog return materialDialog
} }
override fun onDestroyView() {
super.onDestroyView()
materialDialog.dismiss()
}
private lateinit var materialDialog: MaterialDialog private lateinit var materialDialog: MaterialDialog
override fun onDialogClosed(positiveResult: Boolean) { override fun onDialogClosed(positiveResult: Boolean) {

View file

@ -150,16 +150,12 @@ public final class PreferenceUtil {
} }
@StyleRes @StyleRes
public static int getThemeResFromPrefValue(String themePrefValue) { public static int getThemeResFromPrefValue(@NonNull String themePrefValue) {
switch (themePrefValue) { switch (themePrefValue) {
case "light": case "light":
return R.style.Theme_RetroMusic_Light; return R.style.Theme_RetroMusic_Light;
case "color":
return R.style.Theme_RetroMusic_Color;
case "black": case "black":
return R.style.Theme_RetroMusic_Black; return R.style.Theme_RetroMusic_Black;
case "daynight":
return R.style.Theme_RetroMusic_DayNight;
case "dark": case "dark":
default: default:
return R.style.Theme_RetroMusic; return R.style.Theme_RetroMusic;

View file

@ -37,7 +37,7 @@ import code.name.monkey.retromusic.R;
public class RetroColorUtil { public class RetroColorUtil {
public static int toolbarColor(@NonNull Context context) { public static int toolbarColor(@NonNull Context context) {
int color = ThemeStore.Companion.primaryColor(context); int color = ThemeStore.Companion.primaryColor(context);
if (ATHUtil.INSTANCE.isWindowBackgroundDark(context) && PreferenceUtil.getInstance().getGeneralTheme() != R.style.Theme_RetroMusic_Color) { if (ATHUtil.INSTANCE.isWindowBackgroundDark(context)) {
return ATHUtil.INSTANCE.resolveColor(context, R.attr.cardBackgroundColor); return ATHUtil.INSTANCE.resolveColor(context, R.attr.cardBackgroundColor);
} else { } else {
return color; return color;

0
app/src/main/res/font/circular_std_black.otf Executable file → Normal file
View file

0
app/src/main/res/font/circular_std_book.otf Executable file → Normal file
View file

0
app/src/main/res/font/circular_std_medium.otf Executable file → Normal file
View file

View file

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.RetroMusic.DayNight" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="md_corner_radius">16dp</item>
<item name="md_font_title">@font/circular</item>
<item name="md_font_body">@font/circular</item>
<item name="md_font_button">@font/circular</item>
<item name="md_color_button_text">@color/md_white_1000</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="windowActionBarOverlay">true</item>
<item name="roundSelector">@drawable/round_selector_dark</item>
<item name="rectSelector">@drawable/rect_selector_dark</item>
<item name="rectSelectorStrong">@drawable/rect_selector_strong_dark</item>
<item name="cardBackgroundColor">@color/md_grey_800</item>
<item name="defaultFooterColor">@color/md_grey_800</item>
<item name="dividerColor">@color/md_grey_800</item>
<item name="iconColor">@color/ate_secondary_text_dark</item>
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat</item>
<!-- just in case-->
<item name="android:windowBackground">@color/md_grey_900</item>
<item name="colorAccent">@android:color/white</item>
<item name="colorPrimary">@color/md_grey_900</item>
<!-- necessary to find the overflow button later in the layout-->
<item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
<item name="bottomSheetDialogTheme">@style/BottomSheetDialog</item>
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowExitTransition">@transition/grid_exit</item>
<item name="android:windowEnterTransition">@transition/grid_exit</item>
<item name="android:windowSharedElementEnterTransition">@transition/grid_exit</item>
<item name="android:windowSharedElementExitTransition">@transition/grid_exit</item>
<item name="android:fontFamily">@font/circular</item>
<item name="android:textColorPrimary">@color/md_white_1000</item>
</style>
</resources>

View file

@ -44,7 +44,6 @@
<item>@string/light_theme_name</item> <item>@string/light_theme_name</item>
<item>@string/dark_theme_name</item> <item>@string/dark_theme_name</item>
<item>@string/black_theme_name</item> <item>@string/black_theme_name</item>
<item>@string/color_theme_name</item>
</string-array> </string-array>
<string-array name="pref_grid_style_list_titles"> <string-array name="pref_grid_style_list_titles">
@ -96,7 +95,6 @@
<item>light</item> <item>light</item>
<item>dark</item> <item>dark</item>
<item>black</item> <item>black</item>
<item>color</item>
</string-array> </string-array>
<array name="pref_auto_download_images_values"> <array name="pref_auto_download_images_values">

View file

@ -6,8 +6,6 @@
<style name="Theme.RetroMusic.Black" parent="Theme.RetroMusic.Base.Black" /> <style name="Theme.RetroMusic.Black" parent="Theme.RetroMusic.Base.Black" />
<style name="Theme.RetroMusic.Color" parent="Theme.RetroMusic.Base.Color" />
<style name="Theme.RetroMusic.Notification" parent="@android:style/TextAppearance.StatusBar.EventContent" /> <style name="Theme.RetroMusic.Notification" parent="@android:style/TextAppearance.StatusBar.EventContent" />
<style name="Theme.RetroMusic.Notification.Title" parent="@android:style/TextAppearance.StatusBar.EventContent.Title" /> <style name="Theme.RetroMusic.Notification.Title" parent="@android:style/TextAppearance.StatusBar.EventContent.Title" />

View file

@ -51,17 +51,6 @@
<item name="materialAlertDialogTheme">@style/MaterialAlertDialogTheme</item> <item name="materialAlertDialogTheme">@style/MaterialAlertDialogTheme</item>
</style> </style>
<style name="Theme.RetroMusic.Base.Color" parent="@style/Theme.RetroMusic.Base">
<item name="colorPrimary">@color/md_deep_purple_A400</item>
<item name="android:colorPrimary">?colorPrimary</item>
<item name="android:windowBackground">?colorPrimary</item>
<item name="md_color_button_text">@color/md_white_1000</item>
<item name="windowActionBar">false</item>
</style>
<style name="Theme.RetroMusic.Base.Black" parent="@style/Theme.RetroMusic.Base"> <style name="Theme.RetroMusic.Base.Black" parent="@style/Theme.RetroMusic.Base">
<item name="dividerColor">@color/dark_color</item> <item name="dividerColor">@color/dark_color</item>

View file

@ -2,7 +2,7 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <androidx.preference.PreferenceScreen 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">
<code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory android:title="@string/pref_header_general"> <code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory android:title="@string/pref_header_general">
<code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference <code.name.monkey.retromusic.preferences.MaterialListPreference
android:defaultValue="dark" android:defaultValue="dark"
android:entries="@array/pref_general_theme_list_titles" android:entries="@array/pref_general_theme_list_titles"
android:entryValues="@array/pref_general_theme_list_values" android:entryValues="@array/pref_general_theme_list_values"

View file

@ -0,0 +1,51 @@
/*
* 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.appthemehelper.common.prefs.supportv7;
import android.content.Context;
import android.util.AttributeSet;
import androidx.preference.ListPreference;
import code.name.monkey.appthemehelper.R;
public class ATEListPreference extends ListPreference {
public ATEListPreference(Context context) {
super(context);
init(context, null);
}
public ATEListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ATEListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
public ATEListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
setLayoutResource(R.layout.ate_preference_custom_support);
if (getSummary() == null || getSummary().toString().trim().isEmpty())
setSummary("%s");
}
}

View file

@ -1,38 +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.appthemehelper.common.prefs.supportv7
import android.content.Context
import android.graphics.PorterDuff
import android.util.AttributeSet
import androidx.preference.ListPreference
import code.name.monkey.appthemehelper.R
import code.name.monkey.appthemehelper.ThemeStore
class ATEListPreference @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
defStyleRes: Int = 0
) : ListPreference(context, attrs, defStyleAttr, defStyleRes) {
init {
icon?.setColorFilter(ThemeStore.textColorSecondary(context), PorterDuff.Mode.SRC_IN)
layoutResource = R.layout.ate_preference_custom_support
if (summary == null || summary.toString().trim { it <= ' ' }.isEmpty())
summary = "%s"
}
}

View file

@ -0,0 +1,61 @@
/*
* 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.appthemehelper.common.prefs.supportv7
import androidx.fragment.app.DialogFragment
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs.ATEListPreferenceDialogFragmentCompat
import code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs.ATEPreferenceDialogFragment
/**
* @author Karim Abou Zeid (kabouzeid)
*/
abstract class ATEPreferenceFragmentCompat : PreferenceFragmentCompat() {
override fun onDisplayPreferenceDialog(preference: Preference) {
if (callbackFragment is PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback) {
(callbackFragment as PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback).onPreferenceDisplayDialog(this, preference)
return
}
if (activity is PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback) {
(activity as PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback).onPreferenceDisplayDialog(this, preference)
return
}
if (fragmentManager!!.findFragmentByTag("android.support.v7.preference.PreferenceFragment.DIALOG") == null) {
val dialogFragment = onCreatePreferenceDialog(preference)
if (dialogFragment != null) {
dialogFragment.setTargetFragment(this, 0)
dialogFragment.show(fragmentManager!!, "android.support.v7.preference.PreferenceFragment.DIALOG")
return
}
}
super.onDisplayPreferenceDialog(preference)
}
open fun onCreatePreferenceDialog(preference: Preference): DialogFragment? {
if (preference is ATEListPreference) {
return ATEListPreferenceDialogFragmentCompat.newInstance(preference.getKey())
} else if (preference is ATEDialogPreference) {
return ATEPreferenceDialogFragment.newInstance(preference.getKey())
}
return null
}
}

View file

@ -0,0 +1,86 @@
/*
* 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.appthemehelper.common.prefs.supportv7.dialogs;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.preference.ListPreference;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference;
/**
* Created by hemanths on 2019-09-03.
*/
public class ATEListPreferenceDialogFragmentCompat extends ATEPreferenceDialogFragment {
private int mClickedDialogEntryIndex;
@NonNull
public static ATEListPreferenceDialogFragmentCompat newInstance(@NonNull String key) {
final ATEListPreferenceDialogFragmentCompat fragment = new ATEListPreferenceDialogFragmentCompat();
final Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
private ATEListPreference getListPreference() {
return (ATEListPreference) getPreference();
}
@Override
protected void onPrepareDialogBuilder(@NonNull MaterialAlertDialogBuilder builder) {
super.onPrepareDialogBuilder(builder);
final ListPreference preference = getListPreference();
if (preference.getEntries() == null || preference.getEntryValues() == null) {
throw new IllegalStateException(
"ListPreference requires an entries array and an entryValues array.");
}
mClickedDialogEntryIndex = preference.findIndexOfValue(preference.getValue());
builder.setSingleChoiceItems(preference.getEntries(), mClickedDialogEntryIndex, (dialogInterface, i) -> {
mClickedDialogEntryIndex = i;
});
builder.setPositiveButton("Ok", null);
builder.setNegativeButton("", null);
builder.setNeutralButton("", null);
}
@Override
public void onDialogClosed(boolean positiveResult) {
final ListPreference preference = getListPreference();
if (positiveResult && mClickedDialogEntryIndex >= 0 &&
preference.getEntryValues() != null) {
String value = preference.getEntryValues()[mClickedDialogEntryIndex].toString();
if (preference.callChangeListener(value)) {
preference.setValue(value);
}
}
}
/* @Override
public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
mClickedDialogEntryIndex = which;
onClick(dialog, DialogAction.POSITIVE);
dismiss();
return true;
}*/
}

View file

@ -0,0 +1,99 @@
/*
* 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.appthemehelper.common.prefs.supportv7.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Window;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.preference.DialogPreference;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ATEPreferenceDialogFragment extends DialogFragment {
protected static final String ARG_KEY = "key";
private DialogPreference mPreference;
public static ATEPreferenceDialogFragment newInstance(String key) {
ATEPreferenceDialogFragment fragment = new ATEPreferenceDialogFragment();
Bundle b = new Bundle(1);
b.putString(ARG_KEY, key);
fragment.setArguments(b);
return fragment;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fragment rawFragment = this.getTargetFragment();
if (!(rawFragment instanceof DialogPreference.TargetFragment)) {
throw new IllegalStateException("Target fragment must implement TargetFragment interface");
} else {
DialogPreference.TargetFragment fragment = (DialogPreference.TargetFragment) rawFragment;
String key = this.getArguments().getString(ARG_KEY);
this.mPreference = (DialogPreference) fragment.findPreference(key);
}
}
@NonNull
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
MaterialAlertDialogBuilder materialDialog = new MaterialAlertDialogBuilder(requireActivity())
.setTitle(mPreference.getTitle())
.setIcon(mPreference.getIcon())
.setMessage(mPreference.getDialogMessage())
.setPositiveButton(mPreference.getPositiveButtonText(), (dialogInterface, i) -> {
onDialogClosed(true);
})
.setNegativeButton(mPreference.getNegativeButtonText(), (dialogInterface, i) -> {
onDialogClosed(false);
});
this.onPrepareDialogBuilder(materialDialog);
AlertDialog dialog = materialDialog.create();
if (this.needInputMethod()) {
this.requestInputMethod(dialog);
}
return dialog;
}
public DialogPreference getPreference() {
return this.mPreference;
}
protected void onPrepareDialogBuilder(MaterialAlertDialogBuilder builder) {
}
protected boolean needInputMethod() {
return false;
}
private void requestInputMethod(Dialog dialog) {
Window window = dialog.getWindow();
window.setSoftInputMode(5);
}
public void onDialogClosed(boolean positiveResult) {
}
}

View file

@ -3,7 +3,6 @@
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="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:baselineAligned="false" android:baselineAligned="false"
android:gravity="center_vertical" android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight" android:minHeight="?android:attr/listPreferredItemHeight"
@ -35,13 +34,13 @@
<code.name.monkey.appthemehelper.common.views.ATEPrimaryTextView <code.name.monkey.appthemehelper.common.views.ATEPrimaryTextView
android:id="@android:id/title" android:id="@android:id/title"
style="@style/TextViewSubtitle1"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:ellipsize="marquee" android:ellipsize="marquee"
android:fadingEdge="horizontal" android:fadingEdge="horizontal"
style="@style/TextAppearance.MaterialComponents.Subtitle1"
android:singleLine="true" android:singleLine="true"
tools:text="Title" /> tools:text="Title" />
@ -54,7 +53,7 @@
android:layout_alignLeft="@android:id/title" android:layout_alignLeft="@android:id/title"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:maxLines="4" android:maxLines="4"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body2" android:textAppearance="@style/TextViewBody2"
tools:text="Summary" /> tools:text="Summary" />
</RelativeLayout> </RelativeLayout>

View file

@ -54,8 +54,8 @@
android:layout_alignLeft="@android:id/title" android:layout_alignLeft="@android:id/title"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:maxLines="4" android:maxLines="4"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body2" android:textAppearance="@style/TextViewBody2"
tools:text="Summary" /> tools:text="I have one solution for you.you can change font size for specific preference by managing layout file." />
</RelativeLayout> </RelativeLayout>

View file

@ -24,18 +24,18 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="0dip"> android:padding="0dip">
<TextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/custom_list_view_row_text_view" android:id="@+id/custom_list_view_row_text_view"
style="@style/TextAppearance.MaterialComponents.Subtitle1" android:layout_width="match_parent"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_height="22dip"
android:gravity="center_vertical" android:gravity="center_vertical"
android:textAppearance="@style/TextViewSubtitle1"
android:textColor="#000000" /> android:textColor="#000000" />
<TextView <code.name.monkey.appthemehelper.common.views.ATESecondaryTextView
android:id="@+id/custom_list_view_row_subtext_view" android:id="@+id/custom_list_view_row_subtext_view"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="18dip" android:layout_height="wrap_content"
android:gravity="center_vertical" android:gravity="center_vertical"
android:textColor="#000000" android:textColor="#000000"
android:textSize="12sp" /> android:textSize="12sp" />