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

Commit 81e18816 authored by Brad Ebinger's avatar Brad Ebinger Committed by android-build-merger
Browse files

Merge "Expose ProvisioningManager API for IMS configurations" am: 082bf0cc

am: 5ffd9747

Change-Id: I51307a4658b63823da79567130b0425bc5695555
parents decaa96a 5ffd9747
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -6212,6 +6212,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