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

Commit ab75ea80 authored by Edgar Wang's avatar Edgar Wang
Browse files

Restrict toggle/slider slice when the preference restricted

Bug: 289980550
Test: robotest & manual
Change-Id: Id87fbf12a2722344dd07886e810e7c61a9f401aa
parent 1ac510e4
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
        android:icon="@drawable/ic_media_stream"
        android:title="@string/media_volume_option_title"
        android:order="-180"
        settings:userRestriction="no_adjust_volume"
        settings:controller="com.android.settings.notification.MediaVolumePreferenceController"/>

    <!-- Media output switcher -->
@@ -53,6 +54,7 @@
        android:icon="@drawable/ic_local_phone_24_lib"
        android:title="@string/call_volume_option_title"
        android:order="-170"
        settings:userRestriction="no_adjust_volume"
        settings:controller="com.android.settings.notification.CallVolumePreferenceController"/>

    <!-- Hands free profile output switcher -->
@@ -70,6 +72,7 @@
        android:icon="@drawable/ic_ring_volume"
        android:title="@string/separate_ring_volume_option_title"
        android:order="-155"
        settings:userRestriction="no_adjust_volume"
        settings:controller="com.android.settings.notification.SeparateRingVolumePreferenceController"/>

    <!-- Notification volume -->
@@ -78,6 +81,7 @@
        android:icon="@drawable/ic_notifications"
        android:title="@string/notification_volume_option_title"
        android:order="-150"
        settings:userRestriction="no_adjust_volume"
        settings:controller="com.android.settings.notification.NotificationVolumePreferenceController"
        settings:unavailableSliceSubtitle="@string/notification_volume_disabled_summary"/>

@@ -87,6 +91,7 @@
        android:icon="@*android:drawable/ic_audio_alarm"
        android:title="@string/alarm_volume_option_title"
        android:order="-140"
        settings:userRestriction="no_adjust_volume"
        settings:controller="com.android.settings.notification.AlarmVolumePreferenceController"/>

    <!-- TODO(b/174964721): make this a PrimarySwitchPreference -->
+20 −1
Original line number Diff line number Diff line
@@ -74,7 +74,8 @@ public class PreferenceXmlParserUtils {
            MetadataFlag.FLAG_NEED_SEARCHABLE,
            MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE,
            MetadataFlag.FLAG_FOR_WORK,
            MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY})
            MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY,
            MetadataFlag.FLAG_NEED_USER_RESTRICTION})
    @Retention(RetentionPolicy.SOURCE)
    public @interface MetadataFlag {

@@ -91,6 +92,7 @@ public class PreferenceXmlParserUtils {
        int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 11;
        int FLAG_FOR_WORK = 1 << 12;
        int FLAG_NEED_HIGHLIGHTABLE_MENU_KEY = 1 << 13;
        int FLAG_NEED_USER_RESTRICTION = 1 << 14;
    }

    public static final String METADATA_PREF_TYPE = "type";
@@ -105,6 +107,7 @@ public class PreferenceXmlParserUtils {
    public static final String METADATA_UNAVAILABLE_SLICE_SUBTITLE = "unavailable_slice_subtitle";
    public static final String METADATA_FOR_WORK = "for_work";
    public static final String METADATA_HIGHLIGHTABLE_MENU_KEY = "highlightable_menu_key";
    public static final String METADATA_USER_RESTRICTION = "userRestriction";

    private static final String ENTRIES_SEPARATOR = "|";

@@ -257,9 +260,16 @@ public class PreferenceXmlParserUtils {
                preferenceMetadata.putString(METADATA_HIGHLIGHTABLE_MENU_KEY,
                        getHighlightableMenuKey(preferenceAttributes));
            }
            if (hasFlag(flags, MetadataFlag.FLAG_NEED_USER_RESTRICTION)) {
                preferenceMetadata.putString(METADATA_USER_RESTRICTION,
                        getUserRestriction(context, attrs));
            }
            metadata.add(preferenceMetadata);

            preferenceAttributes.recycle();
            if (preferenceScreenAttributes != null) {
                preferenceScreenAttributes.recycle();
            }
        } while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth));
        parser.close();
@@ -351,4 +361,13 @@ public class PreferenceXmlParserUtils {
        return styledAttributes.getBoolean(
                R.styleable.Preference_forWork, false);
    }

    private static String getUserRestriction(Context context, AttributeSet attrs) {
        TypedArray preferenceAttributes = context.obtainStyledAttributes(attrs,
                R.styleable.RestrictedPreference);
        String userRestriction = preferenceAttributes.getString(
                R.styleable.RestrictedPreference_userRestriction);
        preferenceAttributes.recycle();
        return userRestriction;
    }
}
 No newline at end of file
+13 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.provider.SettingsSlicesContract;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -50,6 +51,8 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.core.AbstractPreferenceController;

import java.util.Arrays;
@@ -86,6 +89,16 @@ public class SliceBuilderUtils {
            return buildUnavailableSlice(context, sliceData);
        }

        String userRestriction = sliceData.getUserRestriction();
        if (!TextUtils.isEmpty(userRestriction)) {
            RestrictedLockUtils.EnforcedAdmin admin =
                    RestrictedLockUtilsInternal.checkIfRestrictionEnforced(context,
                            userRestriction, UserHandle.myUserId());
            if (admin != null) {
                return buildIntentSlice(context, sliceData, controller);
            }
        }

        switch (sliceData.getSliceType()) {
            case SliceData.SliceType.INTENT:
                return buildIntentSlice(context, sliceData, controller);
+14 −0
Original line number Diff line number Diff line
@@ -73,6 +73,8 @@ public class SliceData {

    private final int mHighlightMenuRes;

    private final String mUserRestriction;

    @SliceType
    private final int mSliceType;

@@ -132,6 +134,10 @@ public class SliceData {
        return mIsPublicSlice;
    }

    public String getUserRestriction() {
        return mUserRestriction;
    }

    private SliceData(Builder builder) {
        mKey = builder.mKey;
        mTitle = builder.mTitle;
@@ -146,6 +152,7 @@ public class SliceData {
        mUnavailableSliceSubtitle = builder.mUnavailableSliceSubtitle;
        mIsPublicSlice = builder.mIsPublicSlice;
        mHighlightMenuRes = builder.mHighlightMenuRes;
        mUserRestriction = builder.mUserRestriction;
    }

    @Override
@@ -189,6 +196,8 @@ public class SliceData {

        private boolean mIsPublicSlice;

        private String mUserRestriction;

        public Builder setKey(String key) {
            mKey = key;
            return this;
@@ -255,6 +264,11 @@ public class SliceData {
            return this;
        }

        public Builder setUserRestriction(String userRestriction) {
            mUserRestriction = userRestriction;
            return this;
        }

        public SliceData build() {
            if (TextUtils.isEmpty(mKey)) {
                throw new InvalidSliceDataException("Key cannot be empty");
+5 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_SUMMARY;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_TITLE;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_UNAVAILABLE_SLICE_SUBTITLE;
import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_USER_RESTRICTION;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.settings.SettingsEnums;
@@ -189,7 +190,8 @@ class SliceDataConverter {
                            | MetadataFlag.FLAG_NEED_PREF_TITLE
                            | MetadataFlag.FLAG_NEED_PREF_ICON
                            | MetadataFlag.FLAG_NEED_PREF_SUMMARY
                            | MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE);
                            | MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE
                            | MetadataFlag.FLAG_NEED_USER_RESTRICTION);

            for (Bundle bundle : metadata) {
                // TODO (b/67996923) Non-controller Slices should become intent-only slices.
@@ -218,6 +220,7 @@ class SliceDataConverter {
                        METADATA_UNAVAILABLE_SLICE_SUBTITLE);
                final boolean isPublicSlice = controller.isPublicSlice();
                final int highlightMenuRes = controller.getSliceHighlightMenuRes();
                final String userRestriction = bundle.getString(METADATA_USER_RESTRICTION);

                final SliceData xmlSlice = new SliceData.Builder()
                        .setKey(key)
@@ -232,6 +235,7 @@ class SliceDataConverter {
                        .setUnavailableSliceSubtitle(unavailableSliceSubtitle)
                        .setIsPublicSlice(isPublicSlice)
                        .setHighlightMenuRes(highlightMenuRes)
                        .setUserRestriction(userRestriction)
                        .build();

                xmlSliceData.add(xmlSlice);
Loading