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