Merge "Implement off state for SIM details page" into qt-dev
diff --git a/res/xml/mobile_network_settings_v2.xml b/res/xml/mobile_network_settings_v2.xml
index 6682437..6890a41 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"/>
 
-    <com.android.settings.datausage.DataUsageSummaryPreference
-        android:key="status_header"
-        android:visibility="gone"
-        android:selectable="false" />
-
-    <ListPreference
-        android:key="calls_preference"
-        android:title="@string/calls_preference"
-        settings:controller="com.android.settings.network.telephony.CallsDefaultSubscriptionController"
-        settings:allowDividerAbove="true" />
-
-    <ListPreference
-        android:key="sms_preference"
-        android:title="@string/sms_preference"
-        settings:controller="com.android.settings.network.telephony.SmsDefaultSubscriptionController" />
-
-    <Preference
-        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" />
-
-    <SwitchPreference
-        android:key="mobile_data_enable"
-        android:title="@string/mobile_data_settings_title"
-        android:summary="@string/mobile_data_settings_summary"
-        settings:controller="com.android.settings.network.telephony.MobileDataPreferenceController"
-        settings:allowDividerAbove="true"/>
-
-    <com.android.settingslib.RestrictedSwitchPreference
-        android:key="button_roaming_key"
-        android:title="@string/roaming"
-        android:persistent="false"
-        android:summaryOn="@string/roaming_enable"
-        android:summaryOff="@string/roaming_disable"
-        settings:userRestriction="no_data_roaming"
-        settings:controller="com.android.settings.network.telephony.RoamingPreferenceController"/>
-
-    <Preference
-        android:key="data_usage_summary"
-        android:title="@string/mobile_data_usage_title"
-        settings:controller="com.android.settings.network.telephony.DataUsagePreferenceController"/>
-
-    <com.android.settings.datausage.BillingCyclePreference
-        android:key="billing_preference"
-        android:title="@string/billing_cycle"
-        settings:controller="com.android.settings.datausage.BillingCyclePreferenceController" />
-
-    <SwitchPreference
-        android:key="mms_message"
-        android:title="@string/mms_message_title"
-        android:summary="@string/mms_message_summary"
-        settings:controller="com.android.settings.network.telephony.MmsMessagePreferenceController" />
-
-    <SwitchPreference
-        android:key="enhanced_4g_lte"
-        android:title="@string/enhanced_4g_lte_mode_title"
-        android:persistent="false"
-        android:summary="@string/enhanced_4g_lte_mode_summary"
-        settings:controller="com.android.settings.network.telephony.Enhanced4gLtePreferenceController"/>
-
-    <ListPreference
-        android:key="preferred_network_mode_key"
-        android:title="@string/preferred_network_mode_title"
-        android:summary="@string/preferred_network_mode_summary"
-        android:entries="@array/preferred_network_mode_choices"
-        android:entryValues="@array/preferred_network_mode_values"
-        android:dialogTitle="@string/preferred_network_mode_dialogtitle"
-        settings:controller="com.android.settings.network.telephony.PreferredNetworkModePreferenceController"/>
-
-    <ListPreference
-        android:key="enabled_networks_key"
-        android:title="@string/preferred_network_mode_title"
-        android:summary="@string/preferred_network_mode_summary"
-        android:entries="@array/enabled_networks_choices"
-        android:entryValues="@array/enabled_networks_values"
-        android:dialogTitle="@string/preferred_network_mode_dialogtitle"
-        settings:controller="com.android.settings.network.telephony.EnabledNetworkModePreferenceController"/>
-
-    <Preference
-        android:key="carrier_settings_version_key"
-        android:title="@string/carrier_settings_version"
-        settings:controller="com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController"
-        settings:enableCopying="true" />
-
     <PreferenceCategory
-        android:key="calling_category"
-        android:title="@string/call_category">
+        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">
 
-        <PreferenceScreen
-            android:key="wifi_calling_key"
-            android:title="@string/wifi_calling_settings_title"
-            settings:controller="com.android.settings.network.telephony.WifiCallingPreferenceController" >
-            <intent android:action="android.intent.action.MAIN"
-                    android:targetPackage="com.android.settings"
-                    android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity">
-                        <extra android:name="show_drawer_menu" android:value="true" />
-            </intent>
-        </PreferenceScreen>
+        <com.android.settings.datausage.DataUsageSummaryPreference
+            android:key="status_header"
+            android:visibility="gone"
+            android:selectable="false" />
 
-        <SwitchPreference
-            android:key="video_calling_key"
-            android:title="@string/video_calling_settings_title"
-            android:persistent="true"
-            settings:controller="com.android.settings.network.telephony.VideoCallingPreferenceController" />
+        <ListPreference
+            android:key="calls_preference"
+            android:title="@string/calls_preference"
+            settings:controller="com.android.settings.network.telephony.CallsDefaultSubscriptionController"
+            settings:allowDividerAbove="true"/>
 
-    </PreferenceCategory>
-
-    <com.android.settings.network.telephony.cdma.CdmaListPreference
-        android:key="cdma_system_select_key"
-        android:title="@string/cdma_system_select_title"
-        android:summary="@string/cdma_system_select_summary"
-        android:entries="@array/cdma_system_select_choices"
-        android:entryValues="@array/cdma_system_select_values"
-        android:dialogTitle="@string/cdma_system_select_dialogtitle"
-        settings:controller="com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController"/>
-
-    <com.android.settings.network.telephony.cdma.CdmaListPreference
-        android:key="cdma_subscription_key"
-        android:title="@string/cdma_subscription_title"
-        android:summary="@string/cdma_subscription_summary"
-        android:entries="@array/cdma_subscription_choices"
-        android:entryValues="@array/cdma_subscription_values"
-        android:dialogTitle="@string/cdma_subscription_dialogtitle"
-        settings:controller="com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController"/>
-
-    <PreferenceCategory
-        android:key="network_operators_category_key"
-        android:title="@string/network_operator_category"
-        settings:controller="com.android.settings.widget.PreferenceCategoryController">
-
-        <SwitchPreference
-            android:key="auto_select_key"
-            android:title="@string/select_automatically"
-            settings:controller="com.android.settings.network.telephony.gsm.AutoSelectPreferenceController"/>
+        <ListPreference
+            android:key="sms_preference"
+            android:title="@string/sms_preference"
+            settings:controller="com.android.settings.network.telephony.SmsDefaultSubscriptionController"/>
 
         <Preference
-            android:key="choose_network_key"
-            android:title="@string/choose_network_title"
-            android:fragment="com.android.phone.NetworkSelectSetting"
-            settings:controller="com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController"/>
+            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"/>
+
+        <SwitchPreference
+            android:key="mobile_data_enable"
+            android:title="@string/mobile_data_settings_title"
+            android:summary="@string/mobile_data_settings_summary"
+            settings:controller="com.android.settings.network.telephony.MobileDataPreferenceController"
+            settings:allowDividerAbove="true"/>
+
+        <com.android.settingslib.RestrictedSwitchPreference
+            android:key="button_roaming_key"
+            android:title="@string/roaming"
+            android:persistent="false"
+            android:summaryOn="@string/roaming_enable"
+            android:summaryOff="@string/roaming_disable"
+            settings:userRestriction="no_data_roaming"
+            settings:controller="com.android.settings.network.telephony.RoamingPreferenceController"/>
+
+        <Preference
+            android:key="data_usage_summary"
+            android:title="@string/mobile_data_usage_title"
+            settings:controller="com.android.settings.network.telephony.DataUsagePreferenceController"/>
+
+        <com.android.settings.datausage.BillingCyclePreference
+            android:key="billing_preference"
+            android:title="@string/billing_cycle"
+            settings:controller="com.android.settings.datausage.BillingCyclePreferenceController"/>
+
+        <SwitchPreference
+            android:key="mms_message"
+            android:title="@string/mms_message_title"
+            android:summary="@string/mms_message_summary"
+            settings:controller="com.android.settings.network.telephony.MmsMessagePreferenceController"/>
+
+        <SwitchPreference
+            android:key="enhanced_4g_lte"
+            android:title="@string/enhanced_4g_lte_mode_title"
+            android:persistent="false"
+            android:summary="@string/enhanced_4g_lte_mode_summary"
+            settings:controller="com.android.settings.network.telephony.Enhanced4gLtePreferenceController"/>
+
+        <ListPreference
+            android:key="preferred_network_mode_key"
+            android:title="@string/preferred_network_mode_title"
+            android:summary="@string/preferred_network_mode_summary"
+            android:entries="@array/preferred_network_mode_choices"
+            android:entryValues="@array/preferred_network_mode_values"
+            android:dialogTitle="@string/preferred_network_mode_dialogtitle"
+            settings:controller="com.android.settings.network.telephony.PreferredNetworkModePreferenceController"/>
+
+        <ListPreference
+            android:key="enabled_networks_key"
+            android:title="@string/preferred_network_mode_title"
+            android:summary="@string/preferred_network_mode_summary"
+            android:entries="@array/enabled_networks_choices"
+            android:entryValues="@array/enabled_networks_values"
+            android:dialogTitle="@string/preferred_network_mode_dialogtitle"
+            settings:controller="com.android.settings.network.telephony.EnabledNetworkModePreferenceController"/>
+
+        <Preference
+            android:key="carrier_settings_version_key"
+            android:title="@string/carrier_settings_version"
+            settings:controller="com.android.settings.network.telephony.CarrierSettingsVersionPreferenceController"
+            settings:enableCopying="true"/>
+
+        <PreferenceCategory
+            android:key="calling_category"
+            android:title="@string/call_category">
+
+            <PreferenceScreen
+                android:key="wifi_calling_key"
+                android:title="@string/wifi_calling_settings_title"
+                settings:controller="com.android.settings.network.telephony.WifiCallingPreferenceController">
+                <intent android:action="android.intent.action.MAIN"
+                        android:targetPackage="com.android.settings"
+                        android:targetClass="com.android.settings.Settings$WifiCallingSettingsActivity">
+                    <extra android:name="show_drawer_menu" android:value="true"/>
+                </intent>
+            </PreferenceScreen>
+
+            <SwitchPreference
+                android:key="video_calling_key"
+                android:title="@string/video_calling_settings_title"
+                android:persistent="true"
+                settings:controller="com.android.settings.network.telephony.VideoCallingPreferenceController"/>
+
+        </PreferenceCategory>
+
+        <com.android.settings.network.telephony.cdma.CdmaListPreference
+            android:key="cdma_system_select_key"
+            android:title="@string/cdma_system_select_title"
+            android:summary="@string/cdma_system_select_summary"
+            android:entries="@array/cdma_system_select_choices"
+            android:entryValues="@array/cdma_system_select_values"
+            android:dialogTitle="@string/cdma_system_select_dialogtitle"
+            settings:controller="com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController"/>
+
+        <com.android.settings.network.telephony.cdma.CdmaListPreference
+            android:key="cdma_subscription_key"
+            android:title="@string/cdma_subscription_title"
+            android:summary="@string/cdma_subscription_summary"
+            android:entries="@array/cdma_subscription_choices"
+            android:entryValues="@array/cdma_subscription_values"
+            android:dialogTitle="@string/cdma_subscription_dialogtitle"
+            settings:controller="com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController"/>
+
+        <PreferenceCategory
+            android:key="network_operators_category_key"
+            android:title="@string/network_operator_category"
+            settings:controller="com.android.settings.widget.PreferenceCategoryController">
+
+            <SwitchPreference
+                android:key="auto_select_key"
+                android:title="@string/select_automatically"
+                settings:controller="com.android.settings.network.telephony.gsm.AutoSelectPreferenceController"/>
+
+            <Preference
+                android:key="choose_network_key"
+                android:title="@string/choose_network_title"
+                android:fragment="com.android.phone.NetworkSelectSetting"
+                settings:controller="com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController"/>
+        </PreferenceCategory>
+
+        <!--We want separate APN setting from reset of settings because we want user to change it with caution-->
+        <com.android.settingslib.RestrictedPreference
+            android:key="telephony_apn_key"
+            android:persistent="false"
+            android:title="@string/mobile_network_apn_title"
+            settings:allowDividerAbove="true"
+            settings:controller="com.android.settings.network.telephony.ApnPreferenceController"/>
+
+        <Preference
+            android:key="carrier_settings_key"
+            android:title="@string/carrier_settings_title"
+            settings:controller="com.android.settings.network.telephony.CarrierPreferenceController">
+        </Preference>
+
     </PreferenceCategory>
 
-    <!--We want separate APN setting from reset of settings because we want user to change it with caution-->
-    <com.android.settingslib.RestrictedPreference
-        android:key="telephony_apn_key"
-        android:persistent="false"
-        android:title="@string/mobile_network_apn_title"
-        settings:allowDividerAbove="true"
-        settings:controller="com.android.settings.network.telephony.ApnPreferenceController"/>
-
-    <Preference
-        android:key="carrier_settings_key"
-        android:title="@string/carrier_settings_title"
-        settings:controller="com.android.settings.network.telephony.CarrierPreferenceController">
-    </Preference>
-
 </PreferenceScreen>
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 0000000..22cbb13
--- /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 db99258..eb00b9f 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -131,12 +131,13 @@
         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 0000000..c1004fa
--- /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();
+    }
+}