Loading src/com/android/settings/network/telephony/DataUsagePreferenceController.java +44 −6 Original line number Diff line number Diff line Loading @@ -22,22 +22,33 @@ import android.net.NetworkTemplate; import android.provider.Settings; import android.telephony.SubscriptionManager; import android.text.TextUtils; import android.util.Log; import androidx.preference.Preference; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.datausage.DataUsageUtils; import com.android.settingslib.net.DataUsageController; import com.android.settingslib.utils.ThreadUtils; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicReference; /** * Preference controller for "Data usage" */ public class DataUsagePreferenceController extends TelephonyBasePreferenceController { private NetworkTemplate mTemplate; private static final String LOG_TAG = "DataUsagePreferCtrl"; private Future<NetworkTemplate> mTemplateFuture; private AtomicReference<NetworkTemplate> mTemplate; public DataUsagePreferenceController(Context context, String key) { super(context, key); mTemplate = new AtomicReference<NetworkTemplate>(); } @Override Loading @@ -53,7 +64,7 @@ public class DataUsagePreferenceController extends TelephonyBasePreferenceContro return false; } final Intent intent = new Intent(Settings.ACTION_MOBILE_DATA_USAGE); intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, mTemplate); intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, getNetworkTemplate()); intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); mContext.startActivity(intent); Loading @@ -78,22 +89,49 @@ public class DataUsagePreferenceController extends TelephonyBasePreferenceContro public void init(int subId) { mSubId = subId; mTemplate.set(null); mTemplateFuture = ThreadUtils.postOnBackgroundThread(() -> fetchMobileTemplate(mContext, mSubId)); } private NetworkTemplate fetchMobileTemplate(Context context, int subId) { if (!SubscriptionManager.isValidSubscriptionId(subId)) { return; return null; } return DataUsageUtils.getMobileTemplate(context, subId); } private NetworkTemplate getNetworkTemplate() { if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { return null; } NetworkTemplate template = mTemplate.get(); if (template != null) { return template; } mTemplate = DataUsageUtils.getDefaultTemplate(mContext, mSubId); try { template = mTemplateFuture.get(); mTemplate.set(template); } catch (ExecutionException | InterruptedException | NullPointerException exception) { Log.e(LOG_TAG, "Fail to get data usage template", exception); } return template; } @VisibleForTesting DataUsageController.DataUsageInfo getDataUsageInfo(DataUsageController controller) { return controller.getDataUsageInfo(getNetworkTemplate()); } private CharSequence getDataUsageSummary(Context context, int subId) { final DataUsageController controller = new DataUsageController(context); controller.setSubscriptionId(subId); final DataUsageController.DataUsageInfo usageInfo = controller.getDataUsageInfo(mTemplate); final DataUsageController.DataUsageInfo usageInfo = getDataUsageInfo(controller); long usageLevel = usageInfo.usageLevel; if (usageLevel <= 0L) { usageLevel = controller.getHistoricalUsageLevel(mTemplate); usageLevel = controller.getHistoricalUsageLevel(getNetworkTemplate()); } if (usageLevel <= 0L) { return null; Loading tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java +8 −9 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settings.network.telephony; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; Loading @@ -36,7 +37,6 @@ import com.android.settings.core.BasePreferenceController; import com.android.settingslib.net.DataUsageController; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; Loading @@ -46,7 +46,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.shadows.ShadowTelephonyManager; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) public class DataUsagePreferenceControllerTest { Loading @@ -73,7 +72,7 @@ public class DataUsagePreferenceControllerTest { doReturn(mNetworkStatsManager).when(mContext).getSystemService(NetworkStatsManager.class); mPreference = new SwitchPreference(mContext); mController = new DataUsagePreferenceController(mContext, "data_usage"); mController = spy(new DataUsagePreferenceController(mContext, "data_usage")); mController.init(SUB_ID); mPreference.setKey(mController.getPreferenceKey()); } Loading Loading @@ -115,10 +114,10 @@ public class DataUsagePreferenceControllerTest { } @Test @Ignore public void updateState_noUsageData_shouldDisablePreference() { ReflectionHelpers.setField( mController, "mDataUsageInfo", new DataUsageController.DataUsageInfo()); final DataUsageController.DataUsageInfo usageInfo = new DataUsageController.DataUsageInfo(); doReturn(usageInfo).when(mController).getDataUsageInfo(any()); mController.updateState(mPreference); Loading @@ -126,11 +125,11 @@ public class DataUsagePreferenceControllerTest { } @Test @Ignore public void updateState_shouldUseIECUnit() { final DataUsageController.DataUsageInfo usageInfo = new DataUsageController.DataUsageInfo(); final DataUsageController.DataUsageInfo usageInfo = new DataUsageController.DataUsageInfo(); usageInfo.usageLevel = TrafficStats.MB_IN_BYTES; ReflectionHelpers.setField(mController, "mDataUsageInfo", usageInfo); doReturn(usageInfo).when(mController).getDataUsageInfo(any()); mController.updateState(mPreference); Loading Loading
src/com/android/settings/network/telephony/DataUsagePreferenceController.java +44 −6 Original line number Diff line number Diff line Loading @@ -22,22 +22,33 @@ import android.net.NetworkTemplate; import android.provider.Settings; import android.telephony.SubscriptionManager; import android.text.TextUtils; import android.util.Log; import androidx.preference.Preference; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.datausage.DataUsageUtils; import com.android.settingslib.net.DataUsageController; import com.android.settingslib.utils.ThreadUtils; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicReference; /** * Preference controller for "Data usage" */ public class DataUsagePreferenceController extends TelephonyBasePreferenceController { private NetworkTemplate mTemplate; private static final String LOG_TAG = "DataUsagePreferCtrl"; private Future<NetworkTemplate> mTemplateFuture; private AtomicReference<NetworkTemplate> mTemplate; public DataUsagePreferenceController(Context context, String key) { super(context, key); mTemplate = new AtomicReference<NetworkTemplate>(); } @Override Loading @@ -53,7 +64,7 @@ public class DataUsagePreferenceController extends TelephonyBasePreferenceContro return false; } final Intent intent = new Intent(Settings.ACTION_MOBILE_DATA_USAGE); intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, mTemplate); intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, getNetworkTemplate()); intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); mContext.startActivity(intent); Loading @@ -78,22 +89,49 @@ public class DataUsagePreferenceController extends TelephonyBasePreferenceContro public void init(int subId) { mSubId = subId; mTemplate.set(null); mTemplateFuture = ThreadUtils.postOnBackgroundThread(() -> fetchMobileTemplate(mContext, mSubId)); } private NetworkTemplate fetchMobileTemplate(Context context, int subId) { if (!SubscriptionManager.isValidSubscriptionId(subId)) { return; return null; } return DataUsageUtils.getMobileTemplate(context, subId); } private NetworkTemplate getNetworkTemplate() { if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { return null; } NetworkTemplate template = mTemplate.get(); if (template != null) { return template; } mTemplate = DataUsageUtils.getDefaultTemplate(mContext, mSubId); try { template = mTemplateFuture.get(); mTemplate.set(template); } catch (ExecutionException | InterruptedException | NullPointerException exception) { Log.e(LOG_TAG, "Fail to get data usage template", exception); } return template; } @VisibleForTesting DataUsageController.DataUsageInfo getDataUsageInfo(DataUsageController controller) { return controller.getDataUsageInfo(getNetworkTemplate()); } private CharSequence getDataUsageSummary(Context context, int subId) { final DataUsageController controller = new DataUsageController(context); controller.setSubscriptionId(subId); final DataUsageController.DataUsageInfo usageInfo = controller.getDataUsageInfo(mTemplate); final DataUsageController.DataUsageInfo usageInfo = getDataUsageInfo(controller); long usageLevel = usageInfo.usageLevel; if (usageLevel <= 0L) { usageLevel = controller.getHistoricalUsageLevel(mTemplate); usageLevel = controller.getHistoricalUsageLevel(getNetworkTemplate()); } if (usageLevel <= 0L) { return null; Loading
tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java +8 −9 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settings.network.telephony; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; Loading @@ -36,7 +37,6 @@ import com.android.settings.core.BasePreferenceController; import com.android.settingslib.net.DataUsageController; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; Loading @@ -46,7 +46,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.shadows.ShadowTelephonyManager; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) public class DataUsagePreferenceControllerTest { Loading @@ -73,7 +72,7 @@ public class DataUsagePreferenceControllerTest { doReturn(mNetworkStatsManager).when(mContext).getSystemService(NetworkStatsManager.class); mPreference = new SwitchPreference(mContext); mController = new DataUsagePreferenceController(mContext, "data_usage"); mController = spy(new DataUsagePreferenceController(mContext, "data_usage")); mController.init(SUB_ID); mPreference.setKey(mController.getPreferenceKey()); } Loading Loading @@ -115,10 +114,10 @@ public class DataUsagePreferenceControllerTest { } @Test @Ignore public void updateState_noUsageData_shouldDisablePreference() { ReflectionHelpers.setField( mController, "mDataUsageInfo", new DataUsageController.DataUsageInfo()); final DataUsageController.DataUsageInfo usageInfo = new DataUsageController.DataUsageInfo(); doReturn(usageInfo).when(mController).getDataUsageInfo(any()); mController.updateState(mPreference); Loading @@ -126,11 +125,11 @@ public class DataUsagePreferenceControllerTest { } @Test @Ignore public void updateState_shouldUseIECUnit() { final DataUsageController.DataUsageInfo usageInfo = new DataUsageController.DataUsageInfo(); final DataUsageController.DataUsageInfo usageInfo = new DataUsageController.DataUsageInfo(); usageInfo.usageLevel = TrafficStats.MB_IN_BYTES; ReflectionHelpers.setField(mController, "mDataUsageInfo", usageInfo); doReturn(usageInfo).when(mController).getDataUsageInfo(any()); mController.updateState(mPreference); Loading