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

Commit d12565dd authored by Bonian Chen's avatar Bonian Chen Committed by Android (Google) Code Review
Browse files

Merge "[SettingsLib] Remove access to isImsRegistered() and isActiveSubId()"

parents c8189371 ed6c4548
Loading
Loading
Loading
Loading
+68 −8
Original line number Diff line number Diff line
@@ -23,7 +23,9 @@ import android.net.wifi.WifiManager;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.RegistrationManager;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -32,15 +34,26 @@ import androidx.preference.PreferenceScreen;
import com.android.settingslib.R;
import com.android.settingslib.core.lifecycle.Lifecycle;

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

/**
 * Preference controller for IMS status
 */
public abstract class AbstractImsStatusPreferenceController
        extends AbstractConnectivityPreferenceController {

    private static final String LOG_TAG = "AbstractImsPrefController";

    @VisibleForTesting
    static final String KEY_IMS_REGISTRATION_STATE = "ims_reg_state";

    private static final long MAX_THREAD_BLOCKING_TIME_MS = 2000;

    private static final String[] CONNECTIVITY_INTENTS = {
            BluetoothAdapter.ACTION_STATE_CHANGED,
            ConnectivityManager.CONNECTIVITY_ACTION,
@@ -57,8 +70,9 @@ public abstract class AbstractImsStatusPreferenceController

    @Override
    public boolean isAvailable() {
        CarrierConfigManager configManager = mContext.getSystemService(CarrierConfigManager.class);
        int subId = SubscriptionManager.getDefaultDataSubscriptionId();
        final CarrierConfigManager configManager =
                mContext.getSystemService(CarrierConfigManager.class);
        final int subId = SubscriptionManager.getDefaultDataSubscriptionId();
        PersistableBundle config = null;
        if (configManager != null) {
            config = configManager.getConfigForSubId(subId);
@@ -86,11 +100,57 @@ public abstract class AbstractImsStatusPreferenceController

    @Override
    protected void updateConnectivity() {
        int subId = SubscriptionManager.getDefaultDataSubscriptionId();
        if (mImsStatus != null) {
            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
            mImsStatus.setSummary((tm != null && tm.isImsRegistered(subId)) ?
                    R.string.ims_reg_status_registered : R.string.ims_reg_status_not_registered);
        if (mImsStatus == null) {
            return;
        }
        final int subId = SubscriptionManager.getDefaultDataSubscriptionId();
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            mImsStatus.setSummary(R.string.ims_reg_status_not_registered);
            return;
        }
        final ExecutorService executors = Executors.newSingleThreadExecutor();
        final StateCallback stateCallback = new StateCallback();

        final ImsMmTelManager imsMmTelManager = ImsMmTelManager.createForSubscriptionId(subId);
        try {
            imsMmTelManager.getRegistrationState(executors, stateCallback);
        } catch (Exception ex) {
        }

        mImsStatus.setSummary(stateCallback.waitUntilResult()
                ? R.string.ims_reg_status_registered : R.string.ims_reg_status_not_registered);

        try {
            executors.shutdownNow();
        } catch (Exception exception) {
        }
    }

    private final class StateCallback extends AtomicBoolean implements Consumer<Integer> {
        private StateCallback() {
            super(false);
            mSemaphore = new Semaphore(0);
        }

        private final Semaphore mSemaphore;

        public void accept(Integer state) {
            set(state == RegistrationManager.REGISTRATION_STATE_REGISTERED);
            try {
                mSemaphore.release();
            } catch (Exception ex) {
            }
        }

        public boolean waitUntilResult() {
            try {
                if (!mSemaphore.tryAcquire(MAX_THREAD_BLOCKING_TIME_MS, TimeUnit.MILLISECONDS)) {
                    Log.w(LOG_TAG, "IMS registration state query timeout");
                    return false;
                }
            } catch (Exception ex) {
            }
            return get();
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ public class DataUsageUtils {
        final SubscriptionManager subscriptionManager = context.getSystemService(
                SubscriptionManager.class);
        final NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll(
                telephonyManager.createForSubscriptionId(subId).getSubscriberId());
                telephonyManager.getSubscriberId());

        if (!subscriptionManager.isActiveSubscriptionId(subId)) {
            Log.i(TAG, "Subscription is not active: " + subId);