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

Commit 24f2a954 authored by Brad Ebinger's avatar Brad Ebinger Committed by Android (Google) Code Review
Browse files

Merge changes from topic "ims_imsservice_apis"

* changes:
  Adds compat layer for older devices when IMS binding
  Create ImsService API compat layer
  Change ImsService API namespaces
  Integrate new MMTel APIs into the platform
  Integrate new ImsCallSessionListener
parents 1c2adde4 9ed21a87
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -2251,8 +2251,14 @@ public class GsmCdmaPhone extends Phone {
                        config_switch_phone_on_voice_reg_state_change)) {
                        config_switch_phone_on_voice_reg_state_change)) {
                    mCi.getVoiceRadioTechnology(obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE));
                    mCi.getVoiceRadioTechnology(obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE));
                }
                }
                // Force update IMS service
                // Force update IMS service if it is available, if it isn't the config will be
                ImsManager.getInstance(mContext, mPhoneId).updateImsServiceConfig(true);
                // updated when ImsPhoneCallTracker opens a connection.
                ImsManager imsManager = ImsManager.getInstance(mContext, mPhoneId);
                if (imsManager.isServiceAvailable()) {
                    imsManager.updateImsServiceConfig(true);
                } else {
                    logd("ImsManager is not available to update CarrierConfig.");
                }


                // Update broadcastEmergencyCallStateChanges
                // Update broadcastEmergencyCallStateChanges
                CarrierConfigManager configMgr = (CarrierConfigManager)
                CarrierConfigManager configMgr = (CarrierConfigManager)
+25 −31
Original line number Original line Diff line number Diff line
@@ -16,32 +16,25 @@


package com.android.internal.telephony;
package com.android.internal.telephony;


import android.app.Activity;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.Message;
import android.os.Message;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.provider.Telephony.Sms;
import android.content.Intent;
import android.telephony.Rlog;
import android.telephony.Rlog;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.aidl.IImsSmsListener;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.ims.stub.ImsSmsImplBase;
import android.telephony.ims.stub.ImsSmsImplBase.SendStatusResult;
import android.provider.Telephony.Sms.Intents;
import android.util.Pair;


import com.android.ims.ImsException;
import com.android.ims.ImsException;
import com.android.ims.ImsManager;
import com.android.ims.ImsManager;
import com.android.ims.ImsServiceProxy;
import com.android.ims.MmTelFeatureConnection;
import com.android.ims.internal.IImsSmsListener;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.util.SMSDispatcherUtil;
import com.android.internal.telephony.util.SMSDispatcherUtil;
import com.android.internal.telephony.gsm.SmsMessage;

import android.telephony.ims.internal.feature.ImsFeature;
import android.telephony.ims.internal.feature.MmTelFeature;
import android.telephony.ims.internal.stub.SmsImplBase;
import android.telephony.ims.internal.stub.SmsImplBase.SendStatusResult;
import android.telephony.ims.internal.stub.SmsImplBase.StatusReportResult;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.provider.Telephony.Sms.Intents;
import android.util.Pair;


import java.util.HashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Map;
@@ -51,6 +44,7 @@ import java.util.concurrent.atomic.AtomicInteger;
/**
/**
 * Responsible for communications with {@link com.android.ims.ImsManager} to send/receive messages
 * Responsible for communications with {@link com.android.ims.ImsManager} to send/receive messages
 * over IMS.
 * over IMS.
 * @hide
 */
 */
public class ImsSmsDispatcher extends SMSDispatcher {
public class ImsSmsDispatcher extends SMSDispatcher {
    // Initial condition for ims connection retry.
    // Initial condition for ims connection retry.
@@ -107,7 +101,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                }
                }


                @Override
                @Override
                public void onDeregistered(com.android.ims.ImsReasonInfo info) {
                public void onDeregistered(ImsReasonInfo info) {
                    Rlog.d(TAG, "onImsDisconnected imsReasonInfo=" + info);
                    Rlog.d(TAG, "onImsDisconnected imsReasonInfo=" + info);
                    synchronized (mLock) {
                    synchronized (mLock) {
                        mIsRegistered = false;
                        mIsRegistered = false;
@@ -127,12 +121,12 @@ public class ImsSmsDispatcher extends SMSDispatcher {
    };
    };


    // Callback fires when ImsManager MMTel Feature changes state
    // Callback fires when ImsManager MMTel Feature changes state
    private ImsServiceProxy.IFeatureUpdate mNotifyStatusChangedCallback =
    private MmTelFeatureConnection.IFeatureUpdate mNotifyStatusChangedCallback =
            new ImsServiceProxy.IFeatureUpdate() {
            new MmTelFeatureConnection.IFeatureUpdate() {
                @Override
                @Override
                public void notifyStateChanged() {
                public void notifyStateChanged() {
                    try {
                    try {
                        int status = getImsManager().getImsServiceStatus();
                        int status = getImsManager().getImsServiceState();
                        Rlog.d(TAG, "Status Changed: " + status);
                        Rlog.d(TAG, "Status Changed: " + status);
                        switch (status) {
                        switch (status) {
                            case android.telephony.ims.feature.ImsFeature.STATE_READY: {
                            case android.telephony.ims.feature.ImsFeature.STATE_READY: {
@@ -144,7 +138,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                            }
                            }
                            case android.telephony.ims.feature.ImsFeature.STATE_INITIALIZING:
                            case android.telephony.ims.feature.ImsFeature.STATE_INITIALIZING:
                                // fall through
                                // fall through
                            case android.telephony.ims.feature.ImsFeature.STATE_NOT_AVAILABLE:
                            case ImsFeature.STATE_UNAVAILABLE:
                                synchronized (mLock) {
                                synchronized (mLock) {
                                    mIsImsServiceUp = false;
                                    mIsImsServiceUp = false;
                                }
                                }
@@ -174,18 +168,18 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                throw new IllegalArgumentException("Invalid token.");
                throw new IllegalArgumentException("Invalid token.");
            }
            }
            switch(reason) {
            switch(reason) {
                case SmsImplBase.SEND_STATUS_OK:
                case ImsSmsImplBase.SEND_STATUS_OK:
                    tracker.onSent(mContext);
                    tracker.onSent(mContext);
                    break;
                    break;
                case SmsImplBase.SEND_STATUS_ERROR:
                case ImsSmsImplBase.SEND_STATUS_ERROR:
                    tracker.onFailed(mContext, reason, 0 /* errorCode */);
                    tracker.onFailed(mContext, reason, 0 /* errorCode */);
                    mTrackers.remove(token);
                    mTrackers.remove(token);
                    break;
                    break;
                case SmsImplBase.SEND_STATUS_ERROR_RETRY:
                case ImsSmsImplBase.SEND_STATUS_ERROR_RETRY:
                    tracker.mRetryCount += 1;
                    tracker.mRetryCount += 1;
                    sendSms(tracker);
                    sendSms(tracker);
                    break;
                    break;
                case SmsImplBase.SEND_STATUS_ERROR_FALLBACK:
                case ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK:
                    fallbackToPstn(token, tracker);
                    fallbackToPstn(token, tracker);
                    break;
                    break;
                default:
                default:
@@ -208,8 +202,8 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                getImsManager().acknowledgeSmsReport(
                getImsManager().acknowledgeSmsReport(
                        token,
                        token,
                        messageRef,
                        messageRef,
                        result.first ? SmsImplBase.STATUS_REPORT_STATUS_OK
                        result.first ? ImsSmsImplBase.STATUS_REPORT_STATUS_OK
                                : SmsImplBase.STATUS_REPORT_STATUS_ERROR);
                                : ImsSmsImplBase.STATUS_REPORT_STATUS_ERROR);
            } catch (ImsException e) {
            } catch (ImsException e) {
                Rlog.e(TAG, "Failed to acknowledgeSmsReport(). Error: "
                Rlog.e(TAG, "Failed to acknowledgeSmsReport(). Error: "
                        + e.getMessage());
                        + e.getMessage());
@@ -229,8 +223,8 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                    getImsManager().acknowledgeSms(token,
                    getImsManager().acknowledgeSms(token,
                            0,
                            0,
                            result == Intents.RESULT_SMS_HANDLED
                            result == Intents.RESULT_SMS_HANDLED
                                    ? SmsImplBase.STATUS_REPORT_STATUS_OK
                                    ? ImsSmsImplBase.STATUS_REPORT_STATUS_OK
                                    : SmsImplBase.DELIVER_STATUS_ERROR);
                                    : ImsSmsImplBase.DELIVER_STATUS_ERROR);
                } catch (ImsException e) {
                } catch (ImsException e) {
                    Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage());
                    Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage());
                }
                }
@@ -286,7 +280,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        if (getImsManager().isServiceAvailable()) {
        if (getImsManager().isServiceAvailable()) {
            return;
            return;
        }
        }
        // remove callback so we do not receive updates from old ImsServiceProxy when switching
        // remove callback so we do not receive updates from old MmTelFeatureConnection when switching
        // between ImsServices.
        // between ImsServices.
        getImsManager().removeNotifyStatusChangedCallback(mNotifyStatusChangedCallback);
        getImsManager().removeNotifyStatusChangedCallback(mNotifyStatusChangedCallback);
        // Exponential backoff during retry, limited to 32 seconds.
        // Exponential backoff during retry, limited to 32 seconds.
+8 −2
Original line number Original line Diff line number Diff line
@@ -150,11 +150,17 @@ public class PhoneFactory {
                   where as in single SIM mode only instance. isMultiSimEnabled() function checks
                   where as in single SIM mode only instance. isMultiSimEnabled() function checks
                   whether it is single SIM or multi SIM mode */
                   whether it is single SIM or multi SIM mode */
                int numPhones = TelephonyManager.getDefault().getPhoneCount();
                int numPhones = TelephonyManager.getDefault().getPhoneCount();
                // Start ImsResolver and bind to ImsServices.
                // Return whether or not the device should use dynamic binding or the static
                // implementation (deprecated)
                boolean isDynamicBinding = sContext.getResources().getBoolean(
                        com.android.internal.R.bool.config_dynamic_bind_ims);
                // Get the package name of the default IMS implementation.
                String defaultImsPackage = sContext.getResources().getString(
                String defaultImsPackage = sContext.getResources().getString(
                        com.android.internal.R.string.config_ims_package);
                        com.android.internal.R.string.config_ims_package);
                // Start ImsResolver and bind to ImsServices.
                Rlog.i(LOG_TAG, "ImsResolver: defaultImsPackage: " + defaultImsPackage);
                Rlog.i(LOG_TAG, "ImsResolver: defaultImsPackage: " + defaultImsPackage);
                sImsResolver = new ImsResolver(sContext, defaultImsPackage, numPhones);
                sImsResolver = new ImsResolver(sContext, defaultImsPackage, numPhones,
                        isDynamicBinding);
                sImsResolver.populateCacheAndStartBind();
                sImsResolver.populateCacheAndStartBind();


                int[] networkModes = new int[numPhones];
                int[] networkModes = new int[numPhones];
+4 −4
Original line number Original line Diff line number Diff line
@@ -27,10 +27,10 @@ import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.ServiceState;


import com.android.ims.ImsCall;
import com.android.ims.ImsCall;
import com.android.ims.ImsCallProfile;
import android.telephony.ims.ImsCallProfile;
import com.android.ims.ImsConferenceState;
import android.telephony.ims.ImsConferenceState;
import com.android.ims.ImsExternalCallState;
import android.telephony.ims.ImsExternalCallState;
import com.android.ims.ImsReasonInfo;
import android.telephony.ims.ImsReasonInfo;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.imsphone.ImsPhone;
+88 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.telephony.ims;

import android.os.RemoteException;
import android.telephony.ims.stub.ImsConfigImplBase;
import android.util.Log;

import com.android.ims.internal.IImsConfig;

public class ImsConfigCompatAdapter extends ImsConfigImplBase {

    private static final String TAG = "ImsConfigCompatAdapter";

    private final IImsConfig mOldConfigInterface;

    // Compat constants
    public static final int UNKNOWN = -1;
    public static final int SUCCESS = 0;
    public static final int FAILED =  1;

    public ImsConfigCompatAdapter(IImsConfig config) {
        mOldConfigInterface = config;
    }

    @Override
    public int setConfig(int item, int value) {
        try {
            if (mOldConfigInterface.setProvisionedValue(item, value) == SUCCESS) {
                return CONFIG_RESULT_SUCCESS;
            }
        } catch (RemoteException e) {
            Log.w(TAG, "setConfig: item=" + item + " value=" + value + "failed: "
                    + e.getMessage());
        }
        return CONFIG_RESULT_FAILED;
    }

    @Override
    public int setConfig(int item, String value) {
        try {
            if (mOldConfigInterface.setProvisionedStringValue(item, value) == SUCCESS) {
                return CONFIG_RESULT_SUCCESS;
            }
        } catch (RemoteException e) {
            Log.w(TAG, "setConfig: item=" + item + " value=" + value + "failed: "
                    + e.getMessage());
        }
        return CONFIG_RESULT_FAILED;
    }

    @Override
    public int getConfigInt(int item) {
        try {
            int value = mOldConfigInterface.getProvisionedValue(item);
            if (value != UNKNOWN) {
                return value;
            }
        } catch (RemoteException e) {
            Log.w(TAG, "getConfigInt: item=" + item + "failed: " + e.getMessage());
        }
        return CONFIG_RESULT_UNKNOWN;
    }

    @Override
    public String getConfigString(int item) {
        try {
            return mOldConfigInterface.getProvisionedStringValue(item);
        } catch (RemoteException e) {
            Log.w(TAG, "getConfigInt: item=" + item + "failed: " + e.getMessage());
        }
        return null;
    }
}
Loading