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
diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java
index c33f603..004e89c 100644
--- a/src/com/android/settings/widget/SwitchBar.java
+++ b/src/com/android/settings/widget/SwitchBar.java
@@ -25,6 +25,7 @@
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 @@
(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 @@
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 @@
mRestrictedIcon.setVisibility(View.GONE);
setEnabled(true);
}
+ setTouchDelegate(new TouchDelegate(new Rect(0, 0, getWidth(), getHeight()),
+ getDelegatingView()));
}
public final ToggleSwitch getSwitch() {
@@ -228,7 +247,8 @@
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 @@
@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 bd99bbb..818daec 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 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 @@
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);
+ }
}