| /* |
| * 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); |
| } |
| } |