diff --git a/src/com/android/settings/network/ActiveSubsciptionsListener.java b/src/com/android/settings/network/ActiveSubsciptionsListener.java index 3d150258418..26f644145b2 100644 --- a/src/com/android/settings/network/ActiveSubsciptionsListener.java +++ b/src/com/android/settings/network/ActiveSubsciptionsListener.java @@ -62,6 +62,7 @@ public abstract class ActiveSubsciptionsListener private BroadcastReceiver mSubscriptionChangeReceiver; private static final int MAX_SUBSCRIPTION_UNKNOWN = -1; + private final int mTargetSubscriptionId; private AtomicInteger mMaxActiveSubscriptionInfos; private List mCachedActiveSubscriptionInfo; @@ -73,9 +74,21 @@ public abstract class ActiveSubsciptionsListener * @param context {@code Context} of this listener */ public ActiveSubsciptionsListener(Looper looper, Context context) { + this(looper, context, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + } + + /** + * Constructor + * + * @param looper {@code Looper} of this listener + * @param context {@code Context} of this listener + * @param subscriptionId for subscription on this listener + */ + public ActiveSubsciptionsListener(Looper looper, Context context, int subscriptionId) { super(looper); mLooper = looper; mContext = context; + mTargetSubscriptionId = subscriptionId; mCacheState = new AtomicInteger(STATE_NOT_LISTENING); mMaxActiveSubscriptionInfos = new AtomicInteger(MAX_SUBSCRIPTION_UNKNOWN); @@ -108,6 +121,12 @@ public abstract class ActiveSubsciptionsListener if (!clearCachedSubId(subId)) { return; } + if (SubscriptionManager.isValidSubscriptionId(mTargetSubscriptionId)) { + if (SubscriptionManager.isValidSubscriptionId(subId) + && (mTargetSubscriptionId != subId)) { + return; + } + } } onSubscriptionsChanged(); } diff --git a/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java b/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java index e92cdfcd9d1..aa84cc14acd 100644 --- a/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java @@ -16,7 +16,9 @@ package com.android.settings.network.telephony; +import android.os.SystemClock; import android.text.TextUtils; +import android.util.Log; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -34,6 +36,7 @@ abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment private List mHiddenControllerList = new ArrayList(); + private boolean mIsRedrawRequired; /** * @param restrictionKey The restriction key to check before pin protecting @@ -52,6 +55,15 @@ abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment return result; } + Preference searchForPreference(PreferenceScreen screen, + AbstractPreferenceController controller) { + final String key = controller.getPreferenceKey(); + if (TextUtils.isEmpty(key)) { + return null; + } + return screen.findPreference(key); + } + TelephonyStatusControlSession setTelephonyAvailabilityStatus( Collection listOfPrefControllers) { return (new TelephonyStatusControlSession.Builder(listOfPrefControllers)) @@ -78,26 +90,60 @@ abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment protected void updatePreferenceStates() { mHiddenControllerList.clear(); + if (mIsRedrawRequired) { + redrawPreferenceControllers(); + return; + } + final PreferenceScreen screen = getPreferenceScreen(); - getPreferenceControllersAsList().forEach(controller -> { - final String key = controller.getPreferenceKey(); - if (TextUtils.isEmpty(key)) { - return; - } - final Preference preference = screen.findPreference(key); - if (preference == null) { - return; - } - if (!isPreferenceExpanded(preference)) { - mHiddenControllerList.add(controller); - return; - } - if (!controller.isAvailable()) { - return; - } - controller.updateState(preference); - }); + getPreferenceControllersAsList().forEach(controller -> + updateVisiblePreferenceControllers(screen, controller)); } + private void updateVisiblePreferenceControllers(PreferenceScreen screen, + AbstractPreferenceController controller) { + final Preference preference = searchForPreference(screen, controller); + if (preference == null) { + return; + } + if (!isPreferenceExpanded(preference)) { + mHiddenControllerList.add(controller); + return; + } + if (!controller.isAvailable()) { + return; + } + controller.updateState(preference); + } + + void redrawPreferenceControllers() { + mHiddenControllerList.clear(); + + if (!isResumed()) { + mIsRedrawRequired = true; + return; + } + mIsRedrawRequired = false; + + final long startTime = SystemClock.elapsedRealtime(); + + final List controllers = + getPreferenceControllersAsList(); + final TelephonyStatusControlSession session = + setTelephonyAvailabilityStatus(controllers); + + + final PreferenceScreen screen = getPreferenceScreen(); + controllers.forEach(controller -> { + controller.displayPreference(screen); + updateVisiblePreferenceControllers(screen, controller); + }); + + final long endTime = SystemClock.elapsedRealtime(); + + Log.d(LOG_TAG, "redraw fragment: +" + (endTime - startTime) + "ms"); + + session.close(); + } } diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index fd7ab97cf85..7f7dc3a192c 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -126,12 +126,13 @@ public class MobileNetworkActivity extends SettingsBaseActivity : SUB_ID_NULL); final SubscriptionInfo subscription = getSubscription(); - updateTitleAndNavigation(subscription); maybeShowContactDiscoveryDialog(subscription); // Since onChanged() will take place immediately when addActiveSubscriptionsListener(), // perform registration after mCurSubscriptionId been configured. registerActiveSubscriptionsListener(); + + updateSubscriptions(subscription); } @VisibleForTesting diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index d84d15409f0..49f7981c28b 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -37,6 +37,7 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.datausage.BillingCyclePreferenceController; import com.android.settings.datausage.DataUsageSummaryPreferenceController; +import com.android.settings.network.ActiveSubsciptionsListener; import com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController; import com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController; import com.android.settings.network.telephony.gsm.AutoSelectPreferenceController; @@ -44,6 +45,7 @@ import com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenc import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.utils.ThreadUtils; import java.util.Arrays; import java.util.List; @@ -70,6 +72,10 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { private UserManager mUserManager; private String mClickedPrefKey; + private ActiveSubsciptionsListener mActiveSubsciptionsListener; + private boolean mActiveSubsciptionsListenerStarting; + private int mActiveSubsciptionsListenerCount; + public MobileNetworkSettings() { super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); } @@ -197,6 +203,38 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { onRestoreInstance(icicle); } + @Override + public void onResume() { + super.onResume(); + if (mActiveSubsciptionsListener == null) { + mActiveSubsciptionsListenerStarting = true; + mActiveSubsciptionsListener = new ActiveSubsciptionsListener( + getContext().getMainLooper(), getContext(), mSubId) { + public void onChanged() { + onSubscriptionDetailChanged(); + } + }; + mActiveSubsciptionsListenerStarting = false; + } + mActiveSubsciptionsListener.start(); + } + + private void onSubscriptionDetailChanged() { + if (mActiveSubsciptionsListenerStarting) { + Log.d(LOG_TAG, "Callback during onResume()"); + return; + } + mActiveSubsciptionsListenerCount++; + if (mActiveSubsciptionsListenerCount != 1) { + return; + } + + ThreadUtils.postOnMainThread(() -> { + mActiveSubsciptionsListenerCount = 0; + redrawPreferenceControllers(); + }); + } + @VisibleForTesting void onRestoreInstance(Bundle icicle) { if (icicle != null) {