From 3f6208170df1e8635a5d45947a2703c895da6970 Mon Sep 17 00:00:00 2001 From: Zoltan Szatmary-Ban Date: Mon, 11 Apr 2016 19:56:03 +0100 Subject: [PATCH] Apply policy transparency to HotspotCondition and WiFi settings... ...when there is an active hotspot and user restriction for disallowing tether config is in effect. This is to avoid getting security exceptions from WifiManager when engaging with HotspotCondition or Wifi enable switch. Bug:27936528 Change-Id: Ib3324e853277c177966b55668758d349ffe6ecf5 --- res/layout/condition_card.xml | 2 ++ .../conditional/ConditionAdapterUtils.java | 15 ++++++++--- .../conditional/HotspotCondition.java | 23 +++++++++++++--- .../android/settings/wifi/WifiEnabler.java | 27 ++++++++++++++++--- 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/res/layout/condition_card.xml b/res/layout/condition_card.xml index 0e480a5b435..c1224b5244a 100644 --- a/res/layout/condition_card.xml +++ b/res/layout/condition_card.xml @@ -85,11 +85,13 @@ 0); } if (isExpanded) { view.summary.setText(condition.getSummary()); - CharSequence[] actions = condition.getActions(); for (int i = 0; i < 2; i++) { Button button = (Button) detailGroup.findViewById(i == 0 ? R.id.first_action : R.id.second_action); @@ -105,7 +105,9 @@ public class ConditionAdapterUtils { } private static void animateChange(final View view, final View content, - final View detailGroup, final boolean visible) { + final View detailGroup, final boolean visible, final boolean hasButtons) { + setViewVisibility(detailGroup, R.id.divider, hasButtons); + setViewVisibility(detailGroup, R.id.buttonBar, hasButtons); final int beforeBottom = content.getBottom(); setHeight(detailGroup, visible ? LayoutParams.WRAP_CONTENT : 0); detailGroup.setVisibility(View.VISIBLE); @@ -138,4 +140,11 @@ public class ConditionAdapterUtils { params.height = height; detailGroup.setLayoutParams(params); } + + private static void setViewVisibility(View containerView, int viewId, boolean visible) { + View view = containerView.findViewById(viewId); + if (view != null) { + view.setVisibility(visible ? View.VISIBLE : View.GONE); + } + } } diff --git a/src/com/android/settings/dashboard/conditional/HotspotCondition.java b/src/com/android/settings/dashboard/conditional/HotspotCondition.java index be74c9e0da2..17be591e6af 100644 --- a/src/com/android/settings/dashboard/conditional/HotspotCondition.java +++ b/src/com/android/settings/dashboard/conditional/HotspotCondition.java @@ -21,10 +21,15 @@ import android.content.Intent; import android.graphics.drawable.Icon; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.os.UserHandle; +import android.os.UserManager; + import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.TetherSettings; import com.android.settings.Utils; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.TetherUtil; public class HotspotCondition extends Condition { @@ -74,7 +79,12 @@ public class HotspotCondition extends Condition { @Override public CharSequence[] getActions() { - return new CharSequence[] { mManager.getContext().getString(R.string.condition_turn_off) }; + final Context context = mManager.getContext(); + if (RestrictedLockUtils.hasBaseUserRestriction(context, + UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId())) { + return new CharSequence[0]; + } + return new CharSequence[] { context.getString(R.string.condition_turn_off) }; } @Override @@ -86,8 +96,15 @@ public class HotspotCondition extends Condition { @Override public void onActionClick(int index) { if (index == 0) { - TetherUtil.setWifiTethering(false, mManager.getContext()); - setActive(false); + final Context context = mManager.getContext(); + final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(context, + UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()); + if (admin != null) { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, admin); + } else { + TetherUtil.setWifiTethering(false, context); + setActive(false); + } } else { throw new IllegalArgumentException("Unexpected index " + index); } diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java index 2ff404d0f36..f064050b671 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -26,6 +26,8 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Message; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.widget.Switch; import android.widget.Toast; @@ -35,6 +37,8 @@ import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.search.Index; import com.android.settings.widget.SwitchBar; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.WirelessUtils; import java.util.concurrent.atomic.AtomicBoolean; @@ -136,6 +140,9 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener { } private void handleWifiStateChanged(int state) { + // Clear any previous state + mSwitchBar.setDisabledByAdmin(null); + switch (state) { case WifiManager.WIFI_STATE_ENABLING: mSwitchBar.setEnabled(false); @@ -158,6 +165,16 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener { mSwitchBar.setEnabled(true); updateSearchIndex(false); } + if (mayDisableTethering(!mSwitchBar.isChecked())) { + if (RestrictedLockUtils.hasBaseUserRestriction(mContext, + UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId())) { + mSwitchBar.setEnabled(false); + } else { + final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext, + UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()); + mSwitchBar.setDisabledByAdmin(admin); + } + } } private void updateSearchIndex(boolean isWiFiOn) { @@ -206,9 +223,7 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener { } // Disable tethering if enabling Wifi - int wifiApState = mWifiManager.getWifiApState(); - if (isChecked && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || - (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) { + if (mayDisableTethering(isChecked)) { mWifiManager.setWifiApEnabled(null, false); } MetricsLogger.action(mContext, @@ -219,4 +234,10 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener { Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show(); } } + + private boolean mayDisableTethering(boolean isChecked) { + final int wifiApState = mWifiManager.getWifiApState(); + return isChecked && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || + (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED)); + } }