diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 0bb74791d8560..0b0f58bc3ef1b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -263,7 +263,7 @@ public class CellularTile extends QSTileImpl { } @Override - public void setNoSims(boolean show) { + public void setNoSims(boolean show, boolean simDetected) { mInfo.noSim = show; if (mInfo.noSim) { // Make sure signal gets cleared out when no sims. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 759d2cf2f8bce..274244ef26792 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -22,8 +22,6 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; -import android.graphics.drawable.Animatable; -import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.telephony.SubscriptionInfo; import android.util.ArraySet; @@ -53,6 +51,7 @@ import com.android.systemui.tuner.TunerService.Tunable; import java.util.ArrayList; import java.util.List; +import java.util.Objects; // Intimately tied to the design of res/layout/signal_cluster_view.xml public class SignalClusterView extends LinearLayout implements NetworkControllerImpl.SignalCallback, @@ -73,6 +72,7 @@ public class SignalClusterView extends LinearLayout implements NetworkController private boolean mNoSimsVisible = false; private boolean mVpnVisible = false; + private boolean mSimDetected; private int mVpnIconId = 0; private int mLastVpnIconId = -1; private boolean mEthernetVisible = false; @@ -327,8 +327,9 @@ public class SignalClusterView extends LinearLayout implements NetworkController } @Override - public void setNoSims(boolean show) { + public void setNoSims(boolean show, boolean simDetected) { mNoSimsVisible = show && !mBlockMobile; + mSimDetected = simDetected; apply(); } @@ -548,6 +549,23 @@ public class SignalClusterView extends LinearLayout implements NetworkController if (mNoSimsVisible) { mIconLogger.onIconShown(SLOT_MOBILE); mNoSimsCombo.setVisibility(View.VISIBLE); + if (!Objects.equals(mSimDetected, mNoSimsCombo.getTag())) { + mNoSimsCombo.setTag(mSimDetected); + if (mSimDetected) { + SignalDrawable d = new SignalDrawable(mNoSims.getContext()); + d.setDarkIntensity(0); + mNoSims.setImageDrawable(d); + mNoSims.setImageLevel(SignalDrawable.getEmptyState(4)); + + SignalDrawable dark = new SignalDrawable(mNoSims.getContext()); + dark.setDarkIntensity(1); + mNoSimsDark.setImageDrawable(dark); + mNoSimsDark.setImageLevel(SignalDrawable.getEmptyState(4)); + } else { + mNoSims.setImageResource(R.drawable.stat_sys_no_sims); + mNoSimsDark.setImageResource(R.drawable.stat_sys_no_sims); + } + } } else { mIconLogger.onIconHidden(SLOT_MOBILE); mNoSimsCombo.setVisibility(View.GONE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index a456786d712f6..5159e8d0cff01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -71,7 +71,7 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa break; case MSG_NO_SIM_VISIBLE_CHANGED: for (SignalCallback signalCluster : mSignalCallbacks) { - signalCluster.setNoSims(msg.arg1 != 0); + signalCluster.setNoSims(msg.arg1 != 0, msg.arg2 != 0); } break; case MSG_ETHERNET_CHANGED: @@ -144,8 +144,8 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa } @Override - public void setNoSims(boolean show) { - obtainMessage(MSG_NO_SIM_VISIBLE_CHANGED, show ? 1 : 0, 0).sendToTarget(); + public void setNoSims(boolean show, boolean simDetected) { + obtainMessage(MSG_NO_SIM_VISIBLE_CHANGED, show ? 1 : 0, simDetected ? 1 : 0).sendToTarget(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 2771011c69975..9eee906bd71c7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -52,7 +52,7 @@ public interface NetworkController extends CallbackController, D int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, String description, boolean isWide, int subId, boolean roaming) {} default void setSubs(List subs) {} - default void setNoSims(boolean show) {} + default void setNoSims(boolean show, boolean simDetected) {} default void setEthernetIndicators(IconState icon) {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index c217bda935c41..bb3e09f4bd1c2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -58,10 +58,8 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; @@ -116,7 +114,7 @@ public class NetworkControllerImpl extends BroadcastReceiver // States that don't belong to a subcontroller. private boolean mAirplaneMode = false; - private boolean mHasNoSims; + private boolean mHasNoSubs; private Locale mLocale = null; // This list holds our ordering. private List mCurrentSubscriptions = new ArrayList<>(); @@ -140,6 +138,7 @@ public class NetworkControllerImpl extends BroadcastReceiver @VisibleForTesting ServiceState mLastServiceState; private boolean mUserSetup; + private boolean mSimDetected; /** * Construct this controller object and register for updates. @@ -363,7 +362,7 @@ public class NetworkControllerImpl extends BroadcastReceiver cb.setSubs(mCurrentSubscriptions); cb.setIsAirplaneMode(new IconState(mAirplaneMode, TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext)); - cb.setNoSims(mHasNoSims); + cb.setNoSims(mHasNoSubs, mSimDetected); mWifiSignalController.notifyListeners(cb); mEthernetSignalController.notifyListeners(cb); for (int i = 0; i < mMobileSignalControllers.size(); i++) { @@ -498,13 +497,27 @@ public class NetworkControllerImpl extends BroadcastReceiver @VisibleForTesting protected void updateNoSims() { - boolean hasNoSims = mHasMobileDataFeature && mMobileSignalControllers.size() == 0; - if (hasNoSims != mHasNoSims) { - mHasNoSims = hasNoSims; - mCallbackHandler.setNoSims(mHasNoSims); + boolean hasNoSubs = mHasMobileDataFeature && mMobileSignalControllers.size() == 0; + boolean simDetected = hasAnySim(); + if (hasNoSubs != mHasNoSubs || simDetected != mSimDetected) { + mHasNoSubs = hasNoSubs; + mSimDetected = simDetected; + mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected); } } + private boolean hasAnySim() { + int simCount = mPhone.getSimCount(); + for (int i = 0; i < simCount; i++) { + int state = mPhone.getSimState(i); + if (state != TelephonyManager.SIM_STATE_ABSENT + && state != TelephonyManager.SIM_STATE_UNKNOWN) { + return true; + } + } + return false; + } + @VisibleForTesting void setCurrentSubscriptions(List subscriptions) { Collections.sort(subscriptions, new Comparator() { @@ -631,7 +644,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private void notifyListeners() { mCallbackHandler.setIsAirplaneMode(new IconState(mAirplaneMode, TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext)); - mCallbackHandler.setNoSims(mHasNoSims); + mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected); } /** @@ -822,8 +835,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } String nosim = args.getString("nosim"); if (nosim != null) { - mHasNoSims = nosim.equals("show"); - mCallbackHandler.setNoSims(mHasNoSims); + mHasNoSubs = nosim.equals("show"); + mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected); } String mobile = args.getString("mobile"); if (mobile != null) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 51bd7bccbe71a..e3558d46992a0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -161,12 +161,11 @@ public class CallbackHandlerTest extends SysuiTestCase { @Test public void testSignalCallback_setNoSims() { boolean noSims = true; - mHandler.setNoSims(noSims); + boolean simDetected = false; + mHandler.setNoSims(noSims, simDetected); waitForCallbacks(); - ArgumentCaptor noSimsArg = ArgumentCaptor.forClass(Boolean.class); - Mockito.verify(mSignalCallback).setNoSims(noSimsArg.capture()); - assertEquals(noSims, (boolean) noSimsArg.getValue()); + Mockito.verify(mSignalCallback).setNoSims(eq(noSims), eq(simDetected)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index bb7b197c2a05b..d14b23ea4e619 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -46,8 +46,6 @@ import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import java.io.PrintWriter; import java.io.StringWriter; @@ -292,10 +290,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } protected void verifyHasNoSims(boolean hasNoSimsVisible) { - ArgumentCaptor hasNoSimsArg = ArgumentCaptor.forClass(Boolean.class); - - Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture()); - assertEquals("No sims", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue()); + Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setNoSims( + eq(hasNoSimsVisible), eq(false)); } protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon,