diff options
| author | 2018-11-15 14:23:18 -0800 | |
|---|---|---|
| committer | 2018-11-15 14:23:18 -0800 | |
| commit | 5ffd9747af080d838d043868153bf7537b4f5013 (patch) | |
| tree | 87b890a76aab646bc1c09acfd2205c6908e81e2b | |
| parent | 6eeb8bef8d0a91f8a05ef3dd18f332932fec4e0f (diff) | |
| parent | 082bf0ccca33c986008071116c5fd07ec38b850b (diff) | |
Merge "Expose ProvisioningManager API for IMS configurations"
am: 082bf0ccca
Change-Id: I50487cdf23a5367ac4893e81c3063df2b7669485
6 files changed, 359 insertions, 61 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 88159a1fcf70..b81d59d00039 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6236,6 +6236,22 @@ package android.telephony.ims { method public void receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile); } + public class ProvisioningManager { + method public static android.telephony.ims.ProvisioningManager createForSubscriptionId(android.content.Context, int); + method public int getProvisioningIntValue(int); + method public java.lang.String getProvisioningStringValue(int); + method public void registerProvisioningChangedCallback(java.util.concurrent.Executor, android.telephony.ims.ProvisioningManager.Callback); + method public int setProvisioningIntValue(int, int); + method public int setProvisioningStringValue(int, java.lang.String); + method public void unregisterProvisioningChangedCallback(android.telephony.ims.ProvisioningManager.Callback); + } + + public static class ProvisioningManager.Callback { + ctor public ProvisioningManager.Callback(); + method public void onProvisioningIntChanged(int, int); + method public void onProvisioningStringChanged(int, java.lang.String); + } + } package android.telephony.ims.feature { diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java index c9cf473bb482..e06c3728836c 100644 --- a/telephony/java/android/telephony/ims/ImsMmTelManager.java +++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java @@ -292,7 +292,7 @@ public class ImsMmTelManager { * Create an instance of ImsManager for the subscription id specified. * * @param context - * @param subId The ID of the subscription that this ImsManager will use. + * @param subId The ID of the subscription that this ImsMmTelManager will use. * @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList() * @throws IllegalArgumentException if the subscription is invalid or * the subscription ID is not an active subscription. diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java new file mode 100644 index 000000000000..916e282f642e --- /dev/null +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -0,0 +1,252 @@ +/* + * 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 android.telephony.ims; + +import android.Manifest; +import android.annotation.CallbackExecutor; +import android.annotation.NonNull; +import android.annotation.RequiresPermission; +import android.annotation.SystemApi; +import android.content.Context; +import android.os.Binder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.telephony.SubscriptionManager; +import android.telephony.ims.aidl.IImsConfigCallback; +import android.telephony.ims.stub.ImsConfigImplBase; + +import com.android.internal.telephony.ITelephony; + +import java.util.concurrent.Executor; + +/** + * Manages IMS provisioning and configuration parameters, as well as callbacks for apps to listen + * to changes in these configurations. + * + * Note: IMS provisioning keys are defined per carrier or OEM using OMA-DM or other provisioning + * applications and may vary. + * @hide + */ +@SystemApi +public class ProvisioningManager { + + /** + * Callback for IMS provisioning changes. + */ + public static class Callback { + + private static class CallbackBinder extends IImsConfigCallback.Stub { + + private final Callback mLocalConfigurationCallback; + private Executor mExecutor; + + private CallbackBinder(Callback localConfigurationCallback) { + mLocalConfigurationCallback = localConfigurationCallback; + } + + @Override + public final void onIntConfigChanged(int item, int value) { + Binder.withCleanCallingIdentity(() -> + mExecutor.execute(() -> + mLocalConfigurationCallback.onProvisioningIntChanged(item, value))); + } + + @Override + public final void onStringConfigChanged(int item, String value) { + Binder.withCleanCallingIdentity(() -> + mExecutor.execute(() -> + mLocalConfigurationCallback.onProvisioningStringChanged(item, + value))); + } + + private void setExecutor(Executor executor) { + mExecutor = executor; + } + } + + private final CallbackBinder mBinder = new CallbackBinder(this); + + /** + * Called when a provisioning item has changed. + * @param item the IMS provisioning key constant, as defined by the OEM. + * @param value the new integer value of the IMS provisioning key. + */ + public void onProvisioningIntChanged(int item, int value) { + // Base Implementation + } + + /** + * Called when a provisioning item has changed. + * @param item the IMS provisioning key constant, as defined by the OEM. + * @param value the new String value of the IMS configuration constant. + */ + public void onProvisioningStringChanged(int item, String value) { + // Base Implementation + } + + /**@hide*/ + public final IImsConfigCallback getBinder() { + return mBinder; + } + + /**@hide*/ + public void setExecutor(Executor executor) { + mBinder.setExecutor(executor); + } + } + + private int mSubId; + + /** + * Create a new {@link ProvisioningManager} for the subscription specified. + * @param context The context that this manager will use. + * @param subId The ID of the subscription that this ProvisioningManager will use. + * @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList() + * @throws IllegalArgumentException if the subscription is invalid or + * the subscription ID is not an active subscription. + */ + public static ProvisioningManager createForSubscriptionId(Context context, int subId) { + if (!SubscriptionManager.isValidSubscriptionId(subId) + || !getSubscriptionManager(context).isActiveSubscriptionId(subId)) { + throw new IllegalArgumentException("Invalid subscription ID"); + } + + return new ProvisioningManager(subId); + } + + private ProvisioningManager(int subId) { + mSubId = subId; + } + + /** + * Register a new {@link Callback} to listen to changes to changes in + * IMS provisioning. Use {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to + * Subscription changed events and call + * {@link #unregisterProvisioningChangedCallback(Callback)} to clean up after a + * subscription is removed. + * @param executor The {@link Executor} to call the callback methods on + * @param callback The provisioning callbackto be registered. + * @see #unregisterProvisioningChangedCallback(Callback) + * @see SubscriptionManager.OnSubscriptionsChangedListener + */ + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public void registerProvisioningChangedCallback(@CallbackExecutor Executor executor, + @NonNull Callback callback) { + callback.setExecutor(executor); + try { + getITelephony().registerImsProvisioningChangedCallback(mSubId, + callback.getBinder()); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Unregister an existing {@link Callback}. Ensure to call this method when cleaning + * up to avoid memory leaks or when the subscription is removed. + * @param callback The existing {@link Callback} to be removed. + * @see #registerProvisioningChangedCallback(Executor, Callback) + */ + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public void unregisterProvisioningChangedCallback(@NonNull Callback callback) { + try { + getITelephony().unregisterImsProvisioningChangedCallback(mSubId, + callback.getBinder()); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Query for the integer value associated with the provided key. + * @param key An integer that represents the provisioning key, which is defined by the OEM. + * @return an integer value for the provided key. + * @throws IllegalArgumentException if the key provided was invalid. + */ + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public int getProvisioningIntValue(int key) { + try { + return getITelephony().getImsProvisioningInt(mSubId, key); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Query for the String value associated with the provided key. + * @param key An integer that represents the provisioning key, which is defined by the OEM. + * @return a String value for the provided key, or {@code null} if the key doesn't exist. + * @throws IllegalArgumentException if the key provided was invalid. + */ + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public String getProvisioningStringValue(int key) { + try { + return getITelephony().getImsProvisioningString(mSubId, key); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Set the integer value associated with the provided key. + * @param key An integer that represents the provisioning key, which is defined by the OEM. + * @param value a integer value for the provided key. + * @return the result of setting the configuration value. + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + public @ImsConfigImplBase.SetConfigResult int setProvisioningIntValue(int key, int value) { + try { + return getITelephony().setImsProvisioningInt(mSubId, key, value); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Set the String value associated with the provided key. + * + * @param key An integer that represents the provisioning key, which is defined by the OEM. + * @param value a String value for the provided key. + * @return the result of setting the configuration value. + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + public @ImsConfigImplBase.SetConfigResult int setProvisioningStringValue(int key, + String value) { + try { + return getITelephony().setImsProvisioningString(mSubId, key, value); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + private static SubscriptionManager getSubscriptionManager(Context context) { + SubscriptionManager manager = context.getSystemService(SubscriptionManager.class); + if (manager == null) { + throw new RuntimeException("Could not find SubscriptionManager."); + } + return manager; + } + + private static ITelephony getITelephony() { + ITelephony binder = ITelephony.Stub.asInterface( + ServiceManager.getService(Context.TELEPHONY_SERVICE)); + if (binder == null) { + throw new RuntimeException("Could not find Telephony Service."); + } + return binder; + } +} diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java index dcd7ea714f8c..321bfff40652 100644 --- a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java @@ -16,9 +16,9 @@ package android.telephony.ims.stub; +import android.annotation.IntDef; import android.annotation.SystemApi; import android.content.Context; -import android.content.Intent; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.telephony.ims.aidl.IImsConfig; @@ -28,6 +28,8 @@ import android.util.Log; import com.android.ims.ImsConfig; import com.android.internal.annotations.VisibleForTesting; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.HashMap; @@ -215,41 +217,6 @@ public class ImsConfigImplBase { } /** - * Callback that the framework uses for receiving Configuration change updates. - * {@hide} - */ - public static class Callback extends IImsConfigCallback.Stub { - - @Override - public final void onIntConfigChanged(int item, int value) throws RemoteException { - onConfigChanged(item, value); - } - - @Override - public final void onStringConfigChanged(int item, String value) throws RemoteException { - onConfigChanged(item, value); - } - - /** - * Called when the IMS configuration has changed. - * @param item the IMS configuration key constant, as defined in ImsConfig. - * @param value the new integer value of the IMS configuration constant. - */ - public void onConfigChanged(int item, int value) { - // Base Implementation - } - - /** - * Called when the IMS configuration has changed. - * @param item the IMS configuration key constant, as defined in ImsConfig. - * @param value the new String value of the IMS configuration constant. - */ - public void onConfigChanged(int item, String value) { - // Base Implementation - } - } - - /** * The configuration requested resulted in an unknown result. This may happen if the * IMS configurations are unavailable. */ @@ -263,6 +230,16 @@ public class ImsConfigImplBase { */ public static final int CONFIG_RESULT_FAILED = 1; + /** + * @hide + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = "CONFIG_RESULT_", value = { + CONFIG_RESULT_SUCCESS, + CONFIG_RESULT_FAILED + }) + public @interface SetConfigResult {} + private final RemoteCallbackList<IImsConfigCallback> mCallbacks = new RemoteCallbackList<>(); ImsConfigStub mImsConfigStub; @@ -279,17 +256,16 @@ public class ImsConfigImplBase { } /** - * Adds a {@link Callback} to the list of callbacks notified when a value in the configuration - * changes. + * Adds a {@link android.telephony.ims.ProvisioningManager.Callback} to the list of callbacks + * notified when a value in the configuration changes. * @param c callback to add. */ private void addImsConfigCallback(IImsConfigCallback c) { mCallbacks.register(c); } /** - * Removes a {@link Callback} to the list of callbacks notified when a value in the - * configuration changes. - * + * Removes a {@link android.telephony.ims.ProvisioningManager.Callback} to the list of callbacks + * notified when a value in the configuration changes. * @param c callback to remove. */ private void removeImsConfigCallback(IImsConfigCallback c) { @@ -370,10 +346,9 @@ public class ImsConfigImplBase { * * @param item an integer key. * @param value an integer containing the configuration value. - * @return the result of setting the configuration value, defined as either - * {@link #CONFIG_RESULT_FAILED} or {@link #CONFIG_RESULT_SUCCESS}. + * @return the result of setting the configuration value. */ - public int setConfig(int item, int value) { + public @SetConfigResult int setConfig(int item, int value) { // Base Implementation - To be overridden. return CONFIG_RESULT_FAILED; } @@ -383,10 +358,9 @@ public class ImsConfigImplBase { * * @param item an integer key. * @param value a String containing the new configuration value. - * @return Result of setting the configuration value, defined as either - * {@link #CONFIG_RESULT_FAILED} or {@link #CONFIG_RESULT_SUCCESS}. + * @return Result of setting the configuration value. */ - public int setConfig(int item, String value) { + public @SetConfigResult int setConfig(int item, String value) { // Base Implementation - To be overridden. return CONFIG_RESULT_FAILED; } diff --git a/telephony/java/com/android/ims/ImsConfig.java b/telephony/java/com/android/ims/ImsConfig.java index 90e9880bd03e..71a21743a449 100644 --- a/telephony/java/com/android/ims/ImsConfig.java +++ b/telephony/java/com/android/ims/ImsConfig.java @@ -16,12 +16,17 @@ package com.android.ims; -import android.content.Context; +import android.os.Handler; +import android.os.HandlerExecutor; +import android.os.Looper; import android.os.RemoteException; import android.telephony.Rlog; import android.telephony.ims.ImsReasonInfo; +import android.telephony.ims.ProvisioningManager; import android.telephony.ims.aidl.IImsConfig; -import android.telephony.ims.stub.ImsConfigImplBase; +import android.telephony.ims.aidl.IImsConfigCallback; + +import java.util.concurrent.Executor; /** * Provides APIs to get/set the IMS service feature/capability/parameters. @@ -29,8 +34,10 @@ import android.telephony.ims.stub.ImsConfigImplBase; * 1) Items provisioned by the operator. * 2) Items configured by user. Mainly service feature class. * + * @deprecated Use {@link ProvisioningManager} to change these configurations in the ImsService. * @hide */ +@Deprecated public class ImsConfig { private static final String TAG = "ImsConfig"; private boolean DBG = true; @@ -46,7 +53,7 @@ public class ImsConfig { /** * Broadcast action: the configuration was changed - * @deprecated Use {@link ImsConfig#addConfigCallback(ImsConfigImplBase.Callback)} instead. + * @deprecated Use {@link android.telephony.ims.ProvisioningManager.Callback} instead. * @hide */ public static final String ACTION_IMS_CONFIG_CHANGED = @@ -673,13 +680,25 @@ public class ImsConfig { } /** - * Adds a {@link ImsConfigImplBase.Callback} to the ImsService to notify when a Configuration + * Adds a {@link ProvisioningManager.Callback} to the ImsService to notify when a Configuration * item has changed. * - * Make sure to call {@link #removeConfigCallback(ImsConfigImplBase.Callback)} when finished + * Make sure to call {@link #removeConfigCallback(IImsConfigCallback)} when finished * using this callback. */ - public void addConfigCallback(ImsConfigImplBase.Callback callback) throws ImsException { + public void addConfigCallback(ProvisioningManager.Callback callback) throws ImsException { + callback.setExecutor(getThreadExecutor()); + addConfigCallback(callback.getBinder()); + } + + /** + * Adds a {@link IImsConfigCallback} to the ImsService to notify when a Configuration + * item has changed. + * + * Make sure to call {@link #removeConfigCallback(IImsConfigCallback)} when finished + * using this callback. + */ + public void addConfigCallback(IImsConfigCallback callback) throws ImsException { if (DBG) Rlog.d(TAG, "addConfigCallback: " + callback); try { miConfig.addImsConfigCallback(callback); @@ -690,10 +709,9 @@ public class ImsConfig { } /** - * Removes a {@link ImsConfigImplBase.Callback} from the ImsService that was previously added - * by {@link #addConfigCallback(ImsConfigImplBase.Callback)}. + * Removes an existing {@link IImsConfigCallback} from the ImsService. */ - public void removeConfigCallback(ImsConfigImplBase.Callback callback) throws ImsException { + public void removeConfigCallback(IImsConfigCallback callback) throws ImsException { if (DBG) Rlog.d(TAG, "removeConfigCallback: " + callback); try { miConfig.removeImsConfigCallback(callback); @@ -709,4 +727,11 @@ public class ImsConfig { public boolean isBinderAlive() { return miConfig.asBinder().isBinderAlive(); } + + private Executor getThreadExecutor() { + if (Looper.myLooper() == null) { + Looper.prepare(); + } + return new HandlerExecutor(new Handler(Looper.myLooper())); + } } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 1f3746668aa6..ddcd78070a47 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -40,6 +40,7 @@ import android.telephony.TelephonyHistogram; import android.telephony.VisualVoicemailSmsFilterSettings; import android.telephony.ims.aidl.IImsCapabilityCallback; import android.telephony.ims.aidl.IImsConfig; +import android.telephony.ims.aidl.IImsConfigCallback; import android.telephony.ims.aidl.IImsMmTelFeature; import android.telephony.ims.aidl.IImsRcsFeature; import android.telephony.ims.aidl.IImsRegistration; @@ -1569,24 +1570,24 @@ interface ITelephony { /** * Adds an IMS registration status callback for the subscription id specified. */ - oneway void addImsRegistrationCallback(int subId, IImsRegistrationCallback c, + void addImsRegistrationCallback(int subId, IImsRegistrationCallback c, String callingPackage); /** * Removes an existing IMS registration status callback for the subscription specified. */ - oneway void removeImsRegistrationCallback(int subId, IImsRegistrationCallback c, + void removeImsRegistrationCallback(int subId, IImsRegistrationCallback c, String callingPackage); /** * Adds an IMS MmTel capabilities callback for the subscription specified. */ - oneway void addMmTelCapabilityCallback(int subId, IImsCapabilityCallback c, + void addMmTelCapabilityCallback(int subId, IImsCapabilityCallback c, String callingPackage); /** * Removes an existing IMS MmTel capabilities callback for the subscription specified. */ - oneway void removeMmTelCapabilityCallback(int subId, IImsCapabilityCallback c, + void removeMmTelCapabilityCallback(int subId, IImsCapabilityCallback c, String callingPackage); /** @@ -1691,4 +1692,34 @@ interface ITelephony { * Return a list of certs in hex string from loaded carrier privileges access rules. */ List<String> getCertsFromCarrierPrivilegeAccessRules(int subId); + + /** + * Register an IMS provisioning change callback with Telephony. + */ + void registerImsProvisioningChangedCallback(int subId, IImsConfigCallback callback); + + /** + * unregister an existing IMS provisioning change callback. + */ + void unregisterImsProvisioningChangedCallback(int subId, IImsConfigCallback callback); + + /** + * Return an integer containing the provisioning value for the specified provisioning key. + */ + int getImsProvisioningInt(int subId, int key); + + /** + * return a String containing the provisioning value for the provisioning key specified. + */ + String getImsProvisioningString(int subId, int key); + + /** + * Set the integer provisioning value for the provisioning key specified. + */ + int setImsProvisioningInt(int subId, int key, int value); + + /** + * Set the String provisioning value for the provisioning key specified. + */ + int setImsProvisioningString(int subId, int key, String value); } |