diff --git a/app/build.gradle b/app/build.gradle index 73138d84..d3cd0119 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,6 +124,10 @@ dependencies { implementation 'androidx.navigation:navigation-ui-ktx:2.3.2' implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + + + //Appearance + implementation 'com.github.madrapps:pikolo:2.0.1' implementation 'com.google.android.material:material:1.3.0-alpha04' // JSON parser diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f3b62cb..31ebd398 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,14 +51,14 @@ + android:theme="@style/DarkTheme"/> + android:theme="@style/DarkTheme"> diff --git a/app/src/main/java/com/vanced/manager/ui/core/SplashScreenActivity.kt b/app/src/main/java/com/vanced/manager/ui/core/SplashScreenActivity.kt index 5131bd7b..871f07e9 100644 --- a/app/src/main/java/com/vanced/manager/ui/core/SplashScreenActivity.kt +++ b/app/src/main/java/com/vanced/manager/ui/core/SplashScreenActivity.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.vanced.manager.R import com.vanced.manager.ui.MainActivity import com.vanced.manager.ui.WelcomeActivity diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt new file mode 100644 index 00000000..bb1b2a44 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialButton.kt @@ -0,0 +1,37 @@ +package com.vanced.manager.ui.core + +import android.content.Context +import android.util.AttributeSet +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils +import com.google.android.material.button.MaterialButton +import com.vanced.manager.R +import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.Extensions.lifecycleOwner +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor + +class ThemedMaterialButton @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, + defStyleAttr: Int = 0 +) : MaterialButton(context, attributeSet, defStyleAttr) { + + init { + setBgColor(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + context.lifecycleOwner()?.let { owner -> + accentColor.observe(owner) { color -> + setBgColor(color.toInt()) + } + } + } + + private fun setBgColor(color: Int) { + setBackgroundColor(color) + if (ColorUtils.calculateLuminance(color) < 0.75) { + setTextColor(ResourcesCompat.getColor(resources, R.color.White, null)) + } else { + setTextColor(ResourcesCompat.getColor(resources, R.color.Black, null)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt new file mode 100644 index 00000000..4f419cf5 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialCheckbox.kt @@ -0,0 +1,25 @@ +package com.vanced.manager.ui.core + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import com.google.android.material.checkbox.MaterialCheckBox +import com.vanced.manager.R +import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.Extensions.lifecycleOwner +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor + +class ThemedMaterialCheckbox @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, +) : MaterialCheckBox(context, attributeSet, R.attr.checkboxStyle) { + init { + buttonTintList = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + context.lifecycleOwner()?.let { owner -> + accentColor.observe(owner) { color -> + buttonTintList = ColorStateList.valueOf(color.toInt()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt new file mode 100644 index 00000000..fec702cb --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedMaterialRadioButton.kt @@ -0,0 +1,25 @@ +package com.vanced.manager.ui.core + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import com.google.android.material.radiobutton.MaterialRadioButton +import com.vanced.manager.R +import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.Extensions.lifecycleOwner +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor + +class ThemedMaterialRadioButton @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, +) : MaterialRadioButton(context, attributeSet, R.attr.radioButtonStyle) { + init { + buttonTintList = ColorStateList.valueOf(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + context.lifecycleOwner()?.let { owner -> + accentColor.observe(owner) { color -> + buttonTintList = ColorStateList.valueOf(color.toInt()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt new file mode 100644 index 00000000..0211fd9b --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedOutlinedMaterialButton.kt @@ -0,0 +1,24 @@ +package com.vanced.manager.ui.core + +import android.content.Context +import android.util.AttributeSet +import com.google.android.material.button.MaterialButton +import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.Extensions.lifecycleOwner +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor + +class ThemedOutlinedMaterialButton @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, + defStyleAttr: Int = 0 +) : MaterialButton(context, attributeSet, defStyleAttr) { + init { + setTextColor(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + context.lifecycleOwner()?.let { owner -> + accentColor.observe(owner) { color -> + setTextColor(color.toInt()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt new file mode 100644 index 00000000..1e15464d --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedSwitchCompat.kt @@ -0,0 +1,38 @@ +package com.vanced.manager.ui.core + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.util.AttributeSet +import androidx.appcompat.widget.SwitchCompat +import androidx.core.graphics.ColorUtils +import androidx.core.graphics.drawable.DrawableCompat +import com.vanced.manager.R +import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.Extensions.lifecycleOwner +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor + +class ThemedSwitchCompat @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, +) : SwitchCompat(context, attributeSet, R.attr.switchStyle) { + + private val states = arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)) + + init { + setSwitchColors(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + context.lifecycleOwner()?.let { owner -> + accentColor.observe(owner) { color -> + setSwitchColors(color.toInt()) + } + } + } + + private fun setSwitchColors(color: Int) { + val thumbColors = intArrayOf(Color.LTGRAY, color) + val trackColors = intArrayOf(Color.GRAY, ColorUtils.setAlphaComponent(color, 70)) + DrawableCompat.setTintList(DrawableCompat.wrap(thumbDrawable), ColorStateList(states, thumbColors)) + DrawableCompat.setTintList(DrawableCompat.wrap(trackDrawable), ColorStateList(states, trackColors)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt b/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt new file mode 100644 index 00000000..ddc3f287 --- /dev/null +++ b/app/src/main/java/com/vanced/manager/ui/core/ThemedTextView.kt @@ -0,0 +1,24 @@ +package com.vanced.manager.ui.core + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import com.vanced.manager.utils.Extensions.getDefaultPrefs +import com.vanced.manager.utils.Extensions.lifecycleOwner +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor + +class ThemedTextView @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatTextView(context, attributeSet, defStyleAttr) { + init { + setTextColor(context.getDefaultPrefs().getInt("manager_accent", defAccentColor)) + context.lifecycleOwner()?.let { owner -> + accentColor.observe(owner) { color -> + setTextColor(color.toInt()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt index 53635097..f1de4c20 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/AppVersionSelectorDialog.kt @@ -10,6 +10,7 @@ import com.vanced.manager.R import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.databinding.DialogBottomRadioButtonBinding +import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.Extensions.getDefaultPrefs @@ -73,7 +74,7 @@ class AppVersionSelectorDialog : BindingBottomSheetDialogFragment - MaterialRadioButton(requireActivity()).apply { + ThemedMaterialRadioButton(requireActivity()).apply { text = version tag = version textSize = 18f diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt index bca19100..6d4f705e 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerAccentColorDialog.kt @@ -1,16 +1,23 @@ package com.vanced.manager.ui.dialogs +import android.graphics.Color import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast import androidx.core.content.edit import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.google.android.material.radiobutton.MaterialRadioButton -import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment +import com.madrapps.pikolo.listeners.OnColorSelectionListener +import com.vanced.manager.R +import com.vanced.manager.core.ui.base.BindingDialogFragment import com.vanced.manager.databinding.DialogManagerAccentColorBinding -import com.vanced.manager.utils.Extensions.getCheckedButtonTag +import com.vanced.manager.utils.Extensions.toHex +import com.vanced.manager.utils.ThemeHelper.defAccentColor +import com.vanced.manager.utils.ThemeHelper.mutableAccentColor -class ManagerAccentColorDialog : BindingBottomSheetDialogFragment() { +class ManagerAccentColorDialog : BindingDialogFragment() { companion object { fun newInstance(): ManagerAccentColorDialog = ManagerAccentColorDialog().apply { @@ -28,21 +35,52 @@ class ManagerAccentColorDialog : BindingBottomSheetDialogFragment(accent).isChecked = true + val accent = prefs.getInt("manager_accent", defAccentColor) + hexEdittext.setText(accent.toHex(), TextView.BufferType.EDITABLE) + accentPicker.apply { + setColor(accent) + setColorSelectionListener(object : OnColorSelectionListener { + override fun onColorSelected(color: Int) { + mutableAccentColor.value = color + hexEdittext.setText(color.toHex(), TextView.BufferType.EDITABLE) + } + + override fun onColorSelectionEnd(color: Int) { + return + } + + override fun onColorSelectionStart(color: Int) { + return + } + + }) + } accentSave.setOnClickListener { - val newPref = binding.accentRadiogroup.getCheckedButtonTag() - if (accent != newPref) { - prefs.edit { putString("manager_accent", newPref) } - dismiss() - requireActivity().recreate() - } else { - dismiss() + try { + val colorFromEdittext = Color.parseColor(hexEdittext.text.toString()) + mutableAccentColor.value = colorFromEdittext + prefs.edit { putInt("manager_accent", colorFromEdittext) } + } catch (e: IllegalArgumentException) { + Log.d("VMTheme", getString(R.string.failed_accent)) + Toast.makeText(requireActivity(), getString(R.string.failed_accent), Toast.LENGTH_SHORT).show() + return@setOnClickListener } + + dismiss() + } + accentSave.setOnClickListener { + mutableAccentColor.value = accent + dismiss() + } + accentReset.setOnClickListener { + prefs.edit { putInt("manager_accent", defAccentColor) } + mutableAccentColor.value = defAccentColor + dismiss() } } } diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt index b967f254..4ed9ef16 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/ManagerLanguageDialog.kt @@ -7,10 +7,10 @@ import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import androidx.core.content.edit import androidx.preference.PreferenceManager.getDefaultSharedPreferences -import com.google.android.material.radiobutton.MaterialRadioButton import com.vanced.manager.BuildConfig.MANAGER_LANGUAGES import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.databinding.DialogManagerLanguageBinding +import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.LanguageHelper.getLanguageFormat @@ -41,7 +41,7 @@ class ManagerLanguageDialog : BindingBottomSheetDialogFragment(language).isChecked = true + root.findViewWithTag(language).isChecked = true languageSave.setOnClickListener { val newPref = binding.languageRadiogroup.getCheckedButtonTag() if (language != newPref) { @@ -57,7 +57,7 @@ class ManagerLanguageDialog : BindingBottomSheetDialogFragment - MaterialRadioButton(requireActivity()).apply { + ThemedMaterialRadioButton(requireActivity()).apply { text = getLanguageFormat(requireActivity(), lang) textSize = 18f tag = lang diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt index 8289b95c..b328a45a 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/URLChangeDialog.kt @@ -37,7 +37,6 @@ class URLChangeDialog : BindingDialogFragment() { private fun bindData() { with(binding) { - urlInput.setText( if (arguments != null) { arguments?.getString("url") diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt index f132a544..efab39c7 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedLanguageSelectionDialog.kt @@ -16,6 +16,7 @@ import com.vanced.manager.R import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.databinding.DialogVancedLanguageSelectionBinding +import com.vanced.manager.ui.core.ThemedMaterialCheckbox import com.vanced.manager.utils.InternetTools.vanced import com.vanced.manager.utils.LanguageHelper.getDefaultVancedLanguages import java.util.* @@ -66,7 +67,7 @@ class VancedLanguageSelectionDialog : BindingBottomSheetDialogFragment val loc = Locale(lang) - val box: MaterialCheckBox = MaterialCheckBox(requireActivity()).apply { + val box = ThemedMaterialCheckbox(requireActivity()).apply { tag = lang isChecked = langPrefs?.contains(lang) ?: false text = loc.getDisplayLanguage(loc).capitalize(Locale.ROOT) diff --git a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt index 73bd7afc..d56ab39c 100644 --- a/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt +++ b/app/src/main/java/com/vanced/manager/ui/dialogs/VancedThemeSelectorDialog.kt @@ -6,11 +6,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.edit -import com.google.android.material.radiobutton.MaterialRadioButton import com.vanced.manager.R import com.vanced.manager.core.ui.base.BindingBottomSheetDialogFragment import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.databinding.DialogBottomRadioButtonBinding +import com.vanced.manager.ui.core.ThemedMaterialRadioButton import com.vanced.manager.utils.Extensions.convertToAppTheme import com.vanced.manager.utils.Extensions.getCheckedButtonTag import com.vanced.manager.utils.InternetTools.vanced @@ -46,7 +46,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment(prefs.getString("theme", "dark")) + val tag = root.findViewWithTag(prefs.getString("theme", "dark")) if (tag != null) { tag.isChecked = true } @@ -61,7 +61,7 @@ class VancedThemeSelectorDialog : BindingBottomSheetDialogFragment("themes")?.value?.map {theme -> - MaterialRadioButton(requireActivity()).apply { + ThemedMaterialRadioButton(requireActivity()).apply { text = theme.convertToAppTheme(requireActivity()) tag = theme textSize = 18f diff --git a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt index 04f6bfd4..f0cda948 100644 --- a/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/vanced/manager/ui/fragments/SettingsFragment.kt @@ -17,7 +17,10 @@ import com.vanced.manager.core.ui.base.BindingFragment import com.vanced.manager.core.ui.ext.showDialog import com.vanced.manager.databinding.FragmentSettingsBinding import com.vanced.manager.ui.dialogs.* +import com.vanced.manager.utils.Extensions.toHex import com.vanced.manager.utils.LanguageHelper.getLanguageFormat +import com.vanced.manager.utils.ThemeHelper.accentColor +import com.vanced.manager.utils.ThemeHelper.defAccentColor import java.io.File class SettingsFragment : BindingFragment() { @@ -26,10 +29,6 @@ class SettingsFragment : BindingFragment() { const val LIGHT = "Light" const val DARK = "Dark" - const val BLUE = "Blue" - const val RED = "Red" - const val GREEN = "Green" - const val YELLOW = "Yellow" } private val prefs by lazy { getDefaultSharedPreferences(requireActivity()) } @@ -105,18 +104,12 @@ class SettingsFragment : BindingFragment() { } private fun FragmentSettingsBinding.bindManagerAccentColor() { - val accentPref = prefs.getString("manager_accent", "Blue") + managerAccentColor.setSummary(prefs.getInt("manager_accent", defAccentColor).toHex()) managerAccentColor.apply { - setSummary( - when (accentPref) { - BLUE -> getString(R.string.accent_blue) - RED -> getString(R.string.accent_red) - GREEN -> getString(R.string.accent_green) - YELLOW -> getString(R.string.accent_yellow) - else -> getString(R.string.accent_purple) - } - ) setOnClickListener { showDialog(ManagerAccentColorDialog()) } + accentColor.observe(viewLifecycleOwner) { + managerAccentColor.setSummary(prefs.getInt("manager_accent", defAccentColor).toHex()) + } } } diff --git a/app/src/main/java/com/vanced/manager/utils/Extensions.kt b/app/src/main/java/com/vanced/manager/utils/Extensions.kt index 7ce0a679..2a03666f 100644 --- a/app/src/main/java/com/vanced/manager/utils/Extensions.kt +++ b/app/src/main/java/com/vanced/manager/utils/Extensions.kt @@ -2,10 +2,12 @@ package com.vanced.manager.utils import android.app.Activity import android.content.Context +import android.content.ContextWrapper import android.content.SharedPreferences import android.widget.RadioGroup import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.LifecycleOwner import androidx.preference.PreferenceManager.getDefaultSharedPreferences import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.radiobutton.MaterialRadioButton @@ -20,10 +22,6 @@ object Extensions { return findViewById(checkedRadioButtonId)?.tag?.toString() } - fun RadioGroup.getCheckedButtonText(): String { - return findViewById(checkedRadioButtonId).text.toString() - } - fun DialogFragment.show(activity: FragmentActivity) { show(activity.supportFragmentManager, "") } @@ -71,4 +69,19 @@ object Extensions { fun SharedPreferences.getInstallUrl() = getString("install_url", baseUrl) + fun Context.lifecycleOwner(): LifecycleOwner? { + var curContext = this + var maxDepth = 20 + while (maxDepth-- > 0 && curContext !is LifecycleOwner) { + curContext = (curContext as ContextWrapper).baseContext + } + return if (curContext is LifecycleOwner) { + curContext + } else { + null + } + } + + fun Int.toHex(): String = java.lang.String.format("#%06X", 0xFFFFFF and this) + } \ No newline at end of file diff --git a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt index c1cb1149..b3d119fc 100644 --- a/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/PackageHelper.kt @@ -10,7 +10,6 @@ import android.os.Build import android.util.Log import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.io.SuFile -import com.topjohnwu.superuser.io.SuFileInputStream import com.topjohnwu.superuser.io.SuFileOutputStream import com.vanced.manager.BuildConfig import com.vanced.manager.core.installer.AppInstallerService @@ -31,7 +30,6 @@ import java.util.* import java.util.regex.Pattern import kotlin.collections.ArrayList import kotlin.collections.HashMap -import kotlin.jvm.Throws object PackageHelper { diff --git a/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt b/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt index 306f787e..e53b769e 100644 --- a/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt +++ b/app/src/main/java/com/vanced/manager/utils/ThemeHelper.kt @@ -2,46 +2,29 @@ package com.vanced.manager.utils import android.app.Activity import android.content.res.Configuration +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import com.vanced.manager.R import com.vanced.manager.utils.Extensions.getDefaultPrefs object ThemeHelper { + const val defAccentColor: Int = -13732865 + + val mutableAccentColor = MutableLiveData() + val accentColor: LiveData = mutableAccentColor + fun Activity.setFinalTheme() { - val prefs = getDefaultPrefs() - val currentAccent = prefs.getString("manager_accent", "Blue") - when (prefs.getString("manager_theme", "System Default")) { - "Light" -> setTheme(getLightAccent(currentAccent)) - "Dark" -> setTheme(getDarkAccent(currentAccent)) + when (getDefaultPrefs().getString("manager_theme", "System Default")) { + "Light" -> setTheme(R.style.LightTheme) + "Dark" -> setTheme(R.style.DarkTheme) "System Default" -> { when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { - Configuration.UI_MODE_NIGHT_YES -> setTheme(getDarkAccent(currentAccent)) - Configuration.UI_MODE_NIGHT_NO -> setTheme(getLightAccent(currentAccent)) + Configuration.UI_MODE_NIGHT_YES -> setTheme(R.style.DarkTheme) + Configuration.UI_MODE_NIGHT_NO -> setTheme(R.style.LightTheme) } } - else -> setTheme(getLightAccent("Blue")) - } - } - - private fun getDarkAccent(accentColor: String?): Int { - return when (accentColor) { - "Blue" -> R.style.DarkTheme_Blue - "Red" -> R.style.DarkTheme_Red - "Green" -> R.style.DarkTheme_Green - "Yellow" -> R.style.DarkTheme_Yellow - "Purple" -> R.style.DarkTheme_Purple - else -> R.style.DarkTheme_Blue - } - } - - private fun getLightAccent(accentColor: String?): Int { - return when (accentColor) { - "Blue" -> R.style.LightTheme_Blue - "Red" -> R.style.LightTheme_Red - "Green" -> R.style.LightTheme_Green - "Yellow" -> R.style.LightTheme_Yellow - "Purple" -> R.style.LightTheme_Purple - else -> R.style.LightTheme_Blue + else -> setTheme(R.style.LightTheme) } } diff --git a/app/src/main/res/layout/dialog_app_download.xml b/app/src/main/res/layout/dialog_app_download.xml index 9ce9c2ca..724b9c3d 100644 --- a/app/src/main/res/layout/dialog_app_download.xml +++ b/app/src/main/res/layout/dialog_app_download.xml @@ -58,7 +58,7 @@ android:textSize="15sp" tools:text="Downloading base.apk..." /> - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_bottom_radio_button.xml b/app/src/main/res/layout/dialog_bottom_radio_button.xml index d7fc825b..9e6459d9 100644 --- a/app/src/main/res/layout/dialog_bottom_radio_button.xml +++ b/app/src/main/res/layout/dialog_bottom_radio_button.xml @@ -23,7 +23,7 @@ - diff --git a/app/src/main/res/layout/dialog_custom_url.xml b/app/src/main/res/layout/dialog_custom_url.xml index aeb33382..1bef148a 100644 --- a/app/src/main/res/layout/dialog_custom_url.xml +++ b/app/src/main/res/layout/dialog_custom_url.xml @@ -37,13 +37,13 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp"> - - - - + + diff --git a/app/src/main/res/layout/dialog_manager_accent_color.xml b/app/src/main/res/layout/dialog_manager_accent_color.xml index 73bb0728..3ed493dd 100644 --- a/app/src/main/res/layout/dialog_manager_accent_color.xml +++ b/app/src/main/res/layout/dialog_manager_accent_color.xml @@ -1,5 +1,6 @@ - - + android:layout_height="350dp" /> - + - + - + - + - + - - - + - + diff --git a/app/src/main/res/layout/dialog_manager_language.xml b/app/src/main/res/layout/dialog_manager_language.xml index edda4478..7e2b515b 100644 --- a/app/src/main/res/layout/dialog_manager_language.xml +++ b/app/src/main/res/layout/dialog_manager_language.xml @@ -21,7 +21,7 @@ android:layout_height="wrap_content" /> - diff --git a/app/src/main/res/layout/dialog_manager_theme.xml b/app/src/main/res/layout/dialog_manager_theme.xml index 4144fb40..0fe43d6a 100644 --- a/app/src/main/res/layout/dialog_manager_theme.xml +++ b/app/src/main/res/layout/dialog_manager_theme.xml @@ -20,32 +20,35 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - - + - + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_manager_update.xml b/app/src/main/res/layout/dialog_manager_update.xml index 9bb8b47a..81d60923 100644 --- a/app/src/main/res/layout/dialog_manager_update.xml +++ b/app/src/main/res/layout/dialog_manager_update.xml @@ -41,7 +41,7 @@ tools:progress="10" tools:visibility="visible" /> - - - - diff --git a/app/src/main/res/layout/dialog_music_preferences.xml b/app/src/main/res/layout/dialog_music_preferences.xml index d32ad612..a312705e 100644 --- a/app/src/main/res/layout/dialog_music_preferences.xml +++ b/app/src/main/res/layout/dialog_music_preferences.xml @@ -34,7 +34,7 @@ android:src="@drawable/ic_baseline_navigate_next_36" /> - diff --git a/app/src/main/res/layout/dialog_select_apps.xml b/app/src/main/res/layout/dialog_select_apps.xml index 4cd2d73a..16d51796 100644 --- a/app/src/main/res/layout/dialog_select_apps.xml +++ b/app/src/main/res/layout/dialog_select_apps.xml @@ -19,7 +19,7 @@ tools:itemCount="2" tools:listitem="@layout/view_app_checkbox" /> - - diff --git a/app/src/main/res/layout/dialog_vanced_preferences.xml b/app/src/main/res/layout/dialog_vanced_preferences.xml index 1f778ed6..04cc4520 100644 --- a/app/src/main/res/layout/dialog_vanced_preferences.xml +++ b/app/src/main/res/layout/dialog_vanced_preferences.xml @@ -82,7 +82,7 @@ android:src="@drawable/ic_baseline_navigate_next_36" /> - diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 9b1782fa..d62b1257 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -26,7 +26,7 @@ tools:itemCount="3" tools:listitem="@layout/view_app" /> - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/view_preference_category.xml b/app/src/main/res/layout/view_preference_category.xml index 60019b3f..00f4ba52 100644 --- a/app/src/main/res/layout/view_preference_category.xml +++ b/app/src/main/res/layout/view_preference_category.xml @@ -1,5 +1,5 @@ - - diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml index 3fde76bd..cd627ed4 100644 --- a/app/src/main/res/values-v23/themes.xml +++ b/app/src/main/res/values-v23/themes.xml @@ -1,7 +1,7 @@ - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f541a0a2..05a0077b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,6 +10,8 @@ #17191A #5F5E5E + #ffffff + #000000 #131317 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1ebad831..a0ef3c7d 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,7 @@ Failed to `chown` APK to system owner, please try again. Error Downloading %1$s Failed to uninstall package %1$s + Failed to apply new accent color Failed to locate the required files for installation. Re-download the installation files, then try again. Failed to locate apk file for black/dark theme from storage, please try again. Installation failed because the user aborted the installation. diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 498de273..a15277ce 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,7 +2,7 @@ - - - - - - - + - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 996c4493..b7593355 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.10' + ext.kotlin_version = '1.4.21' repositories { google() jcenter() @@ -13,7 +13,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.4' classpath 'com.google.firebase:perf-plugin:1.3.4' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' - classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.1' + classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files