diff --git a/res/xml/mobile_network_settings_v2.xml b/res/xml/mobile_network_settings_v2.xml index 6682437bc74..6890a418187 100644 --- a/res/xml/mobile_network_settings_v2.xml +++ b/res/xml/mobile_network_settings_v2.xml @@ -24,162 +24,170 @@ android:layout="@layout/styled_switch_bar" settings:controller="com.android.settings.network.telephony.MobileNetworkSwitchController"/> - - - - - - - - - - - - - - - - - - - - - - - - - - + android:key="enabled_state_container" + android:title="@string/summary_placeholder" + settings:controller="com.android.settings.network.telephony.DisabledSubscriptionController" + android:layout="@layout/preference_category_no_label"> - - - - - + - + - - - - - - - - - + + android:key="cdma_lte_data_service_key" + android:title="@string/cdma_lte_data_service" + settings:controller="com.android.settings.network.telephony.DataServiceSetupPreferenceController" + settings:allowDividerAbove="true" + settings:allowDividerBelow="false"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - diff --git a/src/com/android/settings/network/telephony/DisabledSubscriptionController.java b/src/com/android/settings/network/telephony/DisabledSubscriptionController.java new file mode 100644 index 00000000000..22cbb138c37 --- /dev/null +++ b/src/com/android/settings/network/telephony/DisabledSubscriptionController.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2019 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.network.telephony; + +import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; +import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; + +import android.content.Context; +import android.telephony.SubscriptionManager; + +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.OnLifecycleEvent; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.network.SubscriptionsChangeListener; + +public class DisabledSubscriptionController extends BasePreferenceController implements + SubscriptionsChangeListener.SubscriptionsChangeListenerClient, LifecycleObserver { + private PreferenceCategory mCategory; + private int mSubId; + private SubscriptionsChangeListener mChangeListener; + private SubscriptionManager mSubscriptionManager; + + public DisabledSubscriptionController(Context context, String preferenceKey) { + super(context, preferenceKey); + mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); + mChangeListener = new SubscriptionsChangeListener(context, this); + } + + public void init(Lifecycle lifecycle, int subId) { + lifecycle.addObserver(this); + mSubId = subId; + } + + @OnLifecycleEvent(ON_RESUME) + public void onResume() { + mChangeListener.start(); + update(); + } + + @OnLifecycleEvent(ON_PAUSE) + public void onPause() { + mChangeListener.stop(); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mCategory = screen.findPreference(getPreferenceKey()); + update(); + } + + private void update() { + if (mCategory == null || mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + return; + } + mCategory.setVisible(mSubscriptionManager.isSubscriptionEnabled(mSubId)); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE_UNSEARCHABLE; + } + + @Override + public void onAirplaneModeChanged(boolean airplaneModeEnabled) { + } + + @Override + public void onSubscriptionsChanged() { + update(); + } +} diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index db99258a57b..eb00b9f64f9 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -131,12 +131,13 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment { super.onAttach(context); if (FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2)) { - use(CallsDefaultSubscriptionController.class).init(getLifecycle()); - use(SmsDefaultSubscriptionController.class).init(getLifecycle()); - use(MobileNetworkSwitchController.class).init(getLifecycle(), mSubId); - use(CarrierSettingsVersionPreferenceController.class).init(mSubId); - use(BillingCyclePreferenceController.class).init(mSubId); - use(MmsMessagePreferenceController.class).init(mSubId); + use(CallsDefaultSubscriptionController.class).init(getLifecycle()); + use(SmsDefaultSubscriptionController.class).init(getLifecycle()); + use(MobileNetworkSwitchController.class).init(getLifecycle(), mSubId); + use(CarrierSettingsVersionPreferenceController.class).init(mSubId); + use(BillingCyclePreferenceController.class).init(mSubId); + use(MmsMessagePreferenceController.class).init(mSubId); + use(DisabledSubscriptionController.class).init(getLifecycle(), mSubId); } use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId); use(RoamingPreferenceController.class).init(getFragmentManager(), mSubId); diff --git a/tests/robotests/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java new file mode 100644 index 00000000000..c1004faf572 --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/telephony/DisabledSubscriptionControllerTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2019 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.network.telephony; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +import android.content.Context; +import android.telephony.SubscriptionManager; + +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceScreen; + +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class DisabledSubscriptionControllerTest { + + private static final String KEY = "disabled_subscription_category"; + private static final int SUB_ID = 111; + + @Mock + private SubscriptionManager mSubscriptionManager; + @Mock + private PreferenceScreen mScreen; + + private PreferenceCategory mCategory; + private Context mContext; + private Lifecycle mLifecycle; + private DisabledSubscriptionController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + LifecycleOwner lifecycleOwner = () -> mLifecycle; + mLifecycle = new Lifecycle(lifecycleOwner); + doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class); + mCategory = new PreferenceCategory(mContext); + doReturn(mCategory).when(mScreen).findPreference(KEY); + mController = new DisabledSubscriptionController(mContext, KEY); + mController.init(mLifecycle, SUB_ID); + } + + @Test + public void displayPreference_subscriptionEnabled_categoryIsVisible() { + doReturn(true).when(mSubscriptionManager).isSubscriptionEnabled(SUB_ID); + mController.displayPreference(mScreen); + assertThat(mCategory.isVisible()).isTrue(); + } + + @Test + public void displayPreference_subscriptionDisabled_categoryIsNotVisible() { + doReturn(false).when(mSubscriptionManager).isSubscriptionEnabled(SUB_ID); + mController.displayPreference(mScreen); + assertThat(mCategory.isVisible()).isFalse(); + } + + @Test + public void onSubscriptionsChanged_subscriptionBecomesDisabled_categoryIsNotVisible() { + doReturn(true).when(mSubscriptionManager).isSubscriptionEnabled(SUB_ID); + mController.displayPreference(mScreen); + doReturn(false).when(mSubscriptionManager).isSubscriptionEnabled(SUB_ID); + mController.onSubscriptionsChanged(); + assertThat(mCategory.isVisible()).isFalse(); + } + + @Test + public void onSubscriptionsChanged_subscriptionBecomesEnabled_categoryIsVisible() { + doReturn(false).when(mSubscriptionManager).isSubscriptionEnabled(SUB_ID); + mController.displayPreference(mScreen); + doReturn(true).when(mSubscriptionManager).isSubscriptionEnabled(SUB_ID); + mController.onSubscriptionsChanged(); + assertThat(mCategory.isVisible()).isTrue(); + } +}