OSDN Git Service

Disable "Mobile data" in "Data usage" if no SIM.
authorMalcolm Chen <refuhoo@google.com>
Thu, 15 Feb 2018 22:40:13 +0000 (14:40 -0800)
committerMalcolm Chen <refuhoo@google.com>
Sat, 3 Mar 2018 00:00:33 +0000 (16:00 -0800)
If SIM is taken out, we disable "Mobile data" button in "Data usage"
page.

Bug: 67408951
Test: manual
Change-Id: I9f8937eadd5494f4f7710b9d5431176a13324bdd

src/com/android/settings/datausage/CellDataPreference.java
tests/robotests/src/com/android/settings/datausage/CellDataPreferenceTest.java [new file with mode: 0644]

index d24c092..b93fe66 100644 (file)
@@ -25,6 +25,7 @@ import android.os.Looper;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.Settings.Global;
+import android.support.annotation.VisibleForTesting;
 import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.telephony.SubscriptionInfo;
@@ -51,7 +52,8 @@ public class CellDataPreference extends CustomDialogPreference implements Templa
     public boolean mChecked;
     public boolean mMultiSimDialog;
     private TelephonyManager mTelephonyManager;
-    private SubscriptionManager mSubscriptionManager;
+    @VisibleForTesting
+    SubscriptionManager mSubscriptionManager;
 
     public CellDataPreference(Context context, AttributeSet attrs) {
         super(context, attrs, TypedArrayUtils.getAttr(context,
@@ -85,12 +87,19 @@ public class CellDataPreference extends CustomDialogPreference implements Templa
     @Override
     public void onAttached() {
         super.onAttached();
-        mListener.setListener(true, mSubId, getContext());
+        mDataStateListener.setListener(true, mSubId, getContext());
+        if (mSubscriptionManager!= null) {
+            mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+        }
     }
 
     @Override
     public void onDetached() {
-        mListener.setListener(false, mSubId, getContext());
+        mDataStateListener.setListener(false, mSubId, getContext());
+        if (mSubscriptionManager!= null) {
+            mSubscriptionManager.removeOnSubscriptionsChangedListener(
+                    mOnSubscriptionsChangeListener);
+        }
         super.onDetached();
     }
 
@@ -101,10 +110,14 @@ public class CellDataPreference extends CustomDialogPreference implements Templa
         }
         mSubscriptionManager = SubscriptionManager.from(getContext());
         mTelephonyManager = TelephonyManager.from(getContext());
+
+        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+
         if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             mSubId = subId;
             setKey(getKey() + subId);
         }
+        updateEnabled();
         updateChecked();
     }
 
@@ -112,6 +125,12 @@ public class CellDataPreference extends CustomDialogPreference implements Templa
         setChecked(mTelephonyManager.getDataEnabled(mSubId));
     }
 
+    private void updateEnabled() {
+        // If this subscription is not active, for example, SIM card is taken out, we disable
+        // the button.
+        setEnabled(mSubscriptionManager.getActiveSubscriptionInfo(mSubId) != null);
+    }
+
     @Override
     protected void performClick(View view) {
         final Context context = getContext();
@@ -237,7 +256,19 @@ public class CellDataPreference extends CustomDialogPreference implements Templa
         }
     }
 
-    private final DataStateListener mListener = new DataStateListener() {
+    @VisibleForTesting
+    final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener
+            = new SubscriptionManager.OnSubscriptionsChangedListener() {
+        @Override
+        public void onSubscriptionsChanged() {
+            if (DataUsageSummary.LOGD) {
+                Log.d(TAG, "onSubscriptionsChanged");
+            }
+            updateEnabled();
+        }
+    };
+
+    private final DataStateListener mDataStateListener = new DataStateListener() {
         @Override
         public void onChange(boolean selfChange) {
             updateChecked();
diff --git a/tests/robotests/src/com/android/settings/datausage/CellDataPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/CellDataPreferenceTest.java
new file mode 100644 (file)
index 0000000..e520a7b
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class CellDataPreferenceTest {
+
+    @Mock
+    private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private SubscriptionInfo mSubInfo;
+
+    private Context mContext;
+    private PreferenceViewHolder mHolder;
+    private CellDataPreference mPreference;
+    private SubscriptionManager.OnSubscriptionsChangedListener mListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mPreference = new CellDataPreference(mContext, null);
+        mListener = mPreference.mOnSubscriptionsChangeListener;
+
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        final View view = inflater.inflate(mPreference.getLayoutResource(),
+                new LinearLayout(mContext), false);
+
+        mHolder = PreferenceViewHolder.createInstanceForTests(view);
+    }
+
+    @Test
+    public void noActiveSub_shouldDisable() {
+        mPreference.mSubscriptionManager = mSubscriptionManager;
+        mListener.onSubscriptionsChanged();
+        assertThat(mPreference.isEnabled()).isFalse();
+
+        when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt()))
+                .thenReturn(mSubInfo);
+        mListener.onSubscriptionsChanged();
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+}