17ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka/*
27ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * Copyright (C) 2016 The Android Open Source Project
37ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka *
47ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
57ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * you may not use this file except in compliance with the License.
67ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * You may obtain a copy of the License at
77ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka *
87ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
97ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka *
107ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * Unless required by applicable law or agreed to in writing, software
117ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
127ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * See the License for the specific language governing permissions and
147ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * limitations under the License
157ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka */
167ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
177ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankapackage com.android.settingslib;
187ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
197ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.content.Context;
206823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shankaimport android.content.res.TypedArray;
217ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.os.UserHandle;
227ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.support.v4.content.res.TypedArrayUtils;
237ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.support.v7.preference.PreferenceManager;
247ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.support.v7.preference.PreferenceViewHolder;
257ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.support.v14.preference.SwitchPreference;
267ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport android.util.AttributeSet;
276823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shankaimport android.util.TypedValue;
28923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shankaimport android.view.View;
29923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shankaimport android.widget.TextView;
307ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
317ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
327ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
337ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka/**
347ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * Version of SwitchPreference that can be disabled by a device admin
357ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka * using a user restriction.
367ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka */
377ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shankapublic class RestrictedSwitchPreference extends SwitchPreference {
387ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    RestrictedPreferenceHelper mHelper;
396823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka    boolean mUseAdditionalSummary = false;
40a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka    String mRestrictedSwitchSummary = null;
417ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
427ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public RestrictedSwitchPreference(Context context, AttributeSet attrs,
437ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka            int defStyleAttr, int defStyleRes) {
447ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        super(context, attrs, defStyleAttr, defStyleRes);
45923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        setWidgetLayoutResource(R.layout.restricted_switch_widget);
467ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        mHelper = new RestrictedPreferenceHelper(context, this, attrs);
476823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka        if (attrs != null) {
486823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            final TypedArray attributes = context.obtainStyledAttributes(attrs,
49a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    R.styleable.RestrictedSwitchPreference);
50a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            final TypedValue useAdditionalSummary = attributes.peekValue(
51a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    R.styleable.RestrictedSwitchPreference_useAdditionalSummary);
526823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            if (useAdditionalSummary != null) {
536823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                mUseAdditionalSummary =
546823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                        (useAdditionalSummary.type == TypedValue.TYPE_INT_BOOLEAN
556823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                                && useAdditionalSummary.data != 0);
566823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            }
57a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka
58a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            final TypedValue restrictedSwitchSummary = attributes.peekValue(
59a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    R.styleable.RestrictedSwitchPreference_restrictedSwitchSummary);
60a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            CharSequence data = null;
61a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            if (restrictedSwitchSummary != null
62a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    && restrictedSwitchSummary.type == TypedValue.TYPE_STRING) {
63a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                if (restrictedSwitchSummary.resourceId != 0) {
64a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    data = context.getString(restrictedSwitchSummary.resourceId);
65a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                } else {
66a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    data = restrictedSwitchSummary.string;
67a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                }
68a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            }
69a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            mRestrictedSwitchSummary = data == null ? null : data.toString();
70a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka        }
71a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka        if (mRestrictedSwitchSummary == null) {
72a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka            mRestrictedSwitchSummary = context.getString(R.string.disabled_by_admin);
736823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka        }
746823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka        if (mUseAdditionalSummary) {
756823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            setLayoutResource(R.layout.restricted_switch_preference);
766823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            useAdminDisabledSummary(false);
776823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka        }
787ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
797ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
807ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public RestrictedSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
817ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        this(context, attrs, defStyleAttr, 0);
827ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
837ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
847ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public RestrictedSwitchPreference(Context context, AttributeSet attrs) {
855ff3ad6312086b87439bd8d3438a4476e2c14946Adam Lesinski        this(context, attrs, TypedArrayUtils.getAttr(context,
865ff3ad6312086b87439bd8d3438a4476e2c14946Adam Lesinski                android.support.v7.preference.R.attr.switchPreferenceStyle,
877ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka                android.R.attr.switchPreferenceStyle));
887ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
897ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
907ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public RestrictedSwitchPreference(Context context) {
917ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        this(context, null);
927ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
937ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
947ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    @Override
957ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public void onBindViewHolder(PreferenceViewHolder holder) {
967ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        super.onBindViewHolder(holder);
977ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        mHelper.onBindViewHolder(holder);
98923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
99923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        final View switchWidget = holder.findViewById(android.R.id.switch_widget);
100923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        if (restrictedIcon != null) {
101923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka            restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE);
102923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        }
103923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        if (switchWidget != null) {
104923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka            switchWidget.setVisibility(isDisabledByAdmin() ? View.GONE : View.VISIBLE);
105923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        }
1066823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka        if (mUseAdditionalSummary) {
1076823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            final TextView additionalSummaryView = (TextView) holder.findViewById(
1086823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                    R.id.additional_summary);
1096823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            if (additionalSummaryView != null) {
1106823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                if (isDisabledByAdmin()) {
111a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    additionalSummaryView.setText(mRestrictedSwitchSummary);
1126823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                    additionalSummaryView.setVisibility(View.VISIBLE);
1138f182f14540624e1af88ae91c9de493dea71fa6eSudheer Shanka                } else {
1148f182f14540624e1af88ae91c9de493dea71fa6eSudheer Shanka                    additionalSummaryView.setVisibility(View.GONE);
1156823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                }
1166823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            }
1176823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka        } else {
1186823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            final TextView summaryView = (TextView) holder.findViewById(android.R.id.summary);
1196823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            if (summaryView != null) {
1206823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                if (isDisabledByAdmin()) {
121a1790c3b35fc1ea7a80c132f0059873328e51e9eSudheer Shanka                    summaryView.setText(mRestrictedSwitchSummary);
1226823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                    summaryView.setVisibility(View.VISIBLE);
1236823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka                }
1248f182f14540624e1af88ae91c9de493dea71fa6eSudheer Shanka                // No need to change the visibility to GONE in the else case here since Preference
1258f182f14540624e1af88ae91c9de493dea71fa6eSudheer Shanka                // class would have already changed it if there is no summary to display.
1266823a8fc59f7b03ca9802e0e5e961f32e8cdea3aSudheer Shanka            }
127923bc74c9227a684095cf95d808766f5dcd31bb5Sudheer Shanka        }
1287ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1297ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
1307ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    @Override
1317ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public void performClick() {
1327ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        if (!mHelper.performClick()) {
1337ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka            super.performClick();
1347ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        }
1357ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1367ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
137145017303494e77026bd99ec41476f6f53225d95Sudheer Shanka    public void useAdminDisabledSummary(boolean useSummary) {
138145017303494e77026bd99ec41476f6f53225d95Sudheer Shanka        mHelper.useAdminDisabledSummary(useSummary);
139145017303494e77026bd99ec41476f6f53225d95Sudheer Shanka    }
140145017303494e77026bd99ec41476f6f53225d95Sudheer Shanka
1417ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    @Override
1427ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
1437ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        mHelper.onAttachedToHierarchy();
1447ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        super.onAttachedToHierarchy(preferenceManager);
1457ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1467ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
1477ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public void checkRestrictionAndSetDisabled(String userRestriction) {
1487ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId());
1497ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1507ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
1517ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public void checkRestrictionAndSetDisabled(String userRestriction, int userId) {
1527ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        mHelper.checkRestrictionAndSetDisabled(userRestriction, userId);
1537ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1547ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
155ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka    @Override
156ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka    public void setEnabled(boolean enabled) {
157ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka        if (enabled && isDisabledByAdmin()) {
158ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka            mHelper.setDisabledByAdmin(null);
159ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka            return;
160ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka        }
161ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka        super.setEnabled(enabled);
162ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka    }
163ea088af5c12e25995a3992413c8f413abc22eeabSudheer Shanka
1647ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public void setDisabledByAdmin(EnforcedAdmin admin) {
1657ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        if (mHelper.setDisabledByAdmin(admin)) {
1667ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka            notifyChanged();
1677ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        }
1687ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1697ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka
1707ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    public boolean isDisabledByAdmin() {
1717ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka        return mHelper.isDisabledByAdmin();
1727ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka    }
1737ff866d286cf4df0948feeffa6e67848740e64ebSudheer Shanka}
174