Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef81cbde authored by Bill Lin's avatar Bill Lin
Browse files

Device show "No SIM card" and then showing carrier name during boot

Keyguard default show NO SIM earlier than Telephony/Subscription callback
Refactor CarrierText & KeyguardUpdateMonitor
 - Replace setup flag by resource attr(showMissingSim/showAirplaneMode)
 - Remove setDiplayFlags API, and add mTelephonyCapable flag
 - Implement MSG_TELEPHONY_CAPABLE in KeyguardUpdateMonitor
 - Default do not show AirplaneMode & NO_SIM label unless define in xml

Bug: 109731429
Test: atest SystemUITests
      atest frameworks/base/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
      Manual:
         1) Insert SIM and reboot device, only show "No Service"->"Operator"
	 2) Remove SIM and reboot device, only show "No SIM"
	 3) Enable AirplaneMode reboot, only show "Airplane mode"
	 4) Insert SIM and trigger sysui crash, state same as 1)
	 5) Remove SIM and trigger sysui crash, state same as 2)
	 6) Enable APM trigger sysui crash, state same as 3)
	 7) Enable APM & WFC, turn on wifi in keyguard showing
	    -> "Airplane mode" -> "" -> "WiFi Calling"
	 8) Enable APM & WFC, turn off wifi in keyguard showing
	    -> "Wifi Calling" -> "Airplane mode"

Change-Id: I4459997420484431751a4c088aa3856724affe6a
parent 69416026
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -38,9 +38,5 @@
        <attr name="android:textColor" format="color" />
    </declare-styleable>

    <declare-styleable name="CarrierText">
        <attr name="allCaps" format="boolean" />
    </declare-styleable>

    <attr name="passwordStyle" format="reference" />
</resources>
+4 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
<!-- Extends RelativeLayout -->
<com.android.systemui.statusbar.phone.KeyguardStatusBarView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
    xmlns:systemui="http://schemas.android.com/apk/res-auto"
    android:id="@+id/keyguard_header"
    android:layout_width="match_parent"
    android:layout_height="@dimen/status_bar_header_height_keyguard"
@@ -73,6 +73,8 @@
        android:textDirection="locale"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="?attr/wallpaperTextColorSecondary"
        android:singleLine="true" />
        android:singleLine="true"
        systemui:showMissingSim="true"
        systemui:showAirplaneMode="true" />

</com.android.systemui.statusbar.phone.KeyguardStatusBarView>
+7 −0
Original line number Diff line number Diff line
@@ -146,5 +146,12 @@
    <!-- Used to style charging animation AVD animation -->
    <attr name="chargingAnimColor" format="color" />

    <!-- Used display CarrierText in Keyguard or QS Footer -->
    <declare-styleable name="CarrierText">
        <attr name="allCaps" format="boolean" />
        <attr name="showMissingSim" format="boolean" />
        <attr name="showAirplaneMode" format="boolean" />
    </declare-styleable>

</resources>
+31 −19
Original line number Diff line number Diff line
@@ -43,11 +43,6 @@ import com.android.settingslib.WirelessUtils;
import android.telephony.TelephonyManager;

public class CarrierText extends TextView {
    /** Do not show missing sim message. */
    public static final int FLAG_HIDE_MISSING_SIM = 1 << 0;
    /** Do not show airplane mode message. */
    public static final int FLAG_HIDE_AIRPLANE_MODE = 1 << 1;

    private static final boolean DEBUG = KeyguardConstants.DEBUG;
    private static final String TAG = "CarrierText";

@@ -55,17 +50,23 @@ public class CarrierText extends TextView {

    private final boolean mIsEmergencyCallCapable;

    private boolean mTelephonyCapable;

    private boolean mShowMissingSim;

    private boolean mShowAirplaneMode;

    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;

    private WifiManager mWifiManager;

    private boolean[] mSimErrorState = new boolean[TelephonyManager.getDefault().getPhoneCount()];

    private int mFlags;

    private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
    private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
        @Override
        public void onRefreshCarrierInfo() {
            if (DEBUG) Log.d(TAG, "onRefreshCarrierInfo(), mTelephonyCapable: "
                    + Boolean.toString(mTelephonyCapable));
            updateCarrierText();
        }

@@ -77,9 +78,18 @@ public class CarrierText extends TextView {
            setSelected(true);
        };

        @Override
        public void onTelephonyCapable(boolean capable) {
            if (DEBUG) Log.d(TAG, "onTelephonyCapable() mTelephonyCapable: "
                    + Boolean.toString(capable));
            mTelephonyCapable = capable;
            updateCarrierText();
        }

        public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) {
            if (slotId < 0) {
                Log.d(TAG, "onSimStateChanged() - slotId invalid: " + slotId);
                Log.d(TAG, "onSimStateChanged() - slotId invalid: " + slotId
                        + " mTelephonyCapable: " + Boolean.toString(mTelephonyCapable));
                return;
            }

@@ -91,12 +101,8 @@ public class CarrierText extends TextView {
                mSimErrorState[slotId] = false;
                updateCarrierText();
            }
        };
    };

    public void setDisplayFlags(int flags) {
        mFlags = flags;
        }
    };

    /**
     * The status of this lock screen. Primarily used for widgets on LockScreen.
@@ -110,7 +116,8 @@ public class CarrierText extends TextView {
        SimLocked, // SIM card is currently locked
        SimPermDisabled, // SIM card is permanently disabled due to PUK unlock failure
        SimNotReady, // SIM is not ready yet. May never be on devices w/o a SIM.
        SimIoError; // SIM card is faulty
        SimIoError, // SIM card is faulty
        SimUnknown // SIM card is unknown
    }

    public CarrierText(Context context) {
@@ -126,6 +133,8 @@ public class CarrierText extends TextView {
                attrs, R.styleable.CarrierText, 0, 0);
        try {
            useAllCaps = a.getBoolean(R.styleable.CarrierText_allCaps, false);
            mShowAirplaneMode = a.getBoolean(R.styleable.CarrierText_showAirplaneMode, false);
            mShowMissingSim = a.getBoolean(R.styleable.CarrierText_showMissingSim, false);
        } finally {
            a.recycle();
        }
@@ -249,12 +258,12 @@ public class CarrierText extends TextView {
    }

    private String getMissingSimMessage() {
        return (mFlags & FLAG_HIDE_MISSING_SIM) == 0
        return mShowMissingSim && mTelephonyCapable
                ? getContext().getString(R.string.keyguard_missing_sim_message_short) : "";
    }

    private String getAirplaneModeMessage() {
        return (mFlags & FLAG_HIDE_AIRPLANE_MODE) == 0
        return mShowAirplaneMode
                ? getContext().getString(R.string.airplane_mode) : "";
    }

@@ -360,6 +369,9 @@ public class CarrierText extends TextView {
                        getContext().getText(R.string.keyguard_sim_error_message_short),
                        text);
                break;
            case SimUnknown:
                carrierText = null;
                break;
        }

        return carrierText;
@@ -408,11 +420,11 @@ public class CarrierText extends TextView {
            case PERM_DISABLED:
                return StatusMode.SimPermDisabled;
            case UNKNOWN:
                return StatusMode.SimMissing;
                return StatusMode.SimUnknown;
            case CARD_IO_ERROR:
                return StatusMode.SimIoError;
        }
        return StatusMode.SimMissing;
        return StatusMode.SimUnknown;
    }

    private static CharSequence concatenate(CharSequence plmn, CharSequence spn) {
+48 −2
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.recents.misc.SysUiTaskStackChangeListener;
import com.android.systemui.shared.system.ActivityManagerWrapper;

@@ -148,6 +149,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    private static final int MSG_ASSISTANT_STACK_CHANGED = 335;
    private static final int MSG_BIOMETRIC_AUTHENTICATION_CONTINUE = 336;
    private static final int MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED = 337;
    private static final int MSG_TELEPHONY_CAPABLE = 338;

    /** Biometric authentication state: Not listening. */
    private static final int BIOMETRIC_STATE_STOPPED = 0;
@@ -204,6 +206,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    private boolean mHasLockscreenWallpaper;
    private boolean mAssistantVisible;
    private boolean mKeyguardOccluded;
    @VisibleForTesting
    protected boolean mTelephonyCapable;

    // Device provisioning state
    private boolean mDeviceProvisioned;
@@ -344,6 +348,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                case MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED:
                    updateLogoutEnabled();
                    break;
                case MSG_TELEPHONY_CAPABLE:
                    updateTelephonyCapable((boolean)msg.obj);
                    break;
                default:
                    super.handleMessage(msg);
                    break;
@@ -962,14 +969,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                                maxChargingMicroWatt));
                mHandler.sendMessage(msg);
            } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
                SimData args = SimData.fromIntent(intent);
                // ACTION_SIM_STATE_CHANGED is rebroadcast after unlocking the device to
                // keep compatibility with apps that aren't direct boot aware.
                // SysUI should just ignore this broadcast because it was already received
                // and processed previously.
                if (intent.getBooleanExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, false)) {
                    // Guarantee mTelephonyCapable state after SysUI crash and restart
                    if (args.simState == State.ABSENT) {
                        mHandler.obtainMessage(MSG_TELEPHONY_CAPABLE, true).sendToTarget();
                    }
                    return;
                }
                SimData args = SimData.fromIntent(intent);
                if (DEBUG_SIM_STATES) {
                    Log.v(TAG, "action " + action
                        + " state: " + intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)
@@ -1467,6 +1478,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        mUserManager = context.getSystemService(UserManager.class);
        mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
        mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled();
        updateAirplaneModeState();
    }

    private void updateAirplaneModeState() {
        // ACTION_AIRPLANE_MODE_CHANGED do not broadcast if device set AirplaneMode ON and boot
        if (!WirelessUtils.isAirplaneModeOn(mContext)
                || mHandler.hasMessages(MSG_AIRPLANE_MODE_CHANGED)) {
            return;
        }
        mHandler.sendEmptyMessage(MSG_AIRPLANE_MODE_CHANGED);
    }

    private void updateBiometricListeningState() {
@@ -1822,6 +1843,23 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        }
    }

    /**
     * Handle Telephony status during Boot for CarrierText display policy
     */
    @VisibleForTesting
    void updateTelephonyCapable(boolean capable){
        if (capable == mTelephonyCapable) {
            return;
        }
        mTelephonyCapable = capable;
        for (WeakReference<KeyguardUpdateMonitorCallback> ref : mCallbacks) {
            KeyguardUpdateMonitorCallback cb = ref.get();
            if (cb != null) {
                cb.onTelephonyCapable(mTelephonyCapable);
            }
        }
    }

    /**
     * Handle {@link #MSG_SIM_STATE_CHANGE}
     */
@@ -1835,6 +1873,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {

        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            Log.w(TAG, "invalid subId in handleSimStateChange()");
            /* Only handle No SIM(ABSENT) due to handleServiceStateChange() handle other case */
            if (state == State.ABSENT) {
                updateTelephonyCapable(true);
            }
            return;
        }

@@ -1863,7 +1905,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    /**
     * Handle {@link #MSG_SERVICE_STATE_CHANGE}
     */
    private void handleServiceStateChange(int subId, ServiceState serviceState) {
    @VisibleForTesting
    void handleServiceStateChange(int subId, ServiceState serviceState) {
        if (DEBUG) {
            Log.d(TAG,
                    "handleServiceStateChange(subId=" + subId + ", serviceState=" + serviceState);
@@ -1872,6 +1915,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            Log.w(TAG, "invalid subId in handleServiceStateChange()");
            return;
        } else {
            updateTelephonyCapable(true);
        }

        mServiceStates.put(subId, serviceState);
@@ -2035,6 +2080,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        callback.onRefreshCarrierInfo();
        callback.onClockVisibilityChanged();
        callback.onKeyguardVisibilityChangedRaw(mKeyguardIsVisible);
        callback.onTelephonyCapable(mTelephonyCapable);
        for (Entry<Integer, SimData> data : mSimDatas.entrySet()) {
            final SimData state = data.getValue();
            callback.onSimStateChanged(state.subId, state.slotId, state.simState);
Loading