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

Commit fd48e3a8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[PreferenceGraph] Introduce PreferenceScreenProvider" into main

parents d4a85368 5271c7f5
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
package {
    default_applicable_licenses: ["frameworks_base_license"],
}

filegroup {
    name: "SettingsLibGraph-srcs",
    srcs: ["src/**/*"],
}

android_library {
    name: "SettingsLibGraph",
    defaults: [
        "SettingsLintDefaults",
    ],
    srcs: [":SettingsLibGraph-srcs"],
    static_libs: [
        "androidx.annotation_annotation",
        "androidx.preference_preference",
    ],
    kotlincflags: ["-Xjvm-default=all"],
}
+6 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.settingslib.graph">

  <uses-sdk android:minSdkVersion="21" />
</manifest>
+70 −0
Original line number Diff line number Diff line
package com.android.settingslib.graph

import androidx.annotation.StringRes
import androidx.annotation.XmlRes
import androidx.preference.Preference
import androidx.preference.PreferenceManager
import androidx.preference.PreferenceScreen

/** Manager to create and initialize preference screen. */
class PreferenceScreenManager(private val preferenceManager: PreferenceManager) {
    private val context = preferenceManager.context
    // the map will preserve order
    private val updaters = mutableMapOf<String, PreferenceUpdater>()
    private val screenUpdaters = mutableListOf<PreferenceScreenUpdater>()

    /** Creates an empty [PreferenceScreen]. */
    fun createPreferenceScreen(): PreferenceScreen =
        preferenceManager.createPreferenceScreen(context)

    /** Creates [PreferenceScreen] from resource. */
    fun createPreferenceScreen(@XmlRes xmlRes: Int): PreferenceScreen =
        preferenceManager.inflateFromResource(context, xmlRes, null)

    /** Adds updater for given preference. */
    fun addPreferenceUpdater(@StringRes key: Int, updater: PreferenceUpdater) =
        addPreferenceUpdater(context.getString(key), updater)

    /** Adds updater for given preference. */
    fun addPreferenceUpdater(
        key: String,
        updater: PreferenceUpdater,
    ): PreferenceScreenManager {
        updaters.put(key, updater)?.let { if (it != updater) throw IllegalArgumentException() }
        return this
    }

    /** Adds updater for preference screen. */
    fun addPreferenceScreenUpdater(updater: PreferenceScreenUpdater): PreferenceScreenManager {
        screenUpdaters.add(updater)
        return this
    }

    /** Adds a list of updaters for preference screen. */
    fun addPreferenceScreenUpdater(
        vararg updaters: PreferenceScreenUpdater,
    ): PreferenceScreenManager {
        screenUpdaters.addAll(updaters)
        return this
    }

    /** Updates preference screen with registered updaters. */
    fun updatePreferenceScreen(preferenceScreen: PreferenceScreen) {
        for ((key, updater) in updaters) {
            preferenceScreen.findPreference<Preference>(key)?.let { updater.updatePreference(it) }
        }
        for (updater in screenUpdaters) {
            updater.updatePreferenceScreen(preferenceScreen)
        }
    }
}

/** Updater of [Preference]. */
interface PreferenceUpdater {
    fun updatePreference(preference: Preference)
}

/** Updater of [PreferenceScreen]. */
interface PreferenceScreenUpdater {
    fun updatePreferenceScreen(preferenceScreen: PreferenceScreen)
}
+26 −0
Original line number Diff line number Diff line
package com.android.settingslib.graph

import android.content.Context
import androidx.preference.PreferenceScreen

/**
 * Interface to provide [PreferenceScreen].
 *
 * It is expected to be implemented by Activity/Fragment and the implementation needs to use
 * [Context] APIs (e.g. `getContext()`, `getActivity()`) with caution: preference screen creation
 * could happen in background service, where the Activity/Fragment lifecycle callbacks (`onCreate`,
 * `onDestroy`, etc.) are not invoked.
 */
interface PreferenceScreenProvider {

    /**
     * Creates [PreferenceScreen].
     *
     * Preference screen creation could happen in background service. The implementation MUST use
     * given [context] instead of APIs like `getContext()`, `getActivity()`, etc.
     */
    fun createPreferenceScreen(
        context: Context,
        preferenceScreenManager: PreferenceScreenManager,
    ): PreferenceScreen?
}