Loading src/com/android/settings/network/ims/BooleanConsumer.java 0 → 100644 +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(); } } src/com/android/settings/network/ims/ImsQuery.java 0 → 100644 +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(); } src/com/android/settings/network/ims/ImsQueryController.java 0 → 100644 +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); } } src/com/android/settings/network/ims/ImsQueryEnhanced4gLteModeUserSetting.java 0 → 100644 +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; } } src/com/android/settings/network/ims/ImsQueryProvisioningStat.java 0 → 100644 +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
src/com/android/settings/network/ims/BooleanConsumer.java 0 → 100644 +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(); } }
src/com/android/settings/network/ims/ImsQuery.java 0 → 100644 +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(); }
src/com/android/settings/network/ims/ImsQueryController.java 0 → 100644 +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); } }
src/com/android/settings/network/ims/ImsQueryEnhanced4gLteModeUserSetting.java 0 → 100644 +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; } }
src/com/android/settings/network/ims/ImsQueryProvisioningStat.java 0 → 100644 +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; } }