From 01816f4cbbf61f8a1dfa2d04f448008f8836ffe9 Mon Sep 17 00:00:00 2001 From: yuemingw Date: Thu, 19 Apr 2018 12:12:11 +0100 Subject: [PATCH] Policy transparency dialog should be shown when SwitchBar is restricted. After ag/3818911, touch event of Switchbar is delegated to the switch. When the SwithBar is disabled by admin, switch is GONE and restricted icon is VISIBLE instead. We should let touch event be delegaed to restricted icon and show policy transparency dialog when it's clicked in this case. Bug: 77898233 Bug: 70206452 Test: Manually via setting disallow_share_location in TestDPC. Merged-In: Ifa4fa6ebbe7986277f5cd0951a399ea2377a39f9 Change-Id: If4a5349134e6f0e064561b4860966f950ce423b3 --- .../android/settings/widget/SwitchBar.java | 25 +++++++++++++++++-- .../settings/widget/SwitchBarTest.java | 13 ++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java index c33f6032cac..004e89c0ed6 100644 --- a/src/com/android/settings/widget/SwitchBar.java +++ b/src/com/android/settings/widget/SwitchBar.java @@ -25,6 +25,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.ColorInt; import android.support.annotation.StringRes; +import android.support.annotation.VisibleForTesting; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.TextAppearanceSpan; @@ -132,6 +133,17 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC (switchView, isChecked) -> setTextViewLabelAndBackground(isChecked)); mRestrictedIcon = findViewById(R.id.restricted_icon); + mRestrictedIcon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mDisabledByAdmin) { + mMetricsFeatureProvider.count(mContext, + mMetricsTag + "/switch_bar|restricted", 1); + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, + mEnforcedAdmin); + } + } + }); // Default is hide setVisibility(View.GONE); @@ -196,6 +208,11 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC mSwitch.setEnabled(enabled); } + @VisibleForTesting + View getDelegatingView() { + return mDisabledByAdmin ? mRestrictedIcon : mSwitch; + } + /** * If admin is not null, disables the text and switch but keeps the view clickable. * Otherwise, calls setEnabled which will enables the entire view including @@ -216,6 +233,8 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC mRestrictedIcon.setVisibility(View.GONE); setEnabled(true); } + setTouchDelegate(new TouchDelegate(new Rect(0, 0, getWidth(), getHeight()), + getDelegatingView())); } public final ToggleSwitch getSwitch() { @@ -228,7 +247,8 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC mSwitch.setOnCheckedChangeListener(this); // Make the entire bar work as a switch post(() -> setTouchDelegate( - new TouchDelegate(new Rect(0, 0, getWidth(), getHeight()), mSwitch))); + new TouchDelegate(new Rect(0, 0, getWidth(), getHeight()), + getDelegatingView()))); } } @@ -242,7 +262,8 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if ((w > 0) && (h > 0)) { - setTouchDelegate(new TouchDelegate(new Rect(0, 0, w, h), mSwitch)); + setTouchDelegate(new TouchDelegate(new Rect(0, 0, w, h), + getDelegatingView())); } } diff --git a/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java b/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java index bd99bbbbb8f..818daecd26d 100644 --- a/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java +++ b/tests/robotests/src/com/android/settings/widget/SwitchBarTest.java @@ -26,6 +26,7 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -82,4 +83,16 @@ public class SwitchBarTest { assertThat(((TextView) mBar.findViewById(R.id.switch_text)).getText()) .isEqualTo(mContext.getString(onText)); } + + @Test + public void disabledByAdmin_shouldDelegateToRestrictedIcon() { + mBar.setDisabledByAdmin(new EnforcedAdmin()); + assertThat(mBar.getDelegatingView().getId()).isEqualTo(R.id.restricted_icon); + } + + @Test + public void notDisabledByAdmin_shouldDelegateToSwitch() { + mBar.setDisabledByAdmin(null); + assertThat(mBar.getDelegatingView().getId()).isEqualTo(R.id.switch_widget); + } }