diff --git a/packages/SystemUI/res/drawable/ic_hotspot_unavailable.xml b/packages/SystemUI/res/drawable/ic_hotspot_unavailable.xml new file mode 100644 index 0000000000000..736cfd8256b4a --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_hotspot_unavailable.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 3587262400d5d..1c134c1e1424e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -16,15 +16,22 @@ package com.android.systemui.qs.tiles; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.UserManager; import android.provider.Settings; +import android.provider.Settings.Global; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; import android.widget.Switch; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.qs.GlobalSetting; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.HotspotController; @@ -36,12 +43,22 @@ public class HotspotTile extends QSTile { private final AnimationIcon mDisable = new AnimationIcon(R.drawable.ic_hotspot_disable_animation, R.drawable.ic_hotspot_enable); + private final Icon mUnavailable = + ResourceIcon.get(R.drawable.ic_hotspot_unavailable); private final HotspotController mController; private final Callback mCallback = new Callback(); + private final GlobalSetting mAirplaneMode; + private boolean mListening; public HotspotTile(Host host) { super(host); mController = host.getHotspotController(); + mAirplaneMode = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) { + @Override + protected void handleValueChanged(int value) { + refreshState(); + } + }; } @Override @@ -61,11 +78,18 @@ public class HotspotTile extends QSTile { @Override public void setListening(boolean listening) { + if (mListening == listening) return; + mListening = listening; if (listening) { mController.addCallback(mCallback); + final IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + mContext.registerReceiver(mReceiver, filter); } else { mController.removeCallback(mCallback); + mContext.unregisterReceiver(mReceiver); } + mAirplaneMode.setListening(listening); } @Override @@ -76,6 +100,9 @@ public class HotspotTile extends QSTile { @Override protected void handleClick() { final boolean isEnabled = (Boolean) mState.value; + if (!isEnabled && mAirplaneMode.getValue() != 0) { + return; + } MetricsLogger.action(mContext, getMetricsCategory(), !isEnabled); mController.setHotspotEnabled(!isEnabled); } @@ -96,6 +123,13 @@ public class HotspotTile extends QSTile { state.value = mController.isHotspotEnabled(); } state.icon = state.value ? mEnable : mDisable; + if (mAirplaneMode.getValue() != 0) { + final int disabledColor = mHost.getContext().getColor(R.color.qs_tile_tint_unavailable); + state.label = new SpannableStringBuilder().append(state.label, + new ForegroundColorSpan(disabledColor), + SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE); + state.icon = mUnavailable; + } state.minimalAccessibilityClassName = state.expandedAccessibilityClassName = Switch.class.getName(); state.contentDescription = state.label; @@ -121,4 +155,13 @@ public class HotspotTile extends QSTile { refreshState(enabled); } }; + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) { + refreshState(); + } + } + }; }