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
This commit is contained in:
Doris Ling
2019-01-30 11:22:45 -08:00
parent 1cf1d9b643
commit 97866f0b50
3 changed files with 81 additions and 19 deletions

View File

@@ -89,7 +89,7 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle
public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) { public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
final NetworkTemplate template = getTemplate(mContext); final NetworkTemplate template = getTemplate(mContext);
return NetworkCycleDataForUidLoader.builder(mContext) return NetworkCycleDataForUidLoader.builder(mContext)
.setUid(mParent.getAppEntry().info.uid) .addUid(mParent.getAppEntry().info.uid)
.setRetrieveDetail(false) .setRetrieveDetail(false)
.setNetworkTemplate(template) .setNetworkTemplate(template)
.setSubscriberId(template.getSubscriberId()) .setSubscriberId(template.getSubscriberId())

View File

@@ -94,10 +94,12 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
private SpinnerPreference mCycle; private SpinnerPreference mCycle;
private RestrictedSwitchPreference mUnrestrictedData; private RestrictedSwitchPreference mUnrestrictedData;
private DataSaverBackend mDataSaverBackend; private DataSaverBackend mDataSaverBackend;
private Context mContext;
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
mContext = getContext();
mPackageManager = getPackageManager(); mPackageManager = getPackageManager();
final Bundle args = getArguments(); final Bundle args = getArguments();
@@ -105,9 +107,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
mTemplate = (args != null) ? (NetworkTemplate) args.getParcelable(ARG_NETWORK_TEMPLATE) mTemplate = (args != null) ? (NetworkTemplate) args.getParcelable(ARG_NETWORK_TEMPLATE)
: null; : null;
if (mTemplate == null) { if (mTemplate == null) {
Context context = getContext(); mTemplate = DataUsageUtils.getDefaultTemplate(mContext,
mTemplate = DataUsageUtils.getDefaultTemplate(context, DataUsageUtils.getDefaultSubscriptionId(mContext));
DataUsageUtils.getDefaultSubscriptionId(context));
} }
if (mAppItem == null) { if (mAppItem == null) {
int uid = (args != null) ? args.getInt(AppInfoBase.ARG_PACKAGE_UID, -1) 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); mBackgroundUsage = findPreference(KEY_BACKGROUND_USAGE);
mCycle = (SpinnerPreference) findPreference(KEY_CYCLE); mCycle = (SpinnerPreference) findPreference(KEY_CYCLE);
mCycleAdapter = new CycleAdapter(getContext(), mCycle, mCycleListener); mCycleAdapter = new CycleAdapter(mContext, mCycle, mCycleListener);
if (mAppItem.key > 0) { if (mAppItem.key > 0) {
if (mPackages.size() != 0) { if (mPackages.size() != 0) {
@@ -155,7 +156,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
KEY_UNRESTRICTED_DATA); KEY_UNRESTRICTED_DATA);
mUnrestrictedData.setOnPreferenceChangeListener(this); mUnrestrictedData.setOnPreferenceChangeListener(this);
} }
mDataSaverBackend = new DataSaverBackend(getContext()); mDataSaverBackend = new DataSaverBackend(mContext);
mAppSettings = findPreference(KEY_APP_SETTINGS); mAppSettings = findPreference(KEY_APP_SETTINGS);
mAppSettingsIntent = new Intent(Intent.ACTION_MANAGE_NETWORK_USAGE); 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) { private void updatePrefs(boolean restrictBackground, boolean unrestrictData) {
final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted( final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted(
getContext(), mPackageName, UserHandle.getUserId(mAppItem.key)); mContext, mPackageName, UserHandle.getUserId(mAppItem.key));
if (mRestrictBackground != null) { if (mRestrictBackground != null) {
mRestrictBackground.setChecked(!restrictBackground); mRestrictBackground.setChecked(!restrictBackground);
mRestrictBackground.setDisabledByAdmin(admin); mRestrictBackground.setDisabledByAdmin(admin);
@@ -294,11 +295,10 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
foregroundBytes = data.getForegroudUsage(); foregroundBytes = data.getForegroudUsage();
} }
final long totalBytes = backgroundBytes + foregroundBytes; final long totalBytes = backgroundBytes + foregroundBytes;
final Context context = getContext();
mTotalUsage.setSummary(DataUsageUtils.formatDataUsage(context, totalBytes)); mTotalUsage.setSummary(DataUsageUtils.formatDataUsage(mContext, totalBytes));
mForegroundUsage.setSummary(DataUsageUtils.formatDataUsage(context, foregroundBytes)); mForegroundUsage.setSummary(DataUsageUtils.formatDataUsage(mContext, foregroundBytes));
mBackgroundUsage.setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes)); mBackgroundUsage.setSummary(DataUsageUtils.formatDataUsage(mContext, backgroundBytes));
} }
private boolean getAppRestrictBackground() { private boolean getAppRestrictBackground() {
@@ -364,16 +364,24 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
} }
}; };
private final LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>> mUidDataCallbacks = @VisibleForTesting
final LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>> mUidDataCallbacks =
new LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>() { new LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>() {
@Override @Override
public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) { public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
return NetworkCycleDataForUidLoader.builder(getContext()) final NetworkCycleDataForUidLoader.Builder builder
.setUid(mAppItem.key) = NetworkCycleDataForUidLoader.builder(mContext);
.setRetrieveDetail(true) builder.setRetrieveDetail(true)
.setNetworkTemplate(mTemplate) .setNetworkTemplate(mTemplate)
.setSubscriberId(mTemplate.getSubscriberId()) .setSubscriberId(mTemplate.getSubscriberId());
.build(); 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 @Override

View File

@@ -16,6 +16,8 @@
package com.android.settings.datausage; package com.android.settings.datausage;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
@@ -31,7 +33,9 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.NetworkPolicyManager; import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
import android.os.Bundle; import android.os.Bundle;
import android.text.format.DateUtils;
import android.util.ArraySet; import android.util.ArraySet;
import android.view.View; import android.view.View;
@@ -47,6 +51,7 @@ import com.android.settingslib.AppItem;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.RestrictedSwitchPreference;
import com.android.settingslib.net.NetworkCycleDataForUid; import com.android.settingslib.net.NetworkCycleDataForUid;
import com.android.settingslib.net.NetworkCycleDataForUidLoader;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -188,7 +193,7 @@ public class AppDataUsageTest {
ReflectionHelpers.setField(mFragment, "mBackgroundUsage", preference); ReflectionHelpers.setField(mFragment, "mBackgroundUsage", preference);
ReflectionHelpers.setField(mFragment, "mForegroundUsage", preference); ReflectionHelpers.setField(mFragment, "mForegroundUsage", preference);
ReflectionHelpers.setField(mFragment, "mTotalUsage", preference); ReflectionHelpers.setField(mFragment, "mTotalUsage", preference);
doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
mFragment.bindData(0 /* position */); mFragment.bindData(0 /* position */);
@@ -199,7 +204,7 @@ public class AppDataUsageTest {
public void bindData_hasAppUsageData_shouldShowCycleSpinnerAndUpdateUsageSummary() { public void bindData_hasAppUsageData_shouldShowCycleSpinnerAndUpdateUsageSummary() {
mFragment = spy(new AppDataUsage()); mFragment = spy(new AppDataUsage());
final Context context = RuntimeEnvironment.application; final Context context = RuntimeEnvironment.application;
doReturn(context).when(mFragment).getContext(); ReflectionHelpers.setField(mFragment, "mContext", context);
final long backgroundBytes = 1234L; final long backgroundBytes = 1234L;
final long foregroundBytes = 5678L; final long foregroundBytes = 5678L;
final List<NetworkCycleDataForUid> appUsage = new ArrayList<>(); final List<NetworkCycleDataForUid> appUsage = new ArrayList<>();
@@ -223,4 +228,53 @@ public class AppDataUsageTest {
verify(backgroundPref).setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes)); verify(backgroundPref).setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes));
verify(foregroundPref).setSummary(DataUsageUtils.formatDataUsage(context, foregroundBytes)); 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<Integer> 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<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);
}
} }