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

Commit 091119de authored by Abhishek Pal's avatar Abhishek Pal Committed by Android (Google) Code Review
Browse files

Merge "Added a custom preference called SafetySourcePreference in SettingsLib" into main

parents 587b819d f1b2190a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -50,4 +50,13 @@
    <attr name="preferenceStyle" format="reference" />
    <attr name="switchPreferenceStyle" format="reference" />

    <declare-styleable name="SafetySourcePreference">
        <attr name="safetySource" format="string" />
        <attr name="profile" format="enum">
            <enum name="personal_profile" value="0" />
            <enum name="work_profile" value="1" />
            <enum name="private_profile" value="2" />
        </attr>
    </declare-styleable>

</resources>
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.safetycenter

import android.content.Context
import android.util.AttributeSet
import androidx.preference.Preference
import com.android.settingslib.R
import androidx.core.content.withStyledAttributes

/**
 * A custom [Preference] for displaying information about a safety source.
 *
 * @property safetySource The ID of the safety source.
 * @property profile The [Profile] associated with the safety source.
 */
class SafetySourcePreference @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : Preference(context, attrs, defStyleAttr, defStyleRes) {

    /** The ID of the safety source. */
    var safetySource: String? = null

    /** The profile associated with the safety source. */
    var profile: Profile = Profile.PERSONAL

    init {
        if (attrs != null) {
            context.withStyledAttributes(
                attrs,
                R.styleable.SafetySourcePreference,
                defStyleAttr,
                defStyleRes
            ) {
                safetySource = getString(R.styleable.SafetySourcePreference_safetySource)

                val profileIntValue = getInt(R.styleable.SafetySourcePreference_profile,
                    DEFAULT_PROFILE_INT_VALUE)
                profile = Profile.fromIntValue(profileIntValue)
            }
        }
    }

    /**
     * Defines the possible profiles for a safety source.
     *
     * @property intValue The integer value corresponding to the profile in XML.
     */
    enum class Profile(val intValue: Int) {
        PERSONAL(0),
        WORK(1),
        PRIVATE(2);

        companion object {
            private val intValueToProfileMap: Map<Int, Profile> =
                entries.associateBy { it.intValue }

            /**
             * Returns the [Profile] enum value corresponding to the given integer value.
             * If the integer value does not match any [Profile] it will return [PERSONAL] value.
             */
            fun fromIntValue(intValue: Int): Profile = intValueToProfileMap[intValue] ?: PERSONAL
        }
    }

    companion object {
        private const val DEFAULT_PROFILE_INT_VALUE = 0
    }
}
+100 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.safetycenter

import android.content.Context
import android.util.AttributeSet
import androidx.test.core.app.ApplicationProvider
import com.android.settingslib.safetycenter.SafetySourcePreference.Profile
import com.android.settingslib.R
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner

@RunWith(RobolectricTestRunner::class)
class SafetySourcePreferenceTest {

    private val context: Context = ApplicationProvider.getApplicationContext()

    @Test
    fun testDefaultValues() {
        val preference = SafetySourcePreference(context)

        assertThat(preference.safetySource).isNull()
        assertThat(preference.profile).isEqualTo(Profile.PERSONAL)
    }

    @Test
    fun testPersonalProfileValue() {
        val attrs = createAttributeSet(
            mapOf(
                "safetySource" to "MySafetySource",
                "profile" to Profile.PERSONAL.intValue.toString()
            )
        )

        val preference = SafetySourcePreference(context, attrs)

        assertThat(preference.safetySource).isEqualTo("MySafetySource")
        assertThat(preference.profile).isEqualTo(Profile.PERSONAL)
    }

    @Test
    fun testWorkProfileValue() {
        val attrs = createAttributeSet(
            mapOf(
                "safetySource" to "MySafetySource",
                "profile" to Profile.WORK.intValue.toString()
            )
        )

        val preference = SafetySourcePreference(context, attrs)

        assertThat(preference.safetySource).isEqualTo("MySafetySource")
        assertThat(preference.profile).isEqualTo(Profile.WORK)
    }

    @Test
    fun testPrivateProfileValue() {
        val attrs = createAttributeSet(
            mapOf(
                "safetySource" to "MySafetySource",
                "profile" to Profile.PRIVATE.intValue.toString()
            )
        )

        val preference = SafetySourcePreference(context, attrs)

        assertThat(preference.safetySource).isEqualTo("MySafetySource")
        assertThat(preference.profile).isEqualTo(Profile.PRIVATE)
    }

    private fun createAttributeSet(attributes: Map<String, String>): AttributeSet {
        val builder = Robolectric.buildAttributeSet()
        for ((name, value) in attributes) {
            val attributeId = when (name) {
                "safetySource" -> R.attr.safetySource
                "profile" -> R.attr.profile
                else -> throw IllegalArgumentException("Unknown attribute: $name")
            }
            builder.addAttribute(attributeId, value)
        }
        return builder.build()
    }
}