diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index adfff630985..ea85d539296 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -44,7 +44,7 @@
-
diff --git a/src/com/android/settings/DividedCategory.java b/src/com/android/settings/DividedCategory.java
deleted file mode 100644
index d1c40c86429..00000000000
--- a/src/com/android/settings/DividedCategory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2016 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;
-
-import android.content.Context;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-
-/**
- * PreferenceCategory that allows a divider above it.
- */
-public class DividedCategory extends PreferenceCategory {
-
- public DividedCategory(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.setDividerAllowedAbove(true);
- }
-}
diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java
index 8e450df810e..beb0ba14530 100644
--- a/src/com/android/settings/datausage/BillingCyclePreference.java
+++ b/src/com/android/settings/datausage/BillingCyclePreference.java
@@ -58,8 +58,9 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer
mSubId = subId;
mServices = services;
mPolicy = services.mPolicyEditor.getPolicy(mTemplate);
- setSummary(getContext().getString(R.string.billing_cycle_fragment_summary,
- mPolicy != null ? mPolicy.cycleDay : 1));
+ setSummary(getContext().getString(R.string.billing_cycle_fragment_summary, mPolicy != null
+ ? mPolicy.cycleDay
+ : "1"));
setIntent(getIntent());
}
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index a817479fe76..e12f89e0dc3 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -46,8 +46,10 @@ import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
+import com.android.settings.datausage.CycleAdapter.SpinnerInterface;
import com.android.settingslib.AppItem;
import com.android.settingslib.net.ChartData;
import com.android.settingslib.net.ChartDataLoader;
@@ -56,9 +58,7 @@ import com.android.settingslib.net.UidDetailProvider;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
@@ -73,6 +73,10 @@ import static com.android.settings.datausage.DataUsageSummary.TEST_RADIOS_PROP;
* to inspect based on usage cycle and control through {@link NetworkPolicy}.
*/
public class DataUsageList extends DataUsageBase {
+
+ public static final String EXTRA_SUB_ID = "sub_id";
+ public static final String EXTRA_NETWORK_TEMPLATE = "network_template";
+
private static final String TAG = "DataUsage";
private static final boolean LOGD = false;
@@ -82,8 +86,14 @@ public class DataUsageList extends DataUsageBase {
private static final int LOADER_CHART_DATA = 2;
private static final int LOADER_SUMMARY = 3;
- public static final String EXTRA_SUB_ID = "sub_id";
- public static final String EXTRA_NETWORK_TEMPLATE = "network_template";
+
+ private final CellDataPreference.DataStateListener mDataStateListener =
+ new CellDataPreference.DataStateListener() {
+ @Override
+ public void onChange(boolean selfChange) {
+ updatePolicy();
+ }
+ };
private INetworkStatsSession mStatsSession;
@@ -93,15 +103,7 @@ public class DataUsageList extends DataUsageBase {
private int mSubId;
private ChartData mChartData;
- /** Flag used to ignore listeners during binding. */
- private boolean mBinding;
-
private UidDetailProvider mUidDetailProvider;
-
- /**
- * Local cache of data enabled for subId, used to work around delays.
- */
- private final Map mMobileDataEnabled = new HashMap();
private CycleAdapter mCycleAdapter;
private Spinner mCycleSpinner;
private Preference mUsageAmount;
@@ -146,9 +148,14 @@ public class DataUsageList extends DataUsageBase {
super.onViewCreated(v, savedInstanceState);
mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner);
- mCycleSpinner = (Spinner) mHeader.findViewById(R.id.filter_spinner);
- mCycleAdapter = new CycleAdapter(mCycleSpinner.getContext(),
- new CycleAdapter.SpinnerInterface() {
+ mHeader.findViewById(R.id.filter_settings).setOnClickListener(btn -> {
+ final Bundle args = new Bundle();
+ args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
+ startFragment(DataUsageList.this, BillingCycleSettings.class.getName(),
+ R.string.billing_cycle, 0, args);
+ });
+ mCycleSpinner = mHeader.findViewById(R.id.filter_spinner);
+ mCycleAdapter = new CycleAdapter(mCycleSpinner.getContext(), new SpinnerInterface() {
@Override
public void setAdapter(CycleAdapter cycleAdapter) {
mCycleSpinner.setAdapter(cycleAdapter);
@@ -175,7 +182,7 @@ public class DataUsageList extends DataUsageBase {
@Override
public void onResume() {
super.onResume();
-
+ mDataStateListener.setListener(true, mSubId, getContext());
updateBody();
// kick off background task to update stats
@@ -201,6 +208,12 @@ public class DataUsageList extends DataUsageBase {
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
+ @Override
+ public void onPause() {
+ super.onPause();
+ mDataStateListener.setListener(false, mSubId, getContext());
+ }
+
@Override
public void onDestroy() {
mUidDetailProvider.clearCache();
@@ -217,7 +230,6 @@ public class DataUsageList extends DataUsageBase {
* binds them to visible controls.
*/
private void updateBody() {
- mBinding = true;
if (!isAdded()) return;
final Context context = getActivity();
@@ -231,10 +243,8 @@ public class DataUsageList extends DataUsageBase {
// detail mode can change visible menus, invalidate
getActivity().invalidateOptionsMenu();
- mBinding = false;
-
int seriesColor = context.getColor(R.color.sim_noitification);
- if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID){
+ if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
final SubscriptionInfo sir = services.mSubscriptionManager
.getActiveSubscriptionInfo(mSubId);
@@ -252,33 +262,22 @@ public class DataUsageList extends DataUsageBase {
* Update chart sweeps and cycle list to reflect {@link NetworkPolicy} for
* current {@link #mTemplate}.
*/
- private void updatePolicy(boolean refreshCycle) {
+ private void updatePolicy() {
final NetworkPolicy policy = services.mPolicyEditor.getPolicy(mTemplate);
+ final View configureButton = mHeader.findViewById(R.id.filter_settings);
//SUB SELECT
if (isNetworkPolicyModifiable(policy, mSubId) && isMobileDataAvailable(mSubId)) {
mChart.setNetworkPolicy(policy);
- mHeader.findViewById(R.id.filter_settings).setVisibility(View.VISIBLE);
- mHeader.findViewById(R.id.filter_settings).setOnClickListener(
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Bundle args = new Bundle();
- args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
- startFragment(DataUsageList.this, BillingCycleSettings.class.getName(),
- R.string.billing_cycle, 0, args);
- }
- });
+ configureButton.setVisibility(View.VISIBLE);
} else {
// controls are disabled; don't bind warning/limit sweeps
mChart.setNetworkPolicy(null);
- mHeader.findViewById(R.id.filter_settings).setVisibility(View.GONE);
+ configureButton.setVisibility(View.GONE);
}
- if (refreshCycle) {
- // generate cycle list based on policy and available history
- if (mCycleAdapter.updateCycleList(policy, mChartData)) {
- updateDetailData();
- }
+ // generate cycle list based on policy and available history
+ if (mCycleAdapter.updateCycleList(policy, mChartData)) {
+ updateDetailData();
}
}
@@ -413,9 +412,10 @@ public class DataUsageList extends DataUsageBase {
/**
* Accumulate data usage of a network stats entry for the item mapped by the collapse key.
* Creates the item if needed.
- * @param collapseKey the collapse key used to map the item.
- * @param knownItems collection of known (already existing) items.
- * @param entry the network stats entry to extract data usage from.
+ *
+ * @param collapseKey the collapse key used to map the item.
+ * @param knownItems collection of known (already existing) items.
+ * @param entry the network stats entry to extract data usage from.
* @param itemCategory the item is categorized on the list view by this category. Must be
*/
private static long accumulate(int collapseKey, final SparseArray knownItems,
@@ -461,7 +461,7 @@ public class DataUsageList extends DataUsageBase {
if (LOGD) {
Log.d(TAG, "hasReadyMobileRadio:"
+ " conn.isNetworkSupported(TYPE_MOBILE)="
- + conn.isNetworkSupported(TYPE_MOBILE)
+ + conn.isNetworkSupported(TYPE_MOBILE)
+ " isReady=" + isReady);
}
return retVal;
@@ -480,10 +480,13 @@ public class DataUsageList extends DataUsageBase {
final int slotId = SubscriptionManager.getSlotId(subId);
final boolean isReady = tele.getSimState(slotId) == SIM_STATE_READY;
- boolean retVal = conn.isNetworkSupported(TYPE_MOBILE) && isReady;
- if (LOGD) Log.d(TAG, "hasReadyMobileRadio: subId=" + subId
- + " conn.isNetworkSupported(TYPE_MOBILE)=" + conn.isNetworkSupported(TYPE_MOBILE)
- + " isReady=" + isReady);
+ boolean retVal = conn.isNetworkSupported(TYPE_MOBILE) && isReady;
+ if (LOGD) {
+ Log.d(TAG, "hasReadyMobileRadio: subId=" + subId
+ + " conn.isNetworkSupported(TYPE_MOBILE)="
+ + conn.isNetworkSupported(TYPE_MOBILE)
+ + " isReady=" + isReady);
+ }
return retVal;
}
@@ -524,8 +527,8 @@ public class DataUsageList extends DataUsageBase {
mChartData = data;
mChart.setNetworkStats(mChartData.network);
- // calcuate policy cycles based on available data
- updatePolicy(true);
+ // calculate policy cycles based on available data
+ updatePolicy();
}
@Override
diff --git a/src/com/android/settings/datausage/TemplatePreferenceCategory.java b/src/com/android/settings/datausage/TemplatePreferenceCategory.java
index 1ce5f1cb600..0be5c733b81 100644
--- a/src/com/android/settings/datausage/TemplatePreferenceCategory.java
+++ b/src/com/android/settings/datausage/TemplatePreferenceCategory.java
@@ -17,10 +17,10 @@ package com.android.settings.datausage;
import android.content.Context;
import android.net.NetworkTemplate;
import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
import android.util.AttributeSet;
-import com.android.settings.DividedCategory;
-public class TemplatePreferenceCategory extends DividedCategory implements TemplatePreference {
+public class TemplatePreferenceCategory extends PreferenceCategory implements TemplatePreference {
private NetworkTemplate mTemplate;
private int mSubId;
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
new file mode 100644
index 00000000000..c5570bb113c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2017 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 android.content.Context;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DataUsageListTest {
+
+ @Mock
+ private CellDataPreference.DataStateListener mListener;
+ @Mock
+ private TemplatePreference.NetworkServices mNetworkServices;
+ @Mock
+ private Context mContext;
+ private DataUsageList mDataUsageList;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mNetworkServices.mPolicyEditor = mock(NetworkPolicyEditor.class);
+ mDataUsageList = spy(DataUsageList.class);
+
+ doReturn(mContext).when(mDataUsageList).getContext();
+ ReflectionHelpers.setField(mDataUsageList, "mDataStateListener", mListener);
+ ReflectionHelpers.setField(mDataUsageList, "services", mNetworkServices);
+ }
+
+ @Test
+ public void resumePause_shouldListenUnlistenDataStateChange() {
+ mDataUsageList.onResume();
+
+ verify(mListener).setListener(true, 0, mContext);
+
+ mDataUsageList.onPause();
+
+ verify(mListener).setListener(false, 0, mContext);
+ }
+}