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

Commit 98e0b146 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Make PhoneStateListeners not call TelephonyManager

Since the StatusBarPolicy is run in the System Process and shouldn't therefore call into
the Telephony process we decided to make sure all the needed info was passed along with the
original notifications.

bug: 2173053
parent 1184313c
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -94,6 +94,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {

    private Bundle mCellLocation = new Bundle();

    private int mDataConnectionNetworkType;

    static final int PHONE_STATE_PERMISSION_MASK =
                PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR |
                PhoneStateListener.LISTEN_CALL_STATE |
@@ -187,7 +189,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
                    }
                    if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) {
                        try {
                            r.callback.onDataConnectionStateChanged(mDataConnectionState);
                            r.callback.onDataConnectionStateChanged(mDataConnectionState,
                                mDataConnectionNetworkType);
                        } catch (RemoteException ex) {
                            remove(r.binder);
                        }
@@ -345,7 +348,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
    }

    public void notifyDataConnection(int state, boolean isDataConnectivityPossible,
            String reason, String apn, String[] apnTypes, String interfaceName) {
            String reason, String apn, String[] apnTypes, String interfaceName, int networkType) {
        if (!checkNotifyPermission("notifyDataConnection()" )) {
            return;
        }
@@ -356,11 +359,12 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
            mDataConnectionApn = apn;
            mDataConnectionApnTypes = apnTypes;
            mDataConnectionInterfaceName = interfaceName;
            mDataConnectionNetworkType = networkType;
            for (int i = mRecords.size() - 1; i >= 0; i--) {
                Record r = mRecords.get(i);
                if ((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) {
                    try {
                        r.callback.onDataConnectionStateChanged(state);
                        r.callback.onDataConnectionStateChanged(state, networkType);
                    } catch (RemoteException ex) {
                        remove(r.binder);
                    }
+9 −9
Original line number Diff line number Diff line
@@ -782,7 +782,7 @@ public class StatusBarPolicy {
        public void onServiceStateChanged(ServiceState state) {
            mServiceState = state;
            updateSignalStrength();
            updateCdmaRoamingIcon();
            updateCdmaRoamingIcon(state);
            updateDataIcon();
        }

@@ -796,9 +796,9 @@ public class StatusBarPolicy {
        }

        @Override
        public void onDataConnectionStateChanged(int state) {
        public void onDataConnectionStateChanged(int state, int networkType) {
            mDataState = state;
            updateDataNetType();
            updateDataNetType(networkType);
            updateDataIcon();
        }

@@ -835,7 +835,7 @@ public class StatusBarPolicy {
    }

    private boolean isCdma() {
        return ((mPhone != null) && (mPhone.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA));
        return (mSignalStrength != null) && !mSignalStrength.isGsm();
    }

    private boolean isEvdo() {
@@ -889,6 +889,7 @@ public class StatusBarPolicy {
            else if (asu >= 4)  iconLevel = 2;
            else iconLevel = 1;

            // Though mPhone is a Manager, this call is not an IPC
            if (mPhone.isNetworkRoaming()) {
                iconList = sSignalImages_r;
            } else {
@@ -956,8 +957,7 @@ public class StatusBarPolicy {
        return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
    }

    private final void updateDataNetType() {
        int net = mPhone.getNetworkType();
    private final void updateDataNetType(int net) {

        switch (net) {
        case TelephonyManager.NETWORK_TYPE_EDGE:
@@ -1211,7 +1211,7 @@ public class StatusBarPolicy {
        }
    }

    private final void updateCdmaRoamingIcon() {
    private final void updateCdmaRoamingIcon(ServiceState state) {
        if (!hasService()) {
            mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
            return;
@@ -1223,8 +1223,8 @@ public class StatusBarPolicy {
        }

        int[] iconList = sRoamingIndicatorImages_cdma;
        int iconIndex = mPhone.getCdmaEriIconIndex();
        int iconMode = mPhone.getCdmaEriIconMode();
        int iconIndex = state.getCdmaEriIconIndex();
        int iconMode = state.getCdmaEriIconMode();

        if (iconIndex == -1) {
            Log.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update");
+11 −2
Original line number Diff line number Diff line
@@ -205,6 +205,13 @@ public class PhoneStateListener {
        // default implementation empty
    }

    /**
     * @hide
     * same as above, but with the network type.  Both called.
     */
    public void onDataConnectionStateChanged(int state, int networkType) {
    }

    /**
     * Callback invoked when data activity state changes.
     *
@@ -264,8 +271,9 @@ public class PhoneStateListener {
            Message.obtain(mHandler, LISTEN_CALL_STATE, state, 0, incomingNumber).sendToTarget();
        }

        public void onDataConnectionStateChanged(int state) {
            Message.obtain(mHandler, LISTEN_DATA_CONNECTION_STATE, state, 0, null).sendToTarget();
        public void onDataConnectionStateChanged(int state, int networkType) {
            Message.obtain(mHandler, LISTEN_DATA_CONNECTION_STATE, state, networkType, null).
                    sendToTarget();
        }

        public void onDataActivity(int direction) {
@@ -299,6 +307,7 @@ public class PhoneStateListener {
                    PhoneStateListener.this.onCallStateChanged(msg.arg1, (String)msg.obj);
                    break;
                case LISTEN_DATA_CONNECTION_STATE:
                    PhoneStateListener.this.onDataConnectionStateChanged(msg.arg1, msg.arg2);
                    PhoneStateListener.this.onDataConnectionStateChanged(msg.arg1);
                    break;
                case LISTEN_DATA_ACTIVITY:
+41 −0
Original line number Diff line number Diff line
@@ -120,6 +120,8 @@ public class ServiceState implements Parcelable {
    private int mSystemId;
    private int mCdmaRoamingIndicator;
    private int mCdmaDefaultRoamingIndicator;
    private int mCdmaEriIconIndex;
    private int mCdmaEriIconMode;

    /**
     * Create a new ServiceState from a intent notifier Bundle
@@ -166,6 +168,8 @@ public class ServiceState implements Parcelable {
        mSystemId = s.mSystemId;
        mCdmaRoamingIndicator = s.mCdmaRoamingIndicator;
        mCdmaDefaultRoamingIndicator = s.mCdmaDefaultRoamingIndicator;
        mCdmaEriIconIndex = s.mCdmaEriIconIndex;
        mCdmaEriIconMode = s.mCdmaEriIconMode;
    }

    /**
@@ -184,6 +188,8 @@ public class ServiceState implements Parcelable {
        mSystemId = in.readInt();
        mCdmaRoamingIndicator = in.readInt();
        mCdmaDefaultRoamingIndicator = in.readInt();
        mCdmaEriIconIndex = in.readInt();
        mCdmaEriIconMode = in.readInt();
    }

    public void writeToParcel(Parcel out, int flags) {
@@ -199,6 +205,8 @@ public class ServiceState implements Parcelable {
        out.writeInt(mSystemId);
        out.writeInt(mCdmaRoamingIndicator);
        out.writeInt(mCdmaDefaultRoamingIndicator);
        out.writeInt(mCdmaEriIconIndex);
        out.writeInt(mCdmaEriIconMode);
    }

    public int describeContents() {
@@ -253,6 +261,20 @@ public class ServiceState implements Parcelable {
        return this.mCdmaDefaultRoamingIndicator;
    }

    /**
     * @hide
     */
    public int getCdmaEriIconIndex() {
        return this.mCdmaEriIconIndex;
    }

    /**
     * @hide
     */
    public int getCdmaEriIconMode() {
        return this.mCdmaEriIconMode;
    }

    /**
     * Get current registered operator name in long alphanumeric format
     *
@@ -412,8 +434,11 @@ public class ServiceState implements Parcelable {
        mSystemId = -1;
        mCdmaRoamingIndicator = -1;
        mCdmaDefaultRoamingIndicator = -1;
        mCdmaEriIconIndex = -1;
        mCdmaEriIconMode = -1;
    }

    // TODO - can't this be combined with the above func..
    public void setStateOff() {
        mState = STATE_POWER_OFF;
        mRoaming = false;
@@ -427,6 +452,8 @@ public class ServiceState implements Parcelable {
        mSystemId = -1;
        mCdmaRoamingIndicator = -1;
        mCdmaDefaultRoamingIndicator = -1;
        mCdmaEriIconIndex = -1;
        mCdmaEriIconMode = -1;
    }

    public void setState(int state) {
@@ -451,6 +478,20 @@ public class ServiceState implements Parcelable {
        this.mCdmaDefaultRoamingIndicator = roaming;
    }

    /**
     * @hide
     */
    public void setCdmaEriIconIndex(int index) {
        this.mCdmaEriIconIndex = index;
    }

    /**
     * @hide
     */
    public void setCdmaEriIconMode(int mode) {
        this.mCdmaEriIconMode = mode;
    }

    public void setOperatorName(String longName, String shortName, String numeric) {
        mOperatorAlphaLong = longName;
        mOperatorAlphaShort = shortName;
+4 −1
Original line number Diff line number Diff line
@@ -93,13 +93,16 @@ public class DefaultPhoneNotifier implements PhoneNotifier {
    }

    public void notifyDataConnection(Phone sender, String reason) {
        TelephonyManager telephony = TelephonyManager.getDefault();
        try {
            mRegistry.notifyDataConnection(
                    convertDataState(sender.getDataConnectionState()),
                    sender.isDataConnectivityPossible(), reason,
                    sender.getActiveApn(),
                    sender.getActiveApnTypes(),
                    sender.getInterfaceName(null));
                    sender.getInterfaceName(null),
                    ((telephony!=null) ? telephony.getNetworkType() :
                    TelephonyManager.NETWORK_TYPE_UNKNOWN));
        } catch (RemoteException ex) {
            // system process is dead
        }
Loading