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

Commit 082bf0cc authored by Brad Ebinger's avatar Brad Ebinger Committed by Gerrit Code Review
Browse files

Merge "Expose ProvisioningManager API for IMS configurations"

parents 9d599fde 0d36ed24
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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 {
+1 −1
Original line number Diff line number Diff line
@@ -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.
+252 −0
Original line number 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 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;
    }
}
+21 −47
Original line number Diff line number Diff line
@@ -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;

@@ -214,41 +216,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;
    }
+34 −9
Original line number Diff line number Diff line
@@ -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()));
    }
}
Loading