Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a93a70d authored by Fan Wu's avatar Fan Wu
Browse files

Add PreferenceIconProvider to support dynamic preference icon

Bug: 373280169
Flag: EXEMPT infra update
Change-Id: Ie7428b9fd99a1cad3d45208aa2cc3cfcc97cea40
parent ffda9a50
Loading
Loading
Loading
Loading
+14 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import androidx.annotation.StringRes
 * information:
 * information:
 * - [PreferenceTitleProvider]: provide dynamic title content
 * - [PreferenceTitleProvider]: provide dynamic title content
 * - [PreferenceSummaryProvider]: provide dynamic summary content (e.g. based on preference value)
 * - [PreferenceSummaryProvider]: provide dynamic summary content (e.g. based on preference value)
 * - [PreferenceIconProvider]: provide dynamic icon content (e.g. based on flag)
 * - [PreferenceAvailabilityProvider]: provide preference availability (e.g. based on flag)
 * - [PreferenceAvailabilityProvider]: provide preference availability (e.g. based on flag)
 * - [PreferenceLifecycleProvider]: provide the lifecycle callbacks and notify state change
 * - [PreferenceLifecycleProvider]: provide the lifecycle callbacks and notify state change
 *
 *
@@ -160,6 +161,19 @@ interface PreferenceMetadata {
            this is PreferenceSummaryProvider -> getSummary(context)
            this is PreferenceSummaryProvider -> getSummary(context)
            else -> null
            else -> null
        }
        }

    /**
     * Returns the preference icon.
     *
     * Implement [PreferenceIconProvider] interface if icon content is provided dynamically
     * (e.g. icon is provided based on flag value).
     */
    fun getPreferenceIcon(context: Context): Int =
        when {
            icon != 0 -> icon
            this is PreferenceIconProvider -> getIcon(context)
            else -> 0
        }
}
}


/** Metadata of preference group. */
/** Metadata of preference group. */
+11 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,17 @@ interface PreferenceSummaryProvider {
    fun getSummary(context: Context): CharSequence?
    fun getSummary(context: Context): CharSequence?
}
}


/**
 * Interface to provide dynamic preference icon.
 *
 * Implement this interface implies that the preference icon should not be cached for indexing.
 */
interface PreferenceIconProvider {

    /** Provides preference icon. */
    fun getIcon(context: Context): Int
}

/**
/**
 * Interface to provide the state of preference availability.
 * Interface to provide the state of preference availability.
 *
 *
+4 −3
Original line number Original line Diff line number Diff line
@@ -62,12 +62,13 @@ interface PreferenceBinding {
    fun bind(preference: Preference, metadata: PreferenceMetadata) {
    fun bind(preference: Preference, metadata: PreferenceMetadata) {
        metadata.apply {
        metadata.apply {
            preference.key = key
            preference.key = key
            if (icon != 0) {
            val context = preference.context
                preference.setIcon(icon)
            val preferenceIcon = metadata.getPreferenceIcon(context)
            if (preferenceIcon != 0) {
                preference.setIcon(preferenceIcon)
            } else {
            } else {
                preference.icon = null
                preference.icon = null
            }
            }
            val context = preference.context
            val isPreferenceScreen = preference is PreferenceScreen
            val isPreferenceScreen = preference is PreferenceScreen
            preference.peekExtras()?.clear()
            preference.peekExtras()?.clear()
            extras(context)?.let { preference.extras.putAll(it) }
            extras(context)?.let { preference.extras.putAll(it) }