From 4c1dd91695c07c4c42da18eef2d323b3710ba778 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 18 May 2023 04:07:05 +0800 Subject: [PATCH 1/7] Restrict Printing Settings - Don't show Printing Settings if the user is restricted by UserManager.DISALLOW_PRINTING Bug: 269122009 Test: manual test atest -c PrintSettingsFragmentTest Change-Id: I15db778ebc4de3c8a76505043fab1ee02db3f290 --- .../settings/print/PrintSettingsFragment.java | 70 ++++++++++--- .../ProfileSettingsPreferenceFragment.java | 8 +- .../print/PrintSettingsFragmentTest.java | 97 +++++++++++++++++++ 3 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java index ed21b6f7f92..cd80998170c 100644 --- a/src/com/android/settings/print/PrintSettingsFragment.java +++ b/src/com/android/settings/print/PrintSettingsFragment.java @@ -28,6 +28,7 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.UserManager; import android.print.PrintJob; import android.print.PrintJobId; import android.print.PrintJobInfo; @@ -45,6 +46,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; +import androidx.annotation.VisibleForTesting; import androidx.loader.app.LoaderManager.LoaderCallbacks; import androidx.loader.content.AsyncTaskLoader; import androidx.loader.content.Loader; @@ -92,6 +94,22 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment private PrintServicesController mPrintServicesController; private Button mAddNewServiceButton; + @VisibleForTesting + boolean mIsUiRestricted; + + public PrintSettingsFragment() { + super(UserManager.DISALLOW_PRINTING); + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.print_settings; + } @Override public int getMetricsCategory() { @@ -107,12 +125,19 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = super.onCreateView(inflater, container, savedInstanceState); - addPreferencesFromResource(R.xml.print_settings); + mIsUiRestricted = isUiRestricted(); + setupPreferences(); + return root; + } - mActivePrintJobsCategory = (PreferenceCategory) findPreference( - PRINT_JOBS_CATEGORY); - mPrintServicesCategory = (PreferenceCategory) findPreference( - PRINT_SERVICES_CATEGORY); + @VisibleForTesting + void setupPreferences() { + if (mIsUiRestricted) { + return; + } + + mActivePrintJobsCategory = (PreferenceCategory) findPreference(PRINT_JOBS_CATEGORY); + mPrintServicesCategory = (PreferenceCategory) findPreference(PRINT_SERVICES_CATEGORY); getPreferenceScreen().removePreference(mActivePrintJobsCategory); mPrintJobsController = new PrintJobsController(); @@ -120,20 +145,20 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment mPrintServicesController = new PrintServicesController(); getLoaderManager().initLoader(LOADER_ID_PRINT_SERVICES, null, mPrintServicesController); - - return root; - } - - @Override - public void onStart() { - super.onStart(); - setHasOptionsMenu(true); - startSubSettingsIfNeeded(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupEmptyViews(); + } + + @VisibleForTesting + void setupEmptyViews() { + if (mIsUiRestricted) { + return; + } + ViewGroup contentRoot = (ViewGroup) getListView().getParent(); View emptyView = getActivity().getLayoutInflater().inflate( R.layout.empty_print_state, contentRoot, false); @@ -152,6 +177,23 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment setEmptyView(emptyView); } + @Override + public void onStart() { + super.onStart(); + startSettings(); + } + + @VisibleForTesting + void startSettings() { + if (mIsUiRestricted) { + getPreferenceScreen().removeAll(); + return; + } + + setHasOptionsMenu(true); + startSubSettingsIfNeeded(); + } + @Override protected String getIntentActionString() { return Settings.ACTION_PRINT_SETTINGS; diff --git a/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java b/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java index e41e1dad3a1..63b83f1bf34 100644 --- a/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java +++ b/src/com/android/settings/print/ProfileSettingsPreferenceFragment.java @@ -27,13 +27,17 @@ import android.widget.AdapterView; import android.widget.Spinner; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.dashboard.RestrictedDashboardFragment; import com.android.settings.dashboard.profileselector.UserAdapter; /** * Base fragment class for per profile settings. */ -public abstract class ProfileSettingsPreferenceFragment extends SettingsPreferenceFragment { +public abstract class ProfileSettingsPreferenceFragment extends RestrictedDashboardFragment { + + public ProfileSettingsPreferenceFragment(String restrictionKey) { + super(restrictionKey); + } @Override public void onViewCreated(View view, Bundle savedInstanceState) { diff --git a/tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java b/tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java new file mode 100644 index 00000000000..c52c5bc7f28 --- /dev/null +++ b/tests/unit/src/com/android/settings/print/PrintSettingsFragmentTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2023 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.print; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.os.Looper; +import android.view.View; + +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +@RunWith(AndroidJUnit4.class) +public class PrintSettingsFragmentTest { + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + private final Context mContext = ApplicationProvider.getApplicationContext(); + + private PrintSettingsFragment mFragment; + private PreferenceManager mPreferenceManager; + private PreferenceScreen mPreferenceScreen; + + @Before + public void setUp() { + if (Looper.myLooper() == null) { + Looper.prepare(); + } + mPreferenceManager = new PreferenceManager(mContext); + mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + mFragment = spy(new PrintSettingsFragment()); + doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); + }); + } + + @Test + public void setupPreferences_uiIsRestricted_doNotAddPreferences() { + mFragment.mIsUiRestricted = true; + + mFragment.setupPreferences(); + + verify(mFragment, never()).findPreference(any(CharSequence.class)); + } + + @Test + public void setupEmptyViews_uiIsRestricted_doNotSetEmptyView() { + mFragment.mIsUiRestricted = true; + + mFragment.setupEmptyViews(); + + verify(mFragment, never()).setEmptyView(any(View.class)); + } + + @Test + public void startSettings_uiIsRestricted_removeAllPreferences() { + mFragment.mIsUiRestricted = true; + + mFragment.startSettings(); + + assertThat(mPreferenceScreen.getPreferenceCount()).isEqualTo(0); + verify(mFragment, never()).setHasOptionsMenu(true); + } +} From 06c3ae5e82724345c253302f99010686807fcb35 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Thu, 25 May 2023 22:29:55 +0800 Subject: [PATCH 2/7] [Settings] Avoid settings crash from NPE of TelephonyManager. Bug: 233783567 Test: atest passed Change-Id: Ie0ed8fa3b87b8e130396cf4d918295403ae43501 --- .../telephony/PreferredNetworkModePreferenceController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java index feeed91910c..bdfeace1be6 100644 --- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java @@ -21,6 +21,7 @@ import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.util.Log; import androidx.preference.ListPreference; import androidx.preference.Preference; @@ -34,6 +35,7 @@ import com.android.settings.network.telephony.TelephonyConstants.TelephonyManage */ public class PreferredNetworkModePreferenceController extends TelephonyBasePreferenceController implements ListPreference.OnPreferenceChangeListener { + private static final String TAG = "PrefNetworkModeCtrl"; private CarrierConfigCache mCarrierConfigCache; private TelephonyManager mTelephonyManager; @@ -99,6 +101,10 @@ public class PreferredNetworkModePreferenceController extends TelephonyBasePrefe } private int getPreferredNetworkMode() { + if (mTelephonyManager == null) { + Log.w(TAG, "TelephonyManager is null"); + return TelephonyManagerConstants.NETWORK_MODE_UNKNOWN; + } return MobileNetworkUtils.getNetworkTypeFromRaf( (int) mTelephonyManager.getAllowedNetworkTypesForReason( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER)); From f7d8f0481ddf05ecbbe30e1c2dca8bdd0b09944d Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 26 May 2023 12:26:31 +0800 Subject: [PATCH 3/7] Fixed unable to enable hotspot with Security None - Due to the design adjustment, the default value of SoftApConfiguration is not Security None, so the update of Security None cannot be omitted. Bug: 283762826 Test: Manual test atest -c WifiTetherSettingsTest Change-Id: I07d18b8f73ab8190152332c01814a4bd72cf28d6 --- .../wifi/tether/WifiTetherSettings.java | 23 +++++++++-------- .../wifi/tether/WifiTetherSettingsTest.java | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java index 4ce59b9b53f..88d601a082b 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java +++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java @@ -84,8 +84,10 @@ public class WifiTetherSettings extends RestrictedDashboardFragment WifiTetherSSIDPreferenceController mSSIDPreferenceController; @VisibleForTesting WifiTetherPasswordPreferenceController mPasswordPreferenceController; - private WifiTetherSecurityPreferenceController mSecurityPreferenceController; - private WifiTetherMaximizeCompatibilityPreferenceController mMaxCompatibilityPrefController; + @VisibleForTesting + WifiTetherSecurityPreferenceController mSecurityPreferenceController; + @VisibleForTesting + WifiTetherMaximizeCompatibilityPreferenceController mMaxCompatibilityPrefController; @VisibleForTesting WifiTetherAutoOffPreferenceController mWifiTetherAutoOffPreferenceController; @@ -276,15 +278,16 @@ public class WifiTetherSettings extends RestrictedDashboardFragment SoftApConfiguration buildNewConfig() { SoftApConfiguration currentConfig = mWifiTetherViewModel.getSoftApConfiguration(); SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder(currentConfig); - int securityType = (mWifiTetherViewModel.isSpeedFeatureAvailable()) - ? currentConfig.getSecurityType() - : mSecurityPreferenceController.getSecurityType(); configBuilder.setSsid(mSSIDPreferenceController.getSSID()); - if (securityType != SoftApConfiguration.SECURITY_TYPE_OPEN) { - configBuilder.setPassphrase( - mPasswordPreferenceController.getPasswordValidated(securityType), - securityType); - } + int securityType = + mWifiTetherViewModel.isSpeedFeatureAvailable() + ? currentConfig.getSecurityType() + : mSecurityPreferenceController.getSecurityType(); + String passphrase = + securityType == SoftApConfiguration.SECURITY_TYPE_OPEN + ? null + : mPasswordPreferenceController.getPasswordValidated(securityType); + configBuilder.setPassphrase(passphrase, securityType); if (!mWifiTetherViewModel.isSpeedFeatureAvailable()) { mMaxCompatibilityPrefController.setupMaximizeCompatibility(configBuilder); } diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java index fe663abbc28..5005f4c9d5a 100644 --- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java @@ -16,6 +16,7 @@ package com.android.settings.wifi.tether; +import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_OPEN; import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_WPA3_SAE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -125,9 +126,13 @@ public class WifiTetherSettingsTest { @Mock private WifiTetherSSIDPreferenceController mSSIDPreferenceController; @Mock + private WifiTetherSecurityPreferenceController mSecurityPreferenceController; + @Mock private WifiTetherPasswordPreferenceController mPasswordPreferenceController; @Mock private WifiTetherAutoOffPreferenceController mWifiTetherAutoOffPreferenceController; + @Mock + private WifiTetherMaximizeCompatibilityPreferenceController mMaxCompatibilityPrefController; private WifiTetherSettings mSettings; @@ -156,10 +161,13 @@ public class WifiTetherSettingsTest { mSettings.mMainSwitchBar = mMainSwitchBar; mSettings.mSSIDPreferenceController = mSSIDPreferenceController; when(mSSIDPreferenceController.getSSID()).thenReturn(SSID); + mSettings.mSecurityPreferenceController = mSecurityPreferenceController; + when(mSecurityPreferenceController.getSecurityType()).thenReturn(SECURITY_TYPE_WPA3_SAE); mSettings.mPasswordPreferenceController = mPasswordPreferenceController; when(mPasswordPreferenceController.getPasswordValidated(anyInt())).thenReturn(PASSWORD); mSettings.mWifiTetherAutoOffPreferenceController = mWifiTetherAutoOffPreferenceController; when(mWifiTetherAutoOffPreferenceController.isEnabled()).thenReturn(true); + mSettings.mMaxCompatibilityPrefController = mMaxCompatibilityPrefController; mSettings.mWifiTetherViewModel = mWifiTetherViewModel; when(mSettings.findPreference(KEY_WIFI_HOTSPOT_SECURITY)).thenReturn(mWifiHotspotSecurity); when(mSettings.findPreference(KEY_WIFI_HOTSPOT_SPEED)).thenReturn(mWifiHotspotSpeed); @@ -359,6 +367,23 @@ public class WifiTetherSettingsTest { assertThat(newConfig.getBand()).isEqualTo(currentConfig.getBand()); } + @Test + public void buildNewConfig_securityTypeChangeToOpen_setSecurityTypeCorrectly() { + SoftApConfiguration currentConfig = new SoftApConfiguration.Builder() + .setPassphrase(PASSWORD, SECURITY_TYPE_WPA3_SAE) + .setBand(BAND_2GHZ_5GHZ_6GHZ) + .build(); + when(mWifiTetherViewModel.getSoftApConfiguration()).thenReturn(currentConfig); + when(mWifiTetherViewModel.isSpeedFeatureAvailable()).thenReturn(false); + doNothing().when(mMaxCompatibilityPrefController) + .setupMaximizeCompatibility(any(SoftApConfiguration.Builder.class)); + + when(mSecurityPreferenceController.getSecurityType()).thenReturn(SECURITY_TYPE_OPEN); + SoftApConfiguration newConfig = mSettings.buildNewConfig(); + + assertThat(newConfig.getSecurityType()).isEqualTo(SECURITY_TYPE_OPEN); + } + @Test public void onRestartingChanged_restartingFalse_setLoadingFalse() { doNothing().when(mSettings).setLoading(anyBoolean(), anyBoolean()); From d75bd5298244b63f7f8a7fe0c071c5872a0e09de Mon Sep 17 00:00:00 2001 From: tom hsu Date: Fri, 26 May 2023 13:39:18 +0800 Subject: [PATCH 4/7] [Settings] After APM on, do not show the page result in Settings search Bug: 249520846 Test: Manual test Change-Id: I51df50f244649a406449449a0b2d39164ad5e218 --- .../settings/network/telephony/MobileNetworkSettings.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 83d2117af1b..d6d9df4a992 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -52,7 +52,6 @@ import com.android.settings.wifi.WifiPickerTrackerHelper; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity; import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity; -import com.android.settingslib.mobile.dataservice.UiccInfoEntity; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; @@ -441,8 +440,10 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme /** suppress full page if user is not admin */ @Override protected boolean isPageSearchEnabled(Context context) { - return SubscriptionUtil.isSimHardwareVisible(context) && - context.getSystemService(UserManager.class).isAdminUser(); + boolean isAirplaneOff = Settings.Global.getInt(context.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 0; + return isAirplaneOff && SubscriptionUtil.isSimHardwareVisible(context) + && context.getSystemService(UserManager.class).isAdminUser(); } }; From 499a2fa16d5c99ab2e4691a400143ff6a3353828 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Thu, 25 May 2023 20:35:23 +0800 Subject: [PATCH 5/7] [Settings] Add data roaming observer - Data roaming can be controlled by SettingsProvider, it shall be listen the change and set the change state to repository. Bug: 278822324 Test: Manual test passed. Test: atest passed Change-Id: I6eb5330ba643c485c5d12eb879af1e0e8f7baed7 --- .../network/MobileNetworkRepository.java | 55 +++++++++++++++- .../RoamingPreferenceController.java | 63 +++---------------- 2 files changed, 63 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/network/MobileNetworkRepository.java b/src/com/android/settings/network/MobileNetworkRepository.java index e55ba26e106..f6096982f0c 100644 --- a/src/com/android/settings/network/MobileNetworkRepository.java +++ b/src/com/android/settings/network/MobileNetworkRepository.java @@ -88,7 +88,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions private List mMobileNetworkInfoEntityList = new ArrayList<>(); private Context mContext; private AirplaneModeObserver mAirplaneModeObserver; - private Uri mAirplaneModeSettingUri; + private DataRoamingObserver mDataRoamingObserver; private MetricsFeatureProvider mMetricsFeatureProvider; private Map mDataContentObserverMap = new HashMap<>(); private int mPhysicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX; @@ -127,10 +127,13 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions mUiccInfoDao = mMobileNetworkDatabase.mUiccInfoDao(); mMobileNetworkInfoDao = mMobileNetworkDatabase.mMobileNetworkInfoDao(); mAirplaneModeObserver = new AirplaneModeObserver(new Handler(Looper.getMainLooper())); - mAirplaneModeSettingUri = Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); + mDataRoamingObserver = new DataRoamingObserver(new Handler(Looper.getMainLooper())); } private class AirplaneModeObserver extends ContentObserver { + private Uri mAirplaneModeSettingUri = + Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON); + AirplaneModeObserver(Handler handler) { super(handler); } @@ -155,6 +158,46 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions } } + private class DataRoamingObserver extends ContentObserver { + private int mRegSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + private String mBaseField = Settings.Global.DATA_ROAMING; + + DataRoamingObserver(Handler handler) { + super(handler); + } + + public void register(Context context, int subId) { + mRegSubId = subId; + String lastField = mBaseField; + createTelephonyManagerBySubId(subId); + TelephonyManager tm = mTelephonyManagerMap.get(subId); + if (tm.getSimCount() != 1) { + lastField += subId; + } + context.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(lastField), false, this); + } + + public void unRegister(Context context) { + context.getContentResolver().unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + TelephonyManager tm = mTelephonyManagerMap.get(mRegSubId); + if (tm == null) { + return; + } + sExecutor.execute(() -> { + insertMobileNetworkInfo(mContext, mRegSubId, tm); + }); + boolean isDataRoamingEnabled = tm.isDataRoamingEnabled(); + for (MobileNetworkCallback callback : sCallbacks) { + callback.onDataRoamingChanged(mRegSubId, isDataRoamingEnabled); + } + } + } + /** * Register all callbacks and listener. * @@ -180,6 +223,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { addRegisterBySubId(subId); createTelephonyManagerBySubId(subId); + mDataRoamingObserver.register(mContext, subId); } } @@ -251,6 +295,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions if (sCallbacks.isEmpty()) { mSubscriptionManager.removeOnSubscriptionsChangedListener(this); mAirplaneModeObserver.unRegister(mContext); + mDataRoamingObserver.unRegister(mContext); mDataContentObserverMap.forEach((id, observer) -> { observer.unRegister(mContext); }); @@ -709,6 +754,12 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions default void onAirplaneModeChanged(boolean enabled) { } + /** + * Notify clients data roaming changed of subscription. + */ + default void onDataRoamingChanged(int subId, boolean enabled) { + } + default void onCallStateChanged(int state) { } } diff --git a/src/com/android/settings/network/telephony/RoamingPreferenceController.java b/src/com/android/settings/network/telephony/RoamingPreferenceController.java index ff5da52525b..fb8cd519e27 100644 --- a/src/com/android/settings/network/telephony/RoamingPreferenceController.java +++ b/src/com/android/settings/network/telephony/RoamingPreferenceController.java @@ -21,28 +21,23 @@ import static androidx.lifecycle.Lifecycle.Event.ON_STOP; import android.content.Context; import android.os.PersistableBundle; -import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; import androidx.annotation.VisibleForTesting; +import androidx.fragment.app.FragmentManager; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.OnLifecycleEvent; -import androidx.annotation.VisibleForTesting; -import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import com.android.settings.network.GlobalSettingsChangeListener; import com.android.settings.network.MobileNetworkRepository; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity; -import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity; -import com.android.settingslib.mobile.dataservice.UiccInfoEntity; import java.util.ArrayList; import java.util.List; @@ -52,7 +47,6 @@ import java.util.List; */ public class RoamingPreferenceController extends TelephonyTogglePreferenceController implements LifecycleObserver, MobileNetworkRepository.MobileNetworkCallback { - private static final String TAG = "RoamingController"; private static final String DIALOG_TAG = "MobileDataDialog"; @@ -63,15 +57,6 @@ public class RoamingPreferenceController extends TelephonyTogglePreferenceContro protected LifecycleOwner mLifecycleOwner; private List mMobileNetworkInfoEntityList = new ArrayList<>(); - /** - * There're 2 listeners both activated at the same time. - * For project that access DATA_ROAMING, only first listener is functional. - * For project that access "DATA_ROAMING + subId", first listener will be stopped when receiving - * any onChange from second listener. - */ - private GlobalSettingsChangeListener mListener; - private GlobalSettingsChangeListener mListenerForSubId; - @VisibleForTesting FragmentManager mFragmentManager; MobileNetworkInfoEntity mMobileNetworkInfoEntity; @@ -102,34 +87,11 @@ public class RoamingPreferenceController extends TelephonyTogglePreferenceContro public void onStart() { mMobileNetworkRepository.addRegister(mLifecycleOwner, this, mSubId); mMobileNetworkRepository.updateEntity(); - if (mListener == null) { - mListener = new GlobalSettingsChangeListener(mContext, - Settings.Global.DATA_ROAMING) { - public void onChanged(String field) { - updateState(mSwitchPreference); - } - }; - } - stopMonitorSubIdSpecific(); - - if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - return; - } - - mListenerForSubId = new GlobalSettingsChangeListener(mContext, - Settings.Global.DATA_ROAMING + mSubId) { - public void onChanged(String field) { - stopMonitor(); - updateState(mSwitchPreference); - } - }; } @OnLifecycleEvent(ON_STOP) public void onStop() { mMobileNetworkRepository.removeRegister(this); - stopMonitor(); - stopMonitorSubIdSpecific(); } @Override @@ -219,20 +181,6 @@ public class RoamingPreferenceController extends TelephonyTogglePreferenceContro dialogFragment.show(mFragmentManager, DIALOG_TAG); } - private void stopMonitor() { - if (mListener != null) { - mListener.close(); - mListener = null; - } - } - - private void stopMonitorSubIdSpecific() { - if (mListenerForSubId != null) { - mListenerForSubId.close(); - mListenerForSubId = null; - } - } - @VisibleForTesting public void setMobileNetworkInfoEntity(MobileNetworkInfoEntity mobileNetworkInfoEntity) { mMobileNetworkInfoEntity = mobileNetworkInfoEntity; @@ -251,4 +199,13 @@ public class RoamingPreferenceController extends TelephonyTogglePreferenceContro } }); } + + @Override + public void onDataRoamingChanged(int subId, boolean enabled) { + if (subId != mSubId) { + Log.d(TAG, "onDataRoamingChanged - wrong subId : " + subId + " / " + enabled); + return; + } + update(); + } } From bbef903b882a93e9e78b5d9f59b71587d2921fc0 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 26 May 2023 15:32:08 +0000 Subject: [PATCH 6/7] Revert "Update theme for ChannelPanelActivity" This reverts commit 41eeb31b200fa6764432378d974c01c3a17d843a. Reason for revert: b/284380876 Change-Id: Ia06bf047db187091753e560f70427abb5b26378a --- AndroidManifest.xml | 2 +- res/drawable/button_border_selected.xml | 3 +++ res/drawable/button_border_unselected.xml | 2 +- res/values/themes.xml | 3 --- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 08fbf04441d..6fe6832b76a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3717,7 +3717,7 @@ diff --git a/res/drawable/button_border_selected.xml b/res/drawable/button_border_selected.xml index 1402380d0ed..0cd4aa54b5a 100644 --- a/res/drawable/button_border_selected.xml +++ b/res/drawable/button_border_selected.xml @@ -15,7 +15,10 @@ limitations under the License. --> + diff --git a/res/drawable/button_border_unselected.xml b/res/drawable/button_border_unselected.xml index d0ce75b8c86..2c2ef3d8d83 100644 --- a/res/drawable/button_border_unselected.xml +++ b/res/drawable/button_border_unselected.xml @@ -18,7 +18,7 @@ android:shape="rectangle"> + android:color="@color/notification_importance_button_unselected"/> diff --git a/res/values/themes.xml b/res/values/themes.xml index 8f132799b79..eeba1c77aca 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -227,9 +227,6 @@ @*android:string/config_headlineFontFamilyMedium -