Merge "Integrate FEATURE_TELEPHONY_IMS feature into APIs"

This commit is contained in:
Brad Ebinger
2019-03-18 17:35:27 +00:00
committed by Gerrit Code Review
4 changed files with 61 additions and 10 deletions

View File

@@ -19,6 +19,7 @@ package android.telephony.ims;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.content.pm.PackageManager;
import android.text.TextUtils; import android.text.TextUtils;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@@ -48,7 +49,9 @@ public class ImsException extends Exception {
/** /**
* This device or carrier configuration does not support IMS for this subscription. * This device or carrier configuration does not support IMS for this subscription.
* <p> * <p>
* This is a permanent configuration error and there should be no retry. * This is a permanent configuration error and there should be no retry. Usually this is
* because {@link PackageManager#FEATURE_TELEPHONY_IMS} is not available
* or the device has no ImsService implementation to service this request.
*/ */
public static final int CODE_ERROR_UNSUPPORTED_OPERATION = 2; public static final int CODE_ERROR_UNSUPPORTED_OPERATION = 2;

View File

@@ -25,6 +25,8 @@ import android.annotation.Nullable;
import android.annotation.RequiresPermission; import android.annotation.RequiresPermission;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.content.Context; import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Binder; import android.os.Binder;
import android.os.RemoteException; import android.os.RemoteException;
@@ -314,7 +316,7 @@ public class ImsMmTelManager {
private int mSubId; private int mSubId;
/** /**
* Create an instance of ImsManager for the subscription id specified. * Create an instance of {@link ImsMmTelManager} for the subscription id specified.
* *
* @param subId The ID of the subscription that this ImsMmTelManager will use. * @param subId The ID of the subscription that this ImsMmTelManager will use.
* @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList() * @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList()
@@ -366,12 +368,14 @@ public class ImsMmTelManager {
if (executor == null) { if (executor == null) {
throw new IllegalArgumentException("Must include a non-null Executor."); throw new IllegalArgumentException("Must include a non-null Executor.");
} }
if (!isImsAvailableOnDevice()) {
throw new ImsException("IMS not available on device.",
ImsException.CODE_ERROR_UNSUPPORTED_OPERATION);
}
c.setExecutor(executor); c.setExecutor(executor);
try { try {
getITelephony().registerImsRegistrationCallback(mSubId, c.getBinder()); getITelephony().registerImsRegistrationCallback(mSubId, c.getBinder());
} catch (RemoteException e) { } catch (RemoteException | IllegalStateException e) {
throw e.rethrowAsRuntimeException();
} catch (IllegalStateException e) {
throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
} }
} }
@@ -434,6 +438,10 @@ public class ImsMmTelManager {
if (executor == null) { if (executor == null) {
throw new IllegalArgumentException("Must include a non-null Executor."); throw new IllegalArgumentException("Must include a non-null Executor.");
} }
if (!isImsAvailableOnDevice()) {
throw new ImsException("IMS not available on device.",
ImsException.CODE_ERROR_UNSUPPORTED_OPERATION);
}
c.setExecutor(executor); c.setExecutor(executor);
try { try {
getITelephony().registerMmTelCapabilityCallback(mSubId, c.getBinder()); getITelephony().registerMmTelCapabilityCallback(mSubId, c.getBinder());
@@ -800,6 +808,22 @@ public class ImsMmTelManager {
} }
} }
private static boolean isImsAvailableOnDevice() {
IPackageManager pm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
if (pm == null) {
// For some reason package manger is not available.. This will fail internally anyways,
// so do not throw error and allow.
return true;
}
try {
return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS, 0);
} catch (RemoteException e) {
// For some reason package manger is not available.. This will fail internally anyways,
// so do not throw error and allow.
}
return true;
}
private static ITelephony getITelephony() { private static ITelephony getITelephony() {
ITelephony binder = ITelephony.Stub.asInterface( ITelephony binder = ITelephony.Stub.asInterface(
ServiceManager.getService(Context.TELEPHONY_SERVICE)); ServiceManager.getService(Context.TELEPHONY_SERVICE));

View File

@@ -142,6 +142,11 @@ public final class ImsReasonInfo implements Parcelable {
* Call was disconnected because a handover is not feasible due to network conditions. * Call was disconnected because a handover is not feasible due to network conditions.
*/ */
public static final int CODE_LOCAL_HO_NOT_FEASIBLE = 149; public static final int CODE_LOCAL_HO_NOT_FEASIBLE = 149;
/**
* This device does not support IMS.
* @hide
*/
public static final int CODE_LOCAL_IMS_NOT_SUPPORTED_ON_DEVICE = 150;
/* /*
* TIMEOUT (IMS -> Telephony) * TIMEOUT (IMS -> Telephony)

View File

@@ -24,6 +24,8 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.annotation.WorkerThread; import android.annotation.WorkerThread;
import android.content.Context; import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.os.Binder; import android.os.Binder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
@@ -209,12 +211,14 @@ public class ProvisioningManager {
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void registerProvisioningChangedCallback(@NonNull @CallbackExecutor Executor executor, public void registerProvisioningChangedCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull Callback callback) throws ImsException { @NonNull Callback callback) throws ImsException {
if (!isImsAvailableOnDevice()) {
throw new ImsException("IMS not available on device.",
ImsException.CODE_ERROR_UNSUPPORTED_OPERATION);
}
callback.setExecutor(executor); callback.setExecutor(executor);
try { try {
getITelephony().registerImsProvisioningChangedCallback(mSubId, callback.getBinder()); getITelephony().registerImsProvisioningChangedCallback(mSubId, callback.getBinder());
} catch (RemoteException e) { } catch (RemoteException | IllegalStateException e) {
throw e.rethrowAsRuntimeException();
} catch (IllegalStateException e) {
throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
} }
} }
@@ -232,8 +236,7 @@ public class ProvisioningManager {
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterProvisioningChangedCallback(@NonNull Callback callback) { public void unregisterProvisioningChangedCallback(@NonNull Callback callback) {
try { try {
getITelephony().unregisterImsProvisioningChangedCallback(mSubId, getITelephony().unregisterImsProvisioningChangedCallback(mSubId, callback.getBinder());
callback.getBinder());
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowAsRuntimeException(); throw e.rethrowAsRuntimeException();
} }
@@ -373,6 +376,22 @@ public class ProvisioningManager {
} }
} }
private static boolean isImsAvailableOnDevice() {
IPackageManager pm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
if (pm == null) {
// For some reason package manger is not available.. This will fail internally anyways,
// so do not throw error and allow.
return true;
}
try {
return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS, 0);
} catch (RemoteException e) {
// For some reason package manger is not available.. This will fail internally anyways,
// so do not throw error and allow.
}
return true;
}
private static ITelephony getITelephony() { private static ITelephony getITelephony() {
ITelephony binder = ITelephony.Stub.asInterface( ITelephony binder = ITelephony.Stub.asInterface(
ServiceManager.getService(Context.TELEPHONY_SERVICE)); ServiceManager.getService(Context.TELEPHONY_SERVICE));