From b63869814d55a6ce35d6359b606e36354e81c788 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 19 Aug 2025 14:03:58 +0200 Subject: [PATCH] Proto: loading main color from linphonerc --- .../java/org/linphone/ui/GenericActivity.kt | 26 ------- .../java/org/linphone/ui/GenericViewModel.kt | 11 +++ .../java/org/linphone/ui/call/CallActivity.kt | 17 ---- .../java/org/linphone/ui/main/MainActivity.kt | 2 +- .../settings/fragment/SettingsFragment.kt | 32 -------- .../settings/viewmodel/SettingsViewModel.kt | 32 -------- .../ui/main/viewmodel/MainViewModel.kt | 4 +- .../org/linphone/utils/DataBindingUtils.kt | 38 +++++++++ .../res/layout-land/main_activity_top_bar.xml | 3 +- app/src/main/res/layout/bottom_nav_bar.xml | 8 +- .../main/res/layout/chat_list_fragment.xml | 6 +- .../res/layout/contacts_list_fragment.xml | 8 +- app/src/main/res/layout/drawer_menu.xml | 2 +- .../main/res/layout/history_list_fragment.xml | 6 +- .../main/res/layout/main_activity_top_bar.xml | 2 +- .../res/layout/meetings_list_fragment.xml | 6 +- .../res/layout/settings_user_interface.xml | 52 ------------- app/src/main/res/values-fr/strings.xml | 9 --- app/src/main/res/values-night/themes.xml | 54 ------------- app/src/main/res/values/colors.xml | 36 --------- app/src/main/res/values/strings.xml | 9 --- app/src/main/res/values/themes.xml | 78 ------------------- 22 files changed, 74 insertions(+), 367 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/GenericActivity.kt b/app/src/main/java/org/linphone/ui/GenericActivity.kt index 6eb20d8d0..1c478aad4 100644 --- a/app/src/main/java/org/linphone/ui/GenericActivity.kt +++ b/app/src/main/java/org/linphone/ui/GenericActivity.kt @@ -23,7 +23,6 @@ import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent import android.content.res.Configuration -import android.content.res.Resources import android.net.Uri import android.os.Bundle import android.provider.Settings @@ -38,7 +37,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.corePreferences -import org.linphone.R import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.utils.ToastUtils @@ -53,23 +51,6 @@ open class GenericActivity : AppCompatActivity() { private lateinit var toastsArea: ViewGroup - private var mainColor: String = "orange" - - override fun getTheme(): Resources.Theme { - mainColor = corePreferences.themeMainColor - val theme = super.theme - when (mainColor) { - "yellow" -> theme.applyStyle(R.style.Theme_LinphoneYellow, true) - "green" -> theme.applyStyle(R.style.Theme_LinphoneGreen, true) - "blue" -> theme.applyStyle(R.style.Theme_LinphoneBlue, true) - "red" -> theme.applyStyle(R.style.Theme_LinphoneRed, true) - "pink" -> theme.applyStyle(R.style.Theme_LinphonePink, true) - "purple" -> theme.applyStyle(R.style.Theme_LinphonePurple, true) - else -> theme.applyStyle(R.style.Theme_Linphone, true) - } - return theme - } - @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { enableWindowSecureMode(corePreferences.enableSecureMode) @@ -95,13 +76,6 @@ open class GenericActivity : AppCompatActivity() { super.onCreate(savedInstanceState) } - protected fun checkMainColorTheme() { - if (mainColor != corePreferences.themeMainColor) { - Log.i("$TAG Main color setting has changed, re-creating activity") - recreate() - } - } - fun setUpToastsArea(viewGroup: ViewGroup) { toastsArea = viewGroup } diff --git a/app/src/main/java/org/linphone/ui/GenericViewModel.kt b/app/src/main/java/org/linphone/ui/GenericViewModel.kt index b31e4ef38..6bb5f079b 100644 --- a/app/src/main/java/org/linphone/ui/GenericViewModel.kt +++ b/app/src/main/java/org/linphone/ui/GenericViewModel.kt @@ -21,11 +21,14 @@ package org.linphone.ui import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.core.graphics.toColorInt import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.utils.Event open class GenericViewModel : ViewModel() { + val mainColor = MutableLiveData() + // Message res id, icon val showGreenToastEvent: MutableLiveData>> by lazy { MutableLiveData>>() @@ -59,4 +62,12 @@ open class GenericViewModel : ViewModel() { fun showFormattedRedToast(message: String, @DrawableRes icon: Int) { showFormattedRedToastEvent.postValue(Event(Pair(message, icon))) } + + init { + mainColor.value = "#840350".toColorInt() + } + + fun checkMainColorTheme() { + // TODO + } } diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index f4523570d..9cdc90e2e 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -22,7 +22,6 @@ package org.linphone.ui.call import android.Manifest import android.content.Intent import android.content.pm.PackageManager -import android.content.res.Resources import android.graphics.Color import android.os.Bundle import android.os.PowerManager @@ -48,7 +47,6 @@ import kotlin.math.max import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.compatibility.Api28Compatibility import org.linphone.compatibility.Compatibility @@ -108,21 +106,6 @@ class CallActivity : GenericActivity() { } } - override fun getTheme(): Resources.Theme { - val mainColor = corePreferences.themeMainColor - val theme = super.getTheme() - when (mainColor) { - "yellow" -> theme.applyStyle(R.style.Theme_LinphoneInCallYellow, true) - "green" -> theme.applyStyle(R.style.Theme_LinphoneInCallGreen, true) - "blue" -> theme.applyStyle(R.style.Theme_LinphoneInCallBlue, true) - "red" -> theme.applyStyle(R.style.Theme_LinphoneInCallRed, true) - "pink" -> theme.applyStyle(R.style.Theme_LinphoneInCallPink, true) - "purple" -> theme.applyStyle(R.style.Theme_LinphoneInCallPurple, true) - else -> theme.applyStyle(R.style.Theme_LinphoneInCall, true) - } - return theme - } - override fun onCreate(savedInstanceState: Bundle?) { val style = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) { true // Force dark mode diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 56c69c961..6a536eb1d 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -351,7 +351,7 @@ class MainActivity : GenericActivity() { coreContext.provisioningAppliedEvent.observe(this) { it.consume { Log.i("$TAG Remote provisioning was applied, checking if theme has changed") - checkMainColorTheme() + viewModel.checkMainColorTheme() } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index fa915e656..80a27ed7c 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -100,22 +100,6 @@ class SettingsFragment : GenericMainFragment() { } } - private val colorListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - val label = viewModel.availableColorsNames[position] - val value = viewModel.availableColorsValues[position] - Log.i("$TAG Selected color is now [$label] ($value)") - // Be careful not to create an infinite loop - if (value != viewModel.color.value.orEmpty()) { - viewModel.setColor(value) - requireActivity().recreate() - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - } - } - private val tunnelModeListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { viewModel.tunnelModeIndex.value = position @@ -302,22 +286,6 @@ class SettingsFragment : GenericMainFragment() { binding.userInterfaceSettings.themeSpinner.onItemSelectedListener = themeListener } - // Choose main color - val colorAdapter = ArrayAdapter( - requireContext(), - R.layout.drop_down_item, - viewModel.availableColorsNames - ) - colorAdapter.setDropDownViewResource(R.layout.generic_dropdown_cell) - binding.userInterfaceSettings.colorSpinner.adapter = colorAdapter - - viewModel.color.observe(viewLifecycleOwner) { color -> - binding.userInterfaceSettings.colorSpinner.setSelection( - viewModel.availableColorsValues.indexOf(color) - ) - binding.userInterfaceSettings.colorSpinner.onItemSelectedListener = colorListener - } - // Tunnel mode val tunnelModeAdapter = ArrayAdapter( requireContext(), diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index ee04deee2..4975de714 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -162,27 +162,6 @@ class SettingsViewModel ) val availableThemesValues = arrayListOf(-1, 0, 1) - val showColorSelector = MutableLiveData() - val color = MutableLiveData() - val availableColorsNames = arrayListOf( - AppUtils.getString(R.string.orange), - AppUtils.getString(R.string.yellow), - AppUtils.getString(R.string.green), - AppUtils.getString(R.string.blue), - AppUtils.getString(R.string.red), - AppUtils.getString(R.string.pink), - AppUtils.getString(R.string.purple) - ) - val availableColorsValues = arrayListOf( - "orange", - "yellow", - "green", - "blue", - "red", - "pink", - "purple" - ) - // Tunnel settings val tunnelMainHost = MutableLiveData() val tunnelMainPort = MutableLiveData() @@ -273,7 +252,6 @@ class SettingsViewModel showMeetingsSettings.postValue(!corePreferences.disableMeetings) ldapAvailable.postValue(core.ldapAvailable()) showThemeSelector.postValue(corePreferences.darkModeAllowed) - showColorSelector.postValue(corePreferences.changeMainColorAllowed) showAdvancedSettings.postValue(!corePreferences.hideAdvancedSettings) showDeveloperSettings.postValue(corePreferences.showDeveloperSettings) } @@ -346,7 +324,6 @@ class SettingsViewModel autoShowDialpad.postValue(corePreferences.automaticallyShowDialpad) theme.postValue(corePreferences.darkMode) - color.postValue(corePreferences.themeMainColor) if (core.tunnelAvailable()) { setupTunnel() @@ -703,15 +680,6 @@ class SettingsViewModel theme.value = themeValue } - @UiThread - fun setColor(colorName: String) { - coreContext.postOnCoreThread { - corePreferences.themeMainColor = colorName - Log.i("$TAG Color [$colorName] saved") - } - color.value = colorName - } - @UiThread fun toggleTunnelExpand() { expandTunnel.value = expandTunnel.value == false diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt index d2c8ec691..60d139b53 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt @@ -24,7 +24,6 @@ import androidx.annotation.RequiresApi import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext @@ -43,6 +42,7 @@ import org.linphone.core.RegistrationState import org.linphone.core.VFS import org.linphone.core.tools.AndroidPlatformHelper import org.linphone.core.tools.Log +import org.linphone.ui.GenericViewModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.FileUtils @@ -50,7 +50,7 @@ import org.linphone.utils.LinphoneUtils class MainViewModel @UiThread - constructor() : ViewModel() { + constructor() : GenericViewModel() { companion object { private const val TAG = "[Main ViewModel]" diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 88088fb11..4b3a22bb9 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -21,6 +21,7 @@ package org.linphone.utils import android.annotation.SuppressLint import android.content.Context +import android.content.res.ColorStateList import android.graphics.PorterDuff import android.graphics.drawable.AnimatedVectorDrawable import android.text.Editable @@ -61,6 +62,7 @@ import coil3.transform.CircleCropTransformation import coil3.transform.RoundedCornersTransformation import coil3.video.videoFrameMillis import com.google.android.flexbox.FlexboxLayout +import com.google.android.material.progressindicator.CircularProgressIndicator import org.linphone.BR import org.linphone.R import org.linphone.contacts.AbstractAvatarModel @@ -652,3 +654,39 @@ fun EmojiPickerView.setEmojiPickedListener(listener: EmojiPickedListener) { interface EmojiPickedListener { fun onEmojiPicked(item: EmojiViewItem) } + +@UiThread +@BindingAdapter("app:tint") +fun AppCompatTextView.setTintFromConfig(@ColorInt color: Int) { + setTextColor(color) +} + +@UiThread +@BindingAdapter("app:tint") +fun ImageView.setTintFromConfig(@ColorInt color: Int) { + setColorFilter(color, PorterDuff.Mode.SRC_IN) +} + +@UiThread +@BindingAdapter("android:background") +fun View.setBackgroundColorFromConfig(@ColorInt color: Int) { + setBackgroundColor(color) +} + +@UiThread +@BindingAdapter("android:backgroundTint") +fun View.setBackgroundTintFromConfig(@ColorInt color: Int) { + backgroundTintList = ColorStateList.valueOf(color) +} + +@UiThread +@BindingAdapter("app:backgroundTint") +fun View.setAppBackgroundTintFromConfig(@ColorInt color: Int) { + setBackgroundTintFromConfig(color) +} + +@UiThread +@BindingAdapter("app:indicatorColor") +fun CircularProgressIndicator.setBackgroundTintFromConfig(@ColorInt color: Int) { + setIndicatorColor(color) +} diff --git a/app/src/main/res/layout-land/main_activity_top_bar.xml b/app/src/main/res/layout-land/main_activity_top_bar.xml index 0892801e3..d73904e07 100644 --- a/app/src/main/res/layout-land/main_activity_top_bar.xml +++ b/app/src/main/res/layout-land/main_activity_top_bar.xml @@ -25,7 +25,8 @@ + android:background="@drawable/shape_squircle_main1_500_r10_bottom" + android:backgroundTint="@{viewModel.mainColor}"> + android:background="@{viewModel.mainColor}"> diff --git a/app/src/main/res/layout/contacts_list_fragment.xml b/app/src/main/res/layout/contacts_list_fragment.xml index 11c7a86bf..ce3093d99 100644 --- a/app/src/main/res/layout/contacts_list_fragment.xml +++ b/app/src/main/res/layout/contacts_list_fragment.xml @@ -28,7 +28,7 @@ + android:background="@{viewModel.mainColor}"> @@ -179,7 +181,7 @@ android:layout_height="wrap_content" android:indeterminate="true" android:visibility="@{viewModel.fetchInProgress || viewModel.searchInProgress ? View.VISIBLE : View.GONE}" - app:indicatorColor="?attr/color_main1_500" + app:indicatorColor="@{viewModel.mainColor}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -203,7 +205,7 @@ android:src="@drawable/user_plus" android:contentDescription="@string/content_description_contact_create" app:tint="?attr/color_on_main" - app:backgroundTint="?attr/color_main1_500" + app:backgroundTint="@{viewModel.mainColor}" app:shapeAppearanceOverlay="@style/rounded" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toTopOf="@id/bottom_nav_bar" /> diff --git a/app/src/main/res/layout/drawer_menu.xml b/app/src/main/res/layout/drawer_menu.xml index ac7566c8d..07e032431 100644 --- a/app/src/main/res/layout/drawer_menu.xml +++ b/app/src/main/res/layout/drawer_menu.xml @@ -39,7 +39,7 @@ android:contentDescription="@string/app_name" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" - app:tint="?attr/color_main1_500" /> + app:tint="@{viewModel.mainColor}" /> + android:background="@{viewModel.mainColor}"> diff --git a/app/src/main/res/layout/main_activity_top_bar.xml b/app/src/main/res/layout/main_activity_top_bar.xml index 1f3a3689c..598f196f2 100644 --- a/app/src/main/res/layout/main_activity_top_bar.xml +++ b/app/src/main/res/layout/main_activity_top_bar.xml @@ -25,7 +25,7 @@ + android:background="@{viewModel.mainColor}"> + android:background="@{viewModel.mainColor}"> diff --git a/app/src/main/res/layout/settings_user_interface.xml b/app/src/main/res/layout/settings_user_interface.xml index 5f1d3c000..7798d87b1 100644 --- a/app/src/main/res/layout/settings_user_interface.xml +++ b/app/src/main/res/layout/settings_user_interface.xml @@ -22,12 +22,6 @@ android:visibility="@{viewModel.showThemeSelector ? View.VISIBLE : View.GONE}" app:constraint_referenced_ids="theme_spinner, theme_spinner_caret, theme_title" /> - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2add14319..d6dfb0f6b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -819,15 +819,6 @@ Télécharger Partager - - Orange - Jaune - Vert - Bleu - Rouge - Rose - Violet - Aucun résultat… Les participants selectionnés apparaîtront ici diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index fb069ad48..ae726c322 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -82,58 +82,4 @@ @color/gray_main2_400 @color/background_color_alt_dark_mode - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7b931aeaa..63acaab28 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -58,40 +58,4 @@ #E1C133 #80FFFFFF - - #FFF5D6 - #80FFF5D6 - #FFE799 - #F5BC00 - #A37D00 - - #DCF9E7 - #80DCF9E7 - #A8F0C2 - #25D366 - #1C9C4B - - #D6F4FF - #80D6F4FF - #99E4FF - #00aff0 - #0078A3 - - #FBE1DA - #80FBE1DA - #F5B53A - #E14318 - #A63211 - - #FFD6F1 - #80FFD6F1 - #FF99DD - #FF00A9 - #B8007A - - #FFD6FF - #80FFD6FF - #FF99FF - #800080 - #520052 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 904b2d6c7..c1db950df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -862,15 +862,6 @@ Download Share - - Orange - Yellow - Green - Blue - Red - Pink - Purple - No result found… Selected participants will appear here diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index b19b6bd3e..134cb497d 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -84,89 +84,11 @@ @color/gray_100 - - - - - - - - - - - - - - - - - - - - - - - -