Create AppDataUsageCycleController
To improve performance and better organization and testings. Fix: 240931350 Test: manual - on AppDataUsage Test: unit test Change-Id: I277133b55378a3445aceb826d771b14c0fc91e4a
This commit is contained in:
@@ -41,8 +41,8 @@ import android.net.NetworkTemplate;
|
||||
import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.ArraySet;
|
||||
import android.util.Range;
|
||||
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.preference.Preference;
|
||||
@@ -51,6 +51,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.settings.applications.AppInfoBase;
|
||||
import com.android.settings.datausage.lib.NetworkUsageDetailsData;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
|
||||
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
|
||||
@@ -61,8 +62,6 @@ import com.android.settingslib.AppItem;
|
||||
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||
import com.android.settingslib.RestrictedSwitchPreference;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.net.NetworkCycleDataForUid;
|
||||
import com.android.settingslib.net.NetworkCycleDataForUidLoader;
|
||||
import com.android.settingslib.net.UidDetail;
|
||||
import com.android.settingslib.net.UidDetailProvider;
|
||||
|
||||
@@ -80,7 +79,6 @@ import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowSubscriptionManager;
|
||||
import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -254,163 +252,33 @@ public class AppDataUsageTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bindData_noAppUsageData_shouldHideCycleSpinner() {
|
||||
mFragment = spy(new TestFragment());
|
||||
final SpinnerPreference cycle = mock(SpinnerPreference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mCycle", cycle);
|
||||
final Preference preference = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mBackgroundUsage", preference);
|
||||
ReflectionHelpers.setField(mFragment, "mForegroundUsage", preference);
|
||||
ReflectionHelpers.setField(mFragment, "mTotalUsage", preference);
|
||||
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
|
||||
|
||||
mFragment.bindData(0 /* position */);
|
||||
|
||||
verify(cycle).setHasCycles(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bindData_hasAppUsageData_shouldShowCycleSpinnerAndUpdateUsageSummary() {
|
||||
public void bindData_shouldUpdateUsageSummary() {
|
||||
mFragment = spy(new TestFragment());
|
||||
final Context context = RuntimeEnvironment.application;
|
||||
ReflectionHelpers.setField(mFragment, "mContext", context);
|
||||
final long backgroundBytes = 1234L;
|
||||
final long foregroundBytes = 5678L;
|
||||
final List<NetworkCycleDataForUid> appUsage = new ArrayList<>();
|
||||
appUsage.add(new NetworkCycleDataForUid.Builder()
|
||||
.setBackgroundUsage(backgroundBytes).setForegroundUsage(foregroundBytes).build());
|
||||
ReflectionHelpers.setField(mFragment, "mUsageData", appUsage);
|
||||
final NetworkUsageDetailsData appUsage = new NetworkUsageDetailsData(
|
||||
new Range<>(1L, 2L),
|
||||
backgroundBytes + foregroundBytes,
|
||||
foregroundBytes,
|
||||
backgroundBytes
|
||||
);
|
||||
final Preference backgroundPref = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mBackgroundUsage", backgroundPref);
|
||||
final Preference foregroundPref = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mForegroundUsage", foregroundPref);
|
||||
final Preference totalPref = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mTotalUsage", totalPref);
|
||||
final SpinnerPreference cycle = mock(SpinnerPreference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mCycle", cycle);
|
||||
|
||||
mFragment.bindData(0 /* position */);
|
||||
mFragment.bindData(appUsage);
|
||||
|
||||
verify(cycle).setHasCycles(true);
|
||||
verify(totalPref).setSummary(
|
||||
DataUsageUtils.formatDataUsage(context, backgroundBytes + foregroundBytes));
|
||||
verify(backgroundPref).setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes));
|
||||
verify(foregroundPref).setSummary(DataUsageUtils.formatDataUsage(context, foregroundBytes));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateLoader_categoryApp_shouldQueryDataUsageUsingAppKey() {
|
||||
mFragment = new TestFragment();
|
||||
final Context context = RuntimeEnvironment.application;
|
||||
final int testUid = 123123;
|
||||
final AppItem appItem = new AppItem(testUid);
|
||||
appItem.addUid(testUid);
|
||||
appItem.category = AppItem.CATEGORY_APP;
|
||||
ReflectionHelpers.setField(mFragment, "mContext", context);
|
||||
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
|
||||
ReflectionHelpers.setField(mFragment, "mTemplate",
|
||||
new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
|
||||
final long end = System.currentTimeMillis();
|
||||
final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
|
||||
|
||||
final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader)
|
||||
mFragment.mUidDataCallbacks.onCreateLoader(0, Bundle.EMPTY);
|
||||
|
||||
final List<Integer> uids = loader.getUids();
|
||||
assertThat(uids).hasSize(1);
|
||||
assertThat(uids.get(0)).isEqualTo(testUid);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateLoader_categoryUser_shouldQueryDataUsageUsingAssociatedUids() {
|
||||
mFragment = new TestFragment();
|
||||
final Context context = RuntimeEnvironment.application;
|
||||
final int testUserId = 11;
|
||||
final AppItem appItem = new AppItem(testUserId);
|
||||
appItem.category = AppItem.CATEGORY_USER;
|
||||
appItem.addUid(123);
|
||||
appItem.addUid(456);
|
||||
appItem.addUid(789);
|
||||
ReflectionHelpers.setField(mFragment, "mContext", context);
|
||||
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
|
||||
ReflectionHelpers.setField(mFragment, "mTemplate",
|
||||
new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
|
||||
final long end = System.currentTimeMillis();
|
||||
final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
|
||||
|
||||
final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader)
|
||||
mFragment.mUidDataCallbacks.onCreateLoader(0, Bundle.EMPTY);
|
||||
|
||||
final List<Integer> uids = loader.getUids();
|
||||
assertThat(uids).hasSize(3);
|
||||
assertThat(uids.get(0)).isEqualTo(123);
|
||||
assertThat(uids.get(1)).isEqualTo(456);
|
||||
assertThat(uids.get(2)).isEqualTo(789);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateLoader_hasCyclesSpecified_shouldQueryDataUsageForSpecifiedCycles() {
|
||||
final long startTime = 1521583200000L;
|
||||
final long endTime = 1521676800000L;
|
||||
ArrayList<Long> testCycles = new ArrayList<>();
|
||||
testCycles.add(endTime);
|
||||
testCycles.add(startTime);
|
||||
final int uid = 123;
|
||||
final AppItem appItem = new AppItem(uid);
|
||||
appItem.category = AppItem.CATEGORY_APP;
|
||||
appItem.addUid(uid);
|
||||
|
||||
mFragment = new TestFragment();
|
||||
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
|
||||
ReflectionHelpers.setField(mFragment, "mCycles", testCycles);
|
||||
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
|
||||
ReflectionHelpers.setField(mFragment, "mTemplate",
|
||||
new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build());
|
||||
|
||||
final NetworkCycleDataForUidLoader loader = (NetworkCycleDataForUidLoader)
|
||||
mFragment.mUidDataCallbacks.onCreateLoader(0 /* id */, Bundle.EMPTY /* args */);
|
||||
|
||||
final ArrayList<Long> cycles = loader.getCycles();
|
||||
assertThat(cycles).hasSize(2);
|
||||
assertThat(cycles.get(0)).isEqualTo(endTime);
|
||||
assertThat(cycles.get(1)).isEqualTo(startTime);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onLoadFinished_hasSelectedCycleSpecified_shouldSelectSpecifiedCycle() {
|
||||
final long now = System.currentTimeMillis();
|
||||
final long tenDaysAgo = now - (DateUtils.DAY_IN_MILLIS * 10);
|
||||
final long twentyDaysAgo = now - (DateUtils.DAY_IN_MILLIS * 20);
|
||||
final long thirtyDaysAgo = now - (DateUtils.DAY_IN_MILLIS * 30);
|
||||
final List<NetworkCycleDataForUid> data = new ArrayList<>();
|
||||
NetworkCycleDataForUid.Builder builder = new NetworkCycleDataForUid.Builder();
|
||||
builder.setStartTime(thirtyDaysAgo).setEndTime(twentyDaysAgo).setTotalUsage(9876L);
|
||||
data.add(builder.build());
|
||||
builder = new NetworkCycleDataForUid.Builder();
|
||||
builder.setStartTime(twentyDaysAgo).setEndTime(tenDaysAgo).setTotalUsage(5678L);
|
||||
data.add(builder.build());
|
||||
builder = new NetworkCycleDataForUid.Builder();
|
||||
builder.setStartTime(tenDaysAgo).setEndTime(now).setTotalUsage(1234L);
|
||||
data.add(builder.build());
|
||||
|
||||
mFragment = new TestFragment();
|
||||
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
|
||||
ReflectionHelpers.setField(mFragment, "mCycleAdapter", mock(CycleAdapter.class));
|
||||
ReflectionHelpers.setField(mFragment, "mSelectedCycle", tenDaysAgo);
|
||||
final Preference backgroundPref = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mBackgroundUsage", backgroundPref);
|
||||
final Preference foregroundPref = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mForegroundUsage", foregroundPref);
|
||||
final Preference totalPref = mock(Preference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mTotalUsage", totalPref);
|
||||
final SpinnerPreference cycle = mock(SpinnerPreference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mCycle", cycle);
|
||||
|
||||
mFragment.mUidDataCallbacks.onLoadFinished(null /* loader */, data);
|
||||
|
||||
verify(cycle).setSelection(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = {ShadowDataUsageUtils.class, ShadowSubscriptionManager.class,
|
||||
ShadowFragment.class})
|
||||
@@ -447,6 +315,10 @@ public class AppDataUsageTest {
|
||||
return mock(clazz);
|
||||
}
|
||||
|
||||
@Override
|
||||
void initCycle(List<Integer> uidList) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) {
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user