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

Commit 7f8d9664 authored by Zoey Chen's avatar Zoey Chen Committed by Android (Google) Code Review
Browse files

Merge "[Settings] Do not insert subInfo repeatedly"

parents 4f368ebe 4fab96ff
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -45,7 +45,6 @@ import com.android.settings.widget.SummaryUpdater;
import com.android.settings.wifi.WifiSummaryUpdater;
import com.android.settingslib.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.mobile.dataservice.DataServiceUtils;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
import com.android.settingslib.mobile.dataservice.UiccInfoEntity;
@@ -238,11 +237,9 @@ public class InternetPreferenceController extends AbstractPreferenceController i

    @Override
    public void onAvailableSubInfoChanged(List<SubscriptionInfoEntity> subInfoEntityList) {
        if (DataServiceUtils.shouldUpdateEntityList(mSubInfoEntityList, subInfoEntityList)) {
        mSubInfoEntityList = subInfoEntityList;
        updateState(mPreference);
    }
    }

    @Override
    public void onActiveSubInfoChanged(List<SubscriptionInfoEntity> activeSubInfoList) {
+95 −57
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ import android.util.Log;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.mobile.dataservice.DataServiceUtils;
import com.android.settingslib.mobile.dataservice.MobileNetworkDatabase;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoDao;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
@@ -53,7 +52,6 @@ import com.android.settingslib.mobile.dataservice.UiccInfoEntity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -71,7 +69,12 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
    private static final String TAG = "MobileNetworkRepository";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

    private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
    private static ExecutorService sExecutor = Executors.newSingleThreadExecutor();
    private static Map<String, SubscriptionInfoEntity> sCacheSubscriptionInfoEntityMap =
            new ArrayMap<>();
    private static Map<String, MobileNetworkInfoEntity> sCacheMobileNetworkInfoEntityMap =
            new ArrayMap<>();
    private static Map<String, UiccInfoEntity> sCacheUiccInfoEntityMap = new ArrayMap<>();

    private SubscriptionManager mSubscriptionManager;
    private TelephonyManager mTelephonyManager;
@@ -130,8 +133,8 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
        mDataContentObserver = new MobileDataContentObserver(
                new Handler(Looper.getMainLooper()));
        mDataContentObserver.setOnMobileDataChangedListener(() -> {
            mExecutor.execute(() -> {
                insertMobileNetworkInfo(context);
            sExecutor.execute(() -> {
                insertMobileNetworkInfo(context, String.valueOf(mSubId));
            });
        });
        mFilter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
@@ -192,19 +195,25 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
    }

    private void observeAllSubInfo(LifecycleOwner lifecycleOwner) {
        if (DEBUG) {
            Log.d(TAG, "Observe subInfo.");
        }
        mMobileNetworkDatabase.queryAvailableSubInfos().observe(
                lifecycleOwner, this::onAvailableSubInfoChanged);
    }

    private void observeAllUiccInfo(LifecycleOwner lifecycleOwner) {
        if (DEBUG) {
            Log.d(TAG, "Observe UICC info.");
        }
        mMobileNetworkDatabase.queryAllUiccInfo().observe(
                lifecycleOwner, this::onAllUiccInfoChanged);
    }

    private void observeAllMobileNetworkInfo(LifecycleOwner lifecycleOwner) {
        if (DEBUG) {
            Log.d(TAG, "Observe mobile network info.");
        }
        mMobileNetworkDatabase.queryAllMobileNetworkInfo().observe(
                lifecycleOwner, this::onAllMobileNetworkInfoChanged);
    }
@@ -321,35 +330,44 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
    }

    public void insertSubInfo(Context context, SubscriptionInfo info) {
        mExecutor.execute(() -> {
        SubscriptionInfoEntity subInfoEntity =
                convertToSubscriptionInfoEntity(context, info);
        String subId = String.valueOf(mSubId);
        if (subInfoEntity != null) {
                int subId = info.getSubscriptionId();
                mSubscriptionInfoMap.put(subId, info);
            if (!sCacheSubscriptionInfoEntityMap.containsKey(subId)
                    || (sCacheSubscriptionInfoEntityMap.get(subId) != null
                    && !sCacheSubscriptionInfoEntityMap.get(subId).equals(subInfoEntity))) {
                sCacheSubscriptionInfoEntityMap.put(subId, subInfoEntity);
                if (DEBUG) {
                    Log.d(TAG, "convert subId " + subId + "to SubscriptionInfoEntity: "
                            + subInfoEntity);
                }
                mMobileNetworkDatabase.insertSubsInfo(subInfoEntity);
                insertUiccInfo(subId);
                insertMobileNetworkInfo(context, subId);
                mMetricsFeatureProvider.action(mContext,
                        SettingsEnums.ACTION_MOBILE_NETWORK_DB_INSERT_SUB_INFO);
            } else if (DEBUG) {
                Log.d(TAG, "Can not insert subInfo, the entity is null");
            }
        });
        }
    }

    public void deleteAllInfoBySubId(String subId) {
        mExecutor.execute(() -> {
        if (DEBUG) {
            Log.d(TAG, "deleteAllInfoBySubId, subId = " + subId);
        }
        mMobileNetworkDatabase.deleteSubInfoBySubId(subId);
        mMobileNetworkDatabase.deleteUiccInfoBySubId(subId);
        mMobileNetworkDatabase.deleteMobileNetworkInfoBySubId(subId);
        });
        mAvailableSubInfoEntityList.removeIf(info -> info.subId.equals(subId));
        mActiveSubInfoEntityList.removeIf(info -> info.subId.equals(subId));
        mUiccInfoEntityList.removeIf(info -> info.subId.equals(subId));
        mMobileNetworkInfoEntityList.removeIf(info -> info.subId.equals(subId));
        mSubscriptionInfoMap.remove(Integer.parseInt(subId));
        sCacheSubscriptionInfoEntityMap.remove(subId);
        sCacheUiccInfoEntityMap.remove(subId);
        sCacheMobileNetworkInfoEntityMap.remove(subId);
        mMetricsFeatureProvider.action(mContext,
                SettingsEnums.ACTION_MOBILE_NETWORK_DB_DELETE_DATA);
    }
@@ -368,8 +386,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
            return null;
        } else {
            getUiccInfoBySubscriptionInfo(uiccSlotInfos, subInfo);
            insertUiccInfo();
            insertMobileNetworkInfo(context);
            SubscriptionInfo firstRemovableSubInfo = SubscriptionUtil.getFirstRemovableSubscription(
                    context);
            SubscriptionInfo subscriptionOrDefault = SubscriptionUtil.getSubscriptionOrDefault(
@@ -406,25 +422,33 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
        }
    }

    public void insertUiccInfo() {
    public void insertUiccInfo(String subId) {
        UiccInfoEntity uiccInfoEntity = convertToUiccInfoEntity();
        if (DEBUG) {
            Log.d(TAG, "uiccInfoEntity = " + uiccInfoEntity);
        }
        if (!sCacheUiccInfoEntityMap.containsKey(subId)
                || !sCacheUiccInfoEntityMap.get(subId).equals(uiccInfoEntity)) {
            sCacheUiccInfoEntityMap.put(subId, uiccInfoEntity);
            mMobileNetworkDatabase.insertUiccInfo(uiccInfoEntity);
            mMetricsFeatureProvider.action(mContext,
                    SettingsEnums.ACTION_MOBILE_NETWORK_DB_INSERT_UICC_INFO);
        }
    }

    public void insertMobileNetworkInfo(Context context) {
    public void insertMobileNetworkInfo(Context context, String subId) {
        MobileNetworkInfoEntity mobileNetworkInfoEntity = convertToMobileNetworkInfoEntity(context);
        if (DEBUG) {
            Log.d(TAG, "mobileNetworkInfoEntity = " + mobileNetworkInfoEntity);
        }
        if (!sCacheMobileNetworkInfoEntityMap.containsKey(subId)
                || !sCacheMobileNetworkInfoEntityMap.get(subId).equals(mobileNetworkInfoEntity)) {
            sCacheMobileNetworkInfoEntityMap.put(subId, mobileNetworkInfoEntity);
            mMobileNetworkDatabase.insertMobileNetworkInfo(mobileNetworkInfoEntity);
            mMetricsFeatureProvider.action(mContext,
                    SettingsEnums.ACTION_MOBILE_NETWORK_DB_INSERT_MOBILE_NETWORK_INFO);
        }
    }

    public MobileNetworkInfoEntity convertToMobileNetworkInfoEntity(Context context) {
        return new MobileNetworkInfoEntity(String.valueOf(mSubId),
@@ -468,22 +492,41 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
    }

    private void insertAvailableSubInfoToEntity(List<SubscriptionInfo> availableInfoList) {
        sExecutor.execute(() -> {
            SubscriptionInfoEntity[] availableInfoArray = mAvailableSubInfoEntityList.toArray(
                    new SubscriptionInfoEntity[0]);
            if ((availableInfoList == null || availableInfoList.size() == 0)
                    && mAvailableSubInfoEntityList.size() != 0) {
                if (DEBUG) {
                    Log.d(TAG, "availableSudInfoList from framework is empty, remove all subs");
                }

            SubscriptionInfoEntity[] availableInfoArray = mAvailableSubInfoEntityList.toArray(
                    new SubscriptionInfoEntity[0]);
                for (SubscriptionInfoEntity info : availableInfoArray) {
                    deleteAllInfoBySubId(info.subId);
                }

            } else if (availableInfoList != null) {
                SubscriptionInfo[] infoArray = availableInfoList.toArray(new SubscriptionInfo[0]);
                // Remove the redundant subInfo
                if (availableInfoList.size() <= mAvailableSubInfoEntityList.size()) {
                    for (SubscriptionInfo subInfo : infoArray) {
                        int subId = subInfo.getSubscriptionId();
                        if (mSubscriptionInfoMap.containsKey(subId)) {
                            mSubscriptionInfoMap.remove(subId);
                        }
                    }

                    if (!mSubscriptionInfoMap.isEmpty()) {
                        for (Integer key : mSubscriptionInfoMap.keySet()) {
                            if (key != null) {
                                deleteAllInfoBySubId(String.valueOf(key));
                            }
                        }
                    }
                }

                // Insert all new available subInfo to database.
                for (SubscriptionInfo subInfo : infoArray) {
                mSubscriptionInfoMap.remove(subInfo.getSubscriptionId());
                    if (DEBUG) {
                        Log.d(TAG, "insert subInfo to subInfoEntity, subInfo = " + subInfo);
                    }
@@ -494,16 +537,11 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
                        }
                        continue;
                    }
                    mSubscriptionInfoMap.put(mSubId, subInfo);
                    insertSubInfo(mContext, subInfo);
                }

            if (!mSubscriptionInfoMap.isEmpty()) {
                Iterator<Integer> iterator = mSubscriptionInfoMap.keySet().iterator();
                while (iterator.hasNext()) {
                    deleteAllInfoBySubId(String.valueOf(iterator.next()));
                }
            }
            }
        });
    }

    public boolean isAirplaneModeOn() {
+6 −14
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.mobile.dataservice.DataServiceUtils;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
import com.android.settingslib.mobile.dataservice.UiccInfoEntity;
@@ -203,11 +202,9 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController

    @Override
    public void onAvailableSubInfoChanged(List<SubscriptionInfoEntity> subInfoEntityList) {
        if (DataServiceUtils.shouldUpdateEntityList(mSubInfoEntityList, subInfoEntityList)) {
        mSubInfoEntityList = subInfoEntityList;
        update();
    }
    }

    @Override
    public void onActiveSubInfoChanged(List<SubscriptionInfoEntity> activeSubInfoList) {
@@ -215,19 +212,14 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController

    @Override
    public void onAllUiccInfoChanged(List<UiccInfoEntity> uiccInfoEntityList) {
        if (DataServiceUtils.shouldUpdateEntityList(mUiccInfoEntityList, uiccInfoEntityList)) {
        mUiccInfoEntityList = uiccInfoEntityList;
        update();
    }
    }

    @Override
    public void onAllMobileNetworkInfoChanged(
            List<MobileNetworkInfoEntity> mobileNetworkInfoEntityList) {
        if (DataServiceUtils.shouldUpdateEntityList(mMobileNetworkInfoEntityList,
                mobileNetworkInfoEntityList)) {
        mMobileNetworkInfoEntityList = mobileNetworkInfoEntityList;
        update();
    }
}
}
+2 −5
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.mobile.dataservice.DataServiceUtils;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
import com.android.settingslib.mobile.dataservice.UiccInfoEntity;
@@ -224,11 +223,9 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl

    @Override
    public void onActiveSubInfoChanged(List<SubscriptionInfoEntity> activeSubInfoList) {
        if (DataServiceUtils.shouldUpdateEntityList(mSubInfoEntityList, activeSubInfoList)) {
        mSubInfoEntityList = activeSubInfoList;
        update();
    }
    }

    @Override
    public void onAllUiccInfoChanged(List<UiccInfoEntity> uiccInfoEntityList) {
+3 −6
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.mobile.dataservice.DataServiceUtils;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
import com.android.settingslib.mobile.dataservice.UiccInfoEntity;
@@ -178,12 +177,10 @@ public class NetworkProviderSimListController extends AbstractPreferenceControll

    @Override
    public void onAvailableSubInfoChanged(List<SubscriptionInfoEntity> subInfoEntityList) {
        if (DataServiceUtils.shouldUpdateEntityList(mSubInfoEntityList, subInfoEntityList)) {
        mSubInfoEntityList = subInfoEntityList;
        mPreferenceCategory.setVisible(isAvailable());
        update();
    }
    }

    @Override
    public void onActiveSubInfoChanged(List<SubscriptionInfoEntity> activeSubInfoList) {
Loading