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 d675f5e171179..81e3d5ad17de9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -19,7 +19,6 @@ package com.android.systemui.qs.tiles; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Intent; -import android.content.IntentFilter; import android.os.UserManager; import android.provider.Settings.Global; import android.service.quicksettings.Tile; @@ -32,24 +31,27 @@ import com.android.systemui.plugins.qs.QSTile.AirplaneBooleanState; import com.android.systemui.qs.GlobalSetting; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.tileimpl.QSTileImpl; +import com.android.systemui.statusbar.policy.DataSaverController; import com.android.systemui.statusbar.policy.HotspotController; /** Quick settings tile: Hotspot **/ public class HotspotTile extends QSTileImpl { - static final Intent TETHER_SETTINGS = new Intent().setComponent(new ComponentName( + private static final Intent TETHER_SETTINGS = new Intent().setComponent(new ComponentName( "com.android.settings", "com.android.settings.TetherSettings")); private final Icon mEnabledStatic = ResourceIcon.get(R.drawable.ic_hotspot); - private final Icon mUnavailable = ResourceIcon.get(R.drawable.ic_hotspot_unavailable); - private final HotspotController mController; - private final Callback mCallback = new Callback(); + private final HotspotController mHotspotController; + private final DataSaverController mDataSaverController; + + private final HotspotAndDataSaverCallbacks mCallbacks = new HotspotAndDataSaverCallbacks(); private final GlobalSetting mAirplaneMode; private boolean mListening; public HotspotTile(QSHost host) { super(host); - mController = Dependency.get(HotspotController.class); + mHotspotController = Dependency.get(HotspotController.class); + mDataSaverController = Dependency.get(DataSaverController.class); mAirplaneMode = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) { @Override protected void handleValueChanged(int value) { @@ -60,7 +62,7 @@ public class HotspotTile extends QSTileImpl { @Override public boolean isAvailable() { - return mController.isHotspotSupported(); + return mHotspotController.isHotspotSupported(); } @Override @@ -78,12 +80,12 @@ public class HotspotTile extends QSTileImpl { if (mListening == listening) return; mListening = listening; if (listening) { - mController.addCallback(mCallback); - final IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + mHotspotController.addCallback(mCallbacks); + mDataSaverController.addCallback(mCallbacks); refreshState(); } else { - mController.removeCallback(mCallback); + mHotspotController.removeCallback(mCallbacks); + mDataSaverController.removeCallback(mCallbacks); } mAirplaneMode.setListening(listening); } @@ -101,7 +103,7 @@ public class HotspotTile extends QSTileImpl { } // Immediately enter transient enabling state when turning hotspot on. refreshState(isEnabled ? null : ARG_SHOW_TRANSIENT_ENABLING); - mController.setHotspotEnabled(!isEnabled); + mHotspotController.setHotspotEnabled(!isEnabled); } @Override @@ -117,16 +119,20 @@ public class HotspotTile extends QSTileImpl { } final int numConnectedDevices; - final boolean isTransient = transientEnabling || mController.isHotspotTransient(); + final boolean isTransient = transientEnabling || mHotspotController.isHotspotTransient(); + final boolean isDataSaverEnabled; checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_CONFIG_TETHERING); + if (arg instanceof CallbackInfo) { - CallbackInfo info = (CallbackInfo) arg; - state.value = info.enabled; + final CallbackInfo info = (CallbackInfo) arg; + state.value = transientEnabling || info.isHotspotEnabled; numConnectedDevices = info.numConnectedDevices; + isDataSaverEnabled = info.isDataSaverEnabled; } else { - state.value = transientEnabling || mController.isHotspotEnabled(); - numConnectedDevices = mController.getNumConnectedDevices(); + state.value = transientEnabling || mHotspotController.isHotspotEnabled(); + numConnectedDevices = mHotspotController.getNumConnectedDevices(); + isDataSaverEnabled = mDataSaverController.isDataSaverEnabled(); } state.icon = mEnabledStatic; @@ -140,8 +146,14 @@ public class HotspotTile extends QSTileImpl { } state.expandedAccessibilityClassName = Switch.class.getName(); state.contentDescription = state.label; - state.state = state.isAirplaneMode ? Tile.STATE_UNAVAILABLE - : state.value || state.isTransient ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; + + final boolean isTileUnavailable = (state.isAirplaneMode || isDataSaverEnabled); + final boolean isTileActive = (state.value || state.isTransient); + state.state = isTileUnavailable + ? Tile.STATE_UNAVAILABLE + : isTileActive + ? Tile.STATE_ACTIVE + : Tile.STATE_INACTIVE; } @Nullable @@ -173,13 +185,23 @@ public class HotspotTile extends QSTileImpl { } } - private final class Callback implements HotspotController.Callback { - final CallbackInfo mCallbackInfo = new CallbackInfo(); + /** + * Listens to changes made to hotspot and data saver states (to toggle tile availability). + */ + private final class HotspotAndDataSaverCallbacks implements HotspotController.Callback, + DataSaverController.Listener { + CallbackInfo mCallbackInfo = new CallbackInfo(); @Override - public void onHotspotChanged(boolean enabled, int numConnectedDevices) { - mCallbackInfo.enabled = enabled; - mCallbackInfo.numConnectedDevices = numConnectedDevices; + public void onDataSaverChanged(boolean isDataSaving) { + mCallbackInfo.isDataSaverEnabled = isDataSaving; + refreshState(mCallbackInfo); + } + + @Override + public void onHotspotChanged(boolean enabled, int numDevices) { + mCallbackInfo.isHotspotEnabled = enabled; + mCallbackInfo.numConnectedDevices = numDevices; refreshState(mCallbackInfo); } } @@ -189,14 +211,16 @@ public class HotspotTile extends QSTileImpl { * {@link #handleUpdateState(State, Object)}. */ protected static final class CallbackInfo { - boolean enabled; + boolean isHotspotEnabled; int numConnectedDevices; + boolean isDataSaverEnabled; @Override public String toString() { return new StringBuilder("CallbackInfo[") - .append("enabled=").append(enabled) + .append("isHotspotEnabled=").append(isHotspotEnabled) .append(",numConnectedDevices=").append(numConnectedDevices) + .append(",isDataSaverEnabled=").append(isDataSaverEnabled) .append(']').toString(); } }