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

Commit b35536dd authored by Bonian Chen's avatar Bonian Chen Committed by Automerger Merge Worker
Browse files

Merge "[Settings] Changes for supporting replacing ImsManager" am: 449f76d5

Change-Id: I3c8fb5dc82165f42e6bee5742cddc48d934684ed
parents d998b07a 449f76d5
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.settings.network.ims;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

class BooleanConsumer extends Semaphore implements Consumer<Boolean> {

    private static final String TAG = "BooleanConsumer";

    BooleanConsumer() {
        super(0);
        mValue = new AtomicBoolean();
    }

    private volatile AtomicBoolean mValue;

    /**
     * Get boolean value reported from callback
     *
     * @param timeout callback waiting time in milliseconds
     * @return boolean value reported
     * @throws InterruptedException when thread get interrupted
     */
    boolean get(long timeout) throws InterruptedException {
        tryAcquire(timeout, TimeUnit.MILLISECONDS);
        return mValue.get();
    }

    /**
     * Implementation of {@link Consumer#accept(Boolean)}
     *
     * @param value boolean reported from {@link Consumer#accept(Boolean)}
     */
    public void accept(Boolean value) {
        if (value != null) {
            mValue.set(value.booleanValue());
        }
        release();
    }
}
+32 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.settings.network.ims;


/**
 * An interface for direct querying IMS, and return {@link boolean}
 */
public interface ImsQuery {

    /**
     * Interface for performing IMS status/configuration query through public APIs
     *
     * @return result of query in boolean
     */
    boolean query();

}
+107 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.settings.network.ims;

import android.telephony.AccessNetworkConstants;
import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;

import androidx.annotation.VisibleForTesting;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Controller class for querying IMS status
 */
abstract class ImsQueryController {

    private static final long TIMEOUT_MILLIS = 2000;

    private volatile int mCapability;
    private volatile int mTech;
    private volatile int mTransportType;

    /**
     * Constructor for query IMS status
     *
     * @param capability {@link MmTelFeature.MmTelCapabilities#MmTelCapability}
     * @param tech {@link ImsRegistrationImplBase#ImsRegistrationTech}
     * @param transportType {@link AccessNetworkConstants#TransportType}
     */
    ImsQueryController(
            @MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
            @ImsRegistrationImplBase.ImsRegistrationTech int tech,
            @AccessNetworkConstants.TransportType int transportType) {
        mCapability = capability;
        mTech = tech;
        mTransportType = transportType;
    }

    abstract boolean isEnabledByUser(int subId);

    @VisibleForTesting
    boolean isTtyOnVolteEnabled(int subId) {
        return (new ImsQueryTtyOnVolteStat(subId)).query();
    }

    @VisibleForTesting
    boolean isEnabledByPlatform(int subId) throws InterruptedException, ImsException,
            IllegalArgumentException {
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            return false;
        }

        final ImsMmTelManager imsMmTelManager = ImsMmTelManager.createForSubscriptionId(subId);
        // TODO: have a shared thread pool instead of create ExecutorService
        //       everytime to improve performance.
        final ExecutorService executor = Executors.newSingleThreadExecutor();
        final BooleanConsumer booleanResult = new BooleanConsumer();
        imsMmTelManager.isSupported(mCapability, mTransportType, executor, booleanResult);
        // get() will be blocked until end of execution(isSupported()) within thread(executor)
        // or timeout after TIMEOUT_MILLIS milliseconds
        return booleanResult.get(TIMEOUT_MILLIS);
    }

    @VisibleForTesting
    boolean isProvisionedOnDevice(int subId) {
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            return false;
        }
        return (new ImsQueryProvisioningStat(subId, mCapability, mTech)).query();
    }

    @VisibleForTesting
    boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
            IllegalArgumentException {
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            return false;
        }

        final ImsMmTelManager imsMmTelManager = ImsMmTelManager.createForSubscriptionId(subId);
        // TODO: have a shared thread pool instead of create ExecutorService
        //       everytime to improve performance.
        final ExecutorService executor = Executors.newSingleThreadExecutor();
        final IntegerConsumer intResult = new IntegerConsumer();
        imsMmTelManager.getFeatureState(executor, intResult);
        return (intResult.get(TIMEOUT_MILLIS) == ImsFeature.STATE_READY);
    }
}
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.settings.network.ims;

import android.telephony.ims.ImsMmTelManager;
import android.util.Log;


/**
 * An {@link ImsQuery} for accessing IMS user setting for enhanced 4G LTE
 */
public class ImsQueryEnhanced4gLteModeUserSetting implements ImsQuery {

    private static final String LOG_TAG = "QueryEnhanced4gLteModeUserSetting";
    /**
     * Constructor
     * @param subId subscription id
     */
    public ImsQueryEnhanced4gLteModeUserSetting(int subId) {
        mSubId = subId;
    }

    private volatile int mSubId;

    /**
     * Implementation of interface {@link ImsQuery#query()}
     *
     * @return result of query
     */
    public boolean query() {
        try {
            final ImsMmTelManager imsMmTelManager =
                    ImsMmTelManager.createForSubscriptionId(mSubId);
            return imsMmTelManager.isAdvancedCallingSettingEnabled();
        } catch (IllegalArgumentException exception) {
            Log.w(LOG_TAG, "fail to get VoLte settings. subId=" + mSubId, exception);
        }
        return false;
    }
}
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.settings.network.ims;

import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.Log;


/**
 * An {@link ImsQuery} for accessing IMS provision stat
 */
public class ImsQueryProvisioningStat implements ImsQuery {

    private static final String LOG_TAG = "QueryPrivisioningStat";

    private volatile int mSubId;
    private volatile int mCapability;
    private volatile int mTech;

    /**
     * Constructor
     * @param subId subscription id
     * @param capability {@link MmTelFeature.MmTelCapabilities#MmTelCapability}
     * @param tech {@link ImsRegistrationImplBase#ImsRegistrationTech}
     */
    public ImsQueryProvisioningStat(int subId,
            @MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
            @ImsRegistrationImplBase.ImsRegistrationTech int tech) {
        mSubId = subId;
        mCapability = capability;
        mTech = tech;
    }

    /**
     * Implementation of interface {@link ImsQuery#query()}
     *
     * @return result of query
     */
    public boolean query() {
        try {
            final ProvisioningManager privisionManager =
                    ProvisioningManager.createForSubscriptionId(mSubId);
            return privisionManager.getProvisioningStatusForCapability(mCapability, mTech);
        } catch (IllegalArgumentException exception) {
            Log.w(LOG_TAG, "fail to get Provisioning stat. subId=" + mSubId, exception);
        }
        return false;
    }
}
Loading