diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java index 7842459f2e1..322b971cfad 100644 --- a/src/com/android/settings/core/SettingsBaseActivity.java +++ b/src/com/android/settings/core/SettingsBaseActivity.java @@ -260,6 +260,9 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa } private int getTransitionType(Intent intent) { + if (intent == null) { + return TransitionType.TRANSITION_NONE; + } return intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE, TransitionType.TRANSITION_NONE); } } diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java index fc8a0b606ce..61682d00a8c 100644 --- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.icu.text.RelativeDateTimeFormatter; import android.os.UserHandle; import android.os.UserManager; +import android.provider.DeviceConfig; import android.provider.Settings; import androidx.annotation.VisibleForTesting; @@ -27,6 +28,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; @@ -82,8 +84,11 @@ public class RecentLocationAccessPreferenceController extends LocationBasePrefer RecentAppOpsAccess recentLocationApps) { super(context, key); mRecentLocationApps = recentLocationApps; - mShowSystem = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1; + mShowSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + ? Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + : false; } @Override diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java b/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java index f7bf31a896a..ecbcb30eace 100644 --- a/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java +++ b/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java @@ -17,11 +17,13 @@ package com.android.settings.location; import android.content.Context; import android.os.Bundle; +import android.provider.DeviceConfig; import android.provider.Settings; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -58,8 +60,11 @@ public class RecentLocationAccessSeeAllFragment extends DashboardFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mShowSystem = Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1; + mShowSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + ? Settings.Secure.getInt(getContentResolver(), + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + : false; } @Override diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java index 75406f7132a..d6586673f89 100644 --- a/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java @@ -20,11 +20,13 @@ import static com.android.settings.location.RecentLocationAccessPreferenceContro import android.content.Context; import android.os.UserManager; +import android.provider.DeviceConfig; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.R; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; import com.android.settings.overlay.FeatureFactory; @@ -48,8 +50,12 @@ public class RecentLocationAccessSeeAllPreferenceController public RecentLocationAccessSeeAllPreferenceController(Context context, String key) { super(context, key); - mShowSystem = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1; + mShowSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + ? Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + : false; + mRecentLocationAccesses = RecentAppOpsAccess.createForLocation(context); mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } diff --git a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java index a14e047cb4b..39211ee5202 100644 --- a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java @@ -17,6 +17,7 @@ import android.content.Context; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; +import android.provider.DeviceConfig; import android.provider.Settings; import androidx.annotation.VisibleForTesting; @@ -24,6 +25,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.R; import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.core.SubSettingLauncher; @@ -84,8 +86,11 @@ public class RecentLocationRequestPreferenceController extends LocationBasePrefe final Context prefContext = mCategoryRecentLocationRequests.getContext(); final List recentLocationRequests = new ArrayList<>(); final UserManager userManager = UserManager.get(mContext); - final boolean showSystem = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1; + final boolean showSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + ? Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + : false; for (RecentLocationApps.Request request : mRecentLocationApps.getAppListSorted( showSystem)) { diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java index 44ad411c832..7ba16e31f45 100644 --- a/src/com/android/settings/network/SubscriptionsPreferenceController.java +++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java @@ -456,7 +456,11 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl } @Override - public void onTelephonyDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) { + public void onTelephonyDisplayInfoChanged(int subId, + TelephonyDisplayInfo telephonyDisplayInfo) { + if (subId != mSubsPrefCtrlInjector.getDefaultDataSubscriptionId()) { + return; + } mTelephonyDisplayInfo = telephonyDisplayInfo; update(); } diff --git a/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java b/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java index 334da3c931f..57a012c71b8 100644 --- a/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java +++ b/src/com/android/settings/network/telephony/TelephonyDisplayInfoListener.java @@ -37,8 +37,9 @@ public class TelephonyDisplayInfoListener { private TelephonyManager mBaseTelephonyManager; private Callback mCallback; private Map mListeners; + private Map mDisplayInfos; - private TelephonyDisplayInfo mTelephonyDisplayInfo = + private static final TelephonyDisplayInfo mDefaultTelephonyDisplayInfo = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); /** @@ -48,19 +49,20 @@ public class TelephonyDisplayInfoListener { /** * Used to notify TelephonyDisplayInfo change. */ - void onTelephonyDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo); + void onTelephonyDisplayInfoChanged(int subId, TelephonyDisplayInfo telephonyDisplayInfo); } public TelephonyDisplayInfoListener(Context context, Callback callback) { mBaseTelephonyManager = context.getSystemService(TelephonyManager.class); mCallback = callback; mListeners = new HashMap<>(); + mDisplayInfos = new HashMap<>(); } /** * Get TelephonyDisplayInfo. */ - public TelephonyDisplayInfo getTelephonyDisplayInfo() { - return mTelephonyDisplayInfo; + public TelephonyDisplayInfo getTelephonyDisplayInfo(int subId) { + return mDisplayInfos.get(subId); } /** Resumes listening telephony display info changes to the set of ids from the last call to @@ -85,15 +87,17 @@ public class TelephonyDisplayInfoListener { for (int idToRemove : Sets.difference(currentIds, ids)) { stopListening(idToRemove); mListeners.remove(idToRemove); + mDisplayInfos.remove(idToRemove); } for (int idToAdd : Sets.difference(ids, currentIds)) { PhoneStateListener listener = new PhoneStateListener() { @Override public void onDisplayInfoChanged(TelephonyDisplayInfo telephonyDisplayInfo) { - mTelephonyDisplayInfo = telephonyDisplayInfo; - mCallback.onTelephonyDisplayInfoChanged(telephonyDisplayInfo); + mDisplayInfos.put(idToAdd, telephonyDisplayInfo); + mCallback.onTelephonyDisplayInfoChanged(idToAdd, telephonyDisplayInfo); } }; + mDisplayInfos.put(idToAdd, mDefaultTelephonyDisplayInfo); mListeners.put(idToAdd, listener); startListening(idToAdd); } diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java index 58afeb00a9b..ed8dc24063e 100644 --- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java @@ -52,6 +52,8 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; /** * Preference controller for "Auto Select Network" @@ -70,11 +72,17 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon ProgressDialog mProgressDialog; @VisibleForTesting SwitchPreference mSwitchPreference; + private AtomicBoolean mUpdatingConfig; + private int mCacheOfModeStatus; + private AtomicLong mRecursiveUpdate; public AutoSelectPreferenceController(Context context, String key) { super(context, key); mTelephonyManager = context.getSystemService(TelephonyManager.class); mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + mRecursiveUpdate = new AtomicLong(); + mUpdatingConfig = new AtomicBoolean(); + mCacheOfModeStatus = TelephonyManager.NETWORK_SELECTION_MODE_UNKNOWN; mListeners = new ArrayList<>(); mUiHandler = new Handler(Looper.getMainLooper()); mAllowedNetworkTypesListener = new AllowedNetworkTypesListener( @@ -88,7 +96,9 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon displayPreference(mPreferenceScreen); } if (mSwitchPreference != null) { + mRecursiveUpdate.getAndIncrement(); updateState(mSwitchPreference); + mRecursiveUpdate.decrementAndGet(); } } @@ -118,8 +128,13 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon @Override public boolean isChecked() { - return mTelephonyManager.getNetworkSelectionMode() - == TelephonyManager.NETWORK_SELECTION_MODE_AUTO; + if (!mUpdatingConfig.get()) { + mCacheOfModeStatus = mTelephonyManager.getNetworkSelectionMode(); + for (OnNetworkSelectModeListener lsn : mListeners) { + lsn.onNetworkSelectModeUpdated(mCacheOfModeStatus); + } + } + return mCacheOfModeStatus == TelephonyManager.NETWORK_SELECTION_MODE_AUTO; } @Override @@ -147,6 +162,10 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon @Override public boolean setChecked(boolean isChecked) { + if (mRecursiveUpdate.get() != 0) { + // Changing from software are allowed and changing presentation only. + return true; + } if (isChecked) { setAutomaticSelectionMode(); } else { @@ -171,18 +190,17 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon } return ThreadUtils.postOnBackgroundThread(() -> { // set network selection mode in background + mUpdatingConfig.set(true); mTelephonyManager.setNetworkSelectionModeAutomatic(); - final int mode = mTelephonyManager.getNetworkSelectionMode(); + mUpdatingConfig.set(false); //Update UI in UI thread final long durationMillis = SystemClock.elapsedRealtime() - startMillis; mUiHandler.postDelayed(() -> { + mRecursiveUpdate.getAndIncrement(); mSwitchPreference.setEnabled(true); - mSwitchPreference.setChecked( - mode == TelephonyManager.NETWORK_SELECTION_MODE_AUTO); - for (OnNetworkSelectModeListener lsn : mListeners) { - lsn.onNetworkSelectModeChanged(); - } + mSwitchPreference.setChecked(isChecked()); + mRecursiveUpdate.decrementAndGet(); dismissProgressBar(); }, Math.max(MINIMUM_DIALOG_TIME_MILLIS - durationMillis, 0)); }); @@ -232,11 +250,11 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon } /** - * Callback when network select mode is changed + * Callback when network select mode might get updated * * @see TelephonyManager#getNetworkSelectionMode() */ public interface OnNetworkSelectModeListener { - void onNetworkSelectModeChanged(); + void onNetworkSelectModeUpdated(int mode); } } diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java index 54f5ce15d72..4c5dd953453 100644 --- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java @@ -48,11 +48,13 @@ public class OpenNetworkSelectPagePreferenceController extends private Preference mPreference; private PreferenceScreen mPreferenceScreen; private AllowedNetworkTypesListener mAllowedNetworkTypesListener; + private int mCacheOfModeStatus; public OpenNetworkSelectPagePreferenceController(Context context, String key) { super(context, key); mTelephonyManager = context.getSystemService(TelephonyManager.class); mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + mCacheOfModeStatus = TelephonyManager.NETWORK_SELECTION_MODE_UNKNOWN; mAllowedNetworkTypesListener = new AllowedNetworkTypesListener( context.getMainExecutor()); mAllowedNetworkTypesListener.setAllowedNetworkTypesListener( @@ -96,7 +98,7 @@ public class OpenNetworkSelectPagePreferenceController extends @Override public void updateState(Preference preference) { super.updateState(preference); - preference.setEnabled(mTelephonyManager.getNetworkSelectionMode() + preference.setEnabled(mCacheOfModeStatus != TelephonyManager.NETWORK_SELECTION_MODE_AUTO); Intent intent = new Intent(); @@ -125,7 +127,10 @@ public class OpenNetworkSelectPagePreferenceController extends } @Override - public void onNetworkSelectModeChanged() { - updateState(mPreference); + public void onNetworkSelectModeUpdated(int mode) { + mCacheOfModeStatus = mode; + if (mPreference != null) { + updateState(mPreference); + } } } diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java index be778cbf29f..9e0ce8c7540 100644 --- a/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java @@ -26,15 +26,19 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; +import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settingslib.location.RecentLocationApps; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -50,7 +54,7 @@ import java.util.List; import java.util.Set; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowUserManager.class}) +@Config(shadows = {ShadowDeviceConfig.class, ShadowUserManager.class}) public class RecentLocationRequestPreferenceControllerTest { @Mock private PreferenceScreen mScreen; @@ -72,6 +76,11 @@ public class RecentLocationRequestPreferenceControllerTest { mController.mRecentLocationApps = spy(new RecentLocationApps(mContext)); } + @After + public void tearDown() { + ShadowDeviceConfig.reset(); + } + @Test public void updateState_whenAppListMoreThanThree_shouldDisplayTopThreeApps() { final List requests = createMockRequest(6); @@ -84,6 +93,10 @@ public class RecentLocationRequestPreferenceControllerTest { @Test public void updateState_whenAppListMoreThanThree_showSystem() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, + Boolean.toString(true), + true); when(mController.mRecentLocationApps.getAppListSorted(false)) .thenReturn(createMockRequest(2)); when(mController.mRecentLocationApps.getAppListSorted(true)) diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java index 3bcfcb48fa3..8ebd2b5d390 100644 --- a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java @@ -364,7 +364,8 @@ public class SubscriptionsPreferenceControllerTest { mController.onResume(); mController.displayPreference(mPreferenceScreen); - mController.onTelephonyDisplayInfoChanged(telephonyDisplayInfo); + mController.onTelephonyDisplayInfoChanged(sub.get(0).getSubscriptionId(), + telephonyDisplayInfo); assertThat(mPreferenceCategory.getPreference(0).getSummary()).isEqualTo(expectedSummary); } @@ -388,7 +389,8 @@ public class SubscriptionsPreferenceControllerTest { mController.onResume(); mController.displayPreference(mPreferenceScreen); - mController.onTelephonyDisplayInfoChanged(telephonyDisplayInfo); + mController.onTelephonyDisplayInfoChanged(sub.get(0).getSubscriptionId(), + telephonyDisplayInfo); assertThat(mPreferenceCategory.getPreference(0).getSummary()).isEqualTo(expectedSummary); } @@ -414,7 +416,8 @@ public class SubscriptionsPreferenceControllerTest { mController.onResume(); mController.displayPreference(mPreferenceScreen); - mController.onTelephonyDisplayInfoChanged(telephonyDisplayInfo); + mController.onTelephonyDisplayInfoChanged(sub.get(0).getSubscriptionId(), + telephonyDisplayInfo); assertThat(mPreferenceCategory.getPreference(0).getSummary()).isEqualTo(expectedSummary); } diff --git a/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java index f7e311131ce..53ae1b9eb53 100644 --- a/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java @@ -93,15 +93,18 @@ public class OpenNetworkSelectPagePreferenceControllerTest { mPreference = new Preference(mContext); mController = new OpenNetworkSelectPagePreferenceController(mContext, - "open_network_select"); + "open_network_select") { + @Override + public void updateState(Preference preference) { + super.updateState(mPreference); + } + }; mController.init(mLifecycle, SUB_ID); } @Test public void updateState_modeAuto_disabled() { - when(mTelephonyManager.getNetworkSelectionMode()).thenReturn( - TelephonyManager.NETWORK_SELECTION_MODE_AUTO); - + mController.onNetworkSelectModeUpdated(TelephonyManager.NETWORK_SELECTION_MODE_AUTO); mController.updateState(mPreference); assertThat(mPreference.isEnabled()).isFalse();