package com.james.status.data.icon; import android.content.Context; import android.os.Build; import android.telephony.PhoneStateListener; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.widget.Toast; import java.lang.reflect.Field; public class DualNetworkIconData extends NetworkIconData { private TelephonyManager telephonyManager; private SubscriptionManager subscriptionManager; private NetworkListener networkListener; private boolean isRegistered; public DualNetworkIconData(Context context) { super(context); telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); } @Override public void register() { if (telephonyManager != null) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && subscriptionManager != null) { if (networkListener == null) { int index = 0; for (SubscriptionInfo info : subscriptionManager.getActiveSubscriptionInfoList()) { if (info.getSimSlotIndex() > index) { networkListener = new NetworkListener(info.getSubscriptionId()); index = info.getSimSlotIndex(); } } } } if (networkListener != null) telephonyManager.listen(networkListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); } } isRegistered = true; } @Override public void unregister() { isRegistered = false; } private class NetworkListener extends PhoneStateListener { private NetworkListener(int id) { super(); try { Field field = this.getClass().getSuperclass().getDeclaredField("mSubId"); field.setAccessible(true); field.set(this, id); } catch (Exception e) { e.printStackTrace(); } } @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); if (isRegistered) { int level = signalStrength.getGsmSignalStrength(); if (level > 4) level /= 7.75; else if (level < 1) { int strength = signalStrength.getCdmaDbm(); if (strength < -100) level = 0; else if (strength < -95) level = 1; else if (strength < -85) level = 2; else if (strength < -75) level = 3; else if (strength != 0) level = 4; else { strength = signalStrength.getEvdoDbm(); if (strength == 0 || strength < -100) level = 0; else if (strength < -95) level = 1; else if (strength < -85) level = 2; else if (strength < -75) level = 3; else level = 4; } } onDrawableUpdate(level); } } } }