From 97866f0b508919d2c371580cbe15b65a4fc5cec9 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Wed, 30 Jan 2019 11:22:45 -0800 Subject: [PATCH] Use correct uid when querying usage data for specific user. - the data usage list shows usage data for each app, and also the aggregated data for work apps and other user. When user clicks on the app item, we will shows the detail usage data for that item using the app item key. However, if the app item is not for app but for user, the key will not be the app uid, but a key built from the user id. So, querying using the key will not get any data. - for app item corresponding for user, need to sum up all usage data for the uids associated with the user. Change-Id: I1a185ee6b4d59e477f3a03cade97d85d6982e416 Fixes: 122200400 Test: make RunSettingsRoboTests --- .../AppDataUsagePreferenceController.java | 2 +- .../settings/datausage/AppDataUsage.java | 40 ++++++++----- .../settings/datausage/AppDataUsageTest.java | 58 ++++++++++++++++++- 3 files changed, 81 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java index 1bfcd7d2b92..7d9fdcf75ad 100644 --- a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java @@ -89,7 +89,7 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle public Loader> onCreateLoader(int id, Bundle args) { final NetworkTemplate template = getTemplate(mContext); return NetworkCycleDataForUidLoader.builder(mContext) - .setUid(mParent.getAppEntry().info.uid) + .addUid(mParent.getAppEntry().info.uid) .setRetrieveDetail(false) .setNetworkTemplate(template) .setSubscriberId(template.getSubscriberId()) diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index 329bf68fe6a..4f388436474 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -94,10 +94,12 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC private SpinnerPreference mCycle; private RestrictedSwitchPreference mUnrestrictedData; private DataSaverBackend mDataSaverBackend; + private Context mContext; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + mContext = getContext(); mPackageManager = getPackageManager(); final Bundle args = getArguments(); @@ -105,9 +107,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mTemplate = (args != null) ? (NetworkTemplate) args.getParcelable(ARG_NETWORK_TEMPLATE) : null; if (mTemplate == null) { - Context context = getContext(); - mTemplate = DataUsageUtils.getDefaultTemplate(context, - DataUsageUtils.getDefaultSubscriptionId(context)); + mTemplate = DataUsageUtils.getDefaultTemplate(mContext, + DataUsageUtils.getDefaultSubscriptionId(mContext)); } if (mAppItem == null) { int uid = (args != null) ? args.getInt(AppInfoBase.ARG_PACKAGE_UID, -1) @@ -131,7 +132,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mBackgroundUsage = findPreference(KEY_BACKGROUND_USAGE); mCycle = (SpinnerPreference) findPreference(KEY_CYCLE); - mCycleAdapter = new CycleAdapter(getContext(), mCycle, mCycleListener); + mCycleAdapter = new CycleAdapter(mContext, mCycle, mCycleListener); if (mAppItem.key > 0) { if (mPackages.size() != 0) { @@ -155,7 +156,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC KEY_UNRESTRICTED_DATA); mUnrestrictedData.setOnPreferenceChangeListener(this); } - mDataSaverBackend = new DataSaverBackend(getContext()); + mDataSaverBackend = new DataSaverBackend(mContext); mAppSettings = findPreference(KEY_APP_SETTINGS); mAppSettingsIntent = new Intent(Intent.ACTION_MANAGE_NETWORK_USAGE); @@ -256,7 +257,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC private void updatePrefs(boolean restrictBackground, boolean unrestrictData) { final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted( - getContext(), mPackageName, UserHandle.getUserId(mAppItem.key)); + mContext, mPackageName, UserHandle.getUserId(mAppItem.key)); if (mRestrictBackground != null) { mRestrictBackground.setChecked(!restrictBackground); mRestrictBackground.setDisabledByAdmin(admin); @@ -294,11 +295,10 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC foregroundBytes = data.getForegroudUsage(); } final long totalBytes = backgroundBytes + foregroundBytes; - final Context context = getContext(); - mTotalUsage.setSummary(DataUsageUtils.formatDataUsage(context, totalBytes)); - mForegroundUsage.setSummary(DataUsageUtils.formatDataUsage(context, foregroundBytes)); - mBackgroundUsage.setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes)); + mTotalUsage.setSummary(DataUsageUtils.formatDataUsage(mContext, totalBytes)); + mForegroundUsage.setSummary(DataUsageUtils.formatDataUsage(mContext, foregroundBytes)); + mBackgroundUsage.setSummary(DataUsageUtils.formatDataUsage(mContext, backgroundBytes)); } private boolean getAppRestrictBackground() { @@ -364,16 +364,24 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC } }; - private final LoaderManager.LoaderCallbacks> mUidDataCallbacks = + @VisibleForTesting + final LoaderManager.LoaderCallbacks> mUidDataCallbacks = new LoaderManager.LoaderCallbacks>() { @Override public Loader> onCreateLoader(int id, Bundle args) { - return NetworkCycleDataForUidLoader.builder(getContext()) - .setUid(mAppItem.key) - .setRetrieveDetail(true) + final NetworkCycleDataForUidLoader.Builder builder + = NetworkCycleDataForUidLoader.builder(mContext); + builder.setRetrieveDetail(true) .setNetworkTemplate(mTemplate) - .setSubscriberId(mTemplate.getSubscriberId()) - .build(); + .setSubscriberId(mTemplate.getSubscriberId()); + if (mAppItem.category == AppItem.CATEGORY_USER) { + for (int i = 0; i < mAppItem.uids.size(); i++) { + builder.addUid(mAppItem.uids.keyAt(i)); + } + } else { + builder.addUid(mAppItem.key); + } + return builder.build(); } @Override diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 37bb3cdfbc5..12559f4c637 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -16,6 +16,8 @@ package com.android.settings.datausage; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -31,7 +33,9 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.PackageManager; import android.net.NetworkPolicyManager; +import android.net.NetworkTemplate; import android.os.Bundle; +import android.text.format.DateUtils; import android.util.ArraySet; import android.view.View; @@ -47,6 +51,7 @@ import com.android.settingslib.AppItem; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.net.NetworkCycleDataForUid; +import com.android.settingslib.net.NetworkCycleDataForUidLoader; import org.junit.After; import org.junit.Before; @@ -188,7 +193,7 @@ public class AppDataUsageTest { ReflectionHelpers.setField(mFragment, "mBackgroundUsage", preference); ReflectionHelpers.setField(mFragment, "mForegroundUsage", preference); ReflectionHelpers.setField(mFragment, "mTotalUsage", preference); - doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); + ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application); mFragment.bindData(0 /* position */); @@ -199,7 +204,7 @@ public class AppDataUsageTest { public void bindData_hasAppUsageData_shouldShowCycleSpinnerAndUpdateUsageSummary() { mFragment = spy(new AppDataUsage()); final Context context = RuntimeEnvironment.application; - doReturn(context).when(mFragment).getContext(); + ReflectionHelpers.setField(mFragment, "mContext", context); final long backgroundBytes = 1234L; final long foregroundBytes = 5678L; final List appUsage = new ArrayList<>(); @@ -223,4 +228,53 @@ public class AppDataUsageTest { verify(backgroundPref).setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes)); verify(foregroundPref).setSummary(DataUsageUtils.formatDataUsage(context, foregroundBytes)); } + + @Test + public void onCreateLoader_categoryApp_shouldQueryDataUsageUsingAppKey() { + mFragment = new AppDataUsage(); + final Context context = RuntimeEnvironment.application; + final int testUid = 123123; + final AppItem appItem = new AppItem(testUid); + appItem.category = AppItem.CATEGORY_APP; + ReflectionHelpers.setField(mFragment, "mContext", context); + ReflectionHelpers.setField(mFragment, "mAppItem", appItem); + ReflectionHelpers.setField(mFragment, "mTemplate", + NetworkTemplate.buildTemplateWifiWildcard()); + 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 uids = loader.getUids(); + assertThat(uids).hasSize(1); + assertThat(uids.get(0)).isEqualTo(testUid); + } + + @Test + public void onCreateLoader_categoryUser_shouldQueryDataUsageUsingAssociatedUids() { + mFragment = new AppDataUsage(); + 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", + NetworkTemplate.buildTemplateWifiWildcard()); + 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 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); + } }