diff --git a/res/drawable/ic_system_update.xml b/res/drawable/ic_system_update.xml deleted file mode 100644 index 3325fdd5c01..00000000000 --- a/res/drawable/ic_system_update.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/res/drawable/ic_system_update_vd_theme_24.xml b/res/drawable/ic_system_update_vd_theme_24.xml deleted file mode 100644 index d1fc0616bf0..00000000000 --- a/res/drawable/ic_system_update_vd_theme_24.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml index 3f2e55f2822..c4bd11d0193 100644 --- a/res/xml/storage_dashboard_fragment.xml +++ b/res/xml/storage_dashboard_fragment.xml @@ -66,7 +66,7 @@ mUsageData; @@ -133,29 +135,32 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mForegroundUsage = findPreference(KEY_FOREGROUND_USAGE); mBackgroundUsage = findPreference(KEY_BACKGROUND_USAGE); - mCycle = (SpinnerPreference) findPreference(KEY_CYCLE); + mCycle = findPreference(KEY_CYCLE); mCycleAdapter = new CycleAdapter(mContext, mCycle, mCycleListener); + final UidDetailProvider uidDetailProvider = getUidDetailProvider(); + if (mAppItem.key > 0) { - if (mPackages.size() != 0) { - try { - ApplicationInfo info = mPackageManager.getApplicationInfoAsUser( - mPackages.valueAt(0), 0, UserHandle.getUserId(mAppItem.key)); - mIcon = IconDrawableFactory.newInstance(getActivity()).getBadgedIcon(info); - mLabel = info.loadLabel(mPackageManager); - mPackageName = info.packageName; - } catch (PackageManager.NameNotFoundException e) { - } - } if (!UserHandle.isApp(mAppItem.key)) { + final UidDetail uidDetail = uidDetailProvider.getUidDetail(mAppItem.key, true); + mIcon = uidDetail.icon; + mLabel = uidDetail.label; removePreference(KEY_UNRESTRICTED_DATA); removePreference(KEY_RESTRICT_BACKGROUND); } else { - mRestrictBackground = (RestrictedSwitchPreference) findPreference( - KEY_RESTRICT_BACKGROUND); + if (mPackages.size() != 0) { + try { + final ApplicationInfo info = mPackageManager.getApplicationInfoAsUser( + mPackages.valueAt(0), 0, UserHandle.getUserId(mAppItem.key)); + mIcon = IconDrawableFactory.newInstance(getActivity()).getBadgedIcon(info); + mLabel = info.loadLabel(mPackageManager); + mPackageName = info.packageName; + } catch (PackageManager.NameNotFoundException e) { + } + } + mRestrictBackground = findPreference(KEY_RESTRICT_BACKGROUND); mRestrictBackground.setOnPreferenceChangeListener(this); - mUnrestrictedData = (RestrictedSwitchPreference) findPreference( - KEY_UNRESTRICTED_DATA); + mUnrestrictedData = findPreference(KEY_UNRESTRICTED_DATA); mUnrestrictedData.setOnPreferenceChangeListener(this); } mDataSaverBackend = new DataSaverBackend(mContext); @@ -164,7 +169,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mAppSettingsIntent = new Intent(Intent.ACTION_MANAGE_NETWORK_USAGE); mAppSettingsIntent.addCategory(Intent.CATEGORY_DEFAULT); - PackageManager pm = getPackageManager(); + final PackageManager pm = getPackageManager(); boolean matchFound = false; for (String packageName : mPackages) { mAppSettingsIntent.setPackage(packageName); @@ -179,7 +184,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC } if (mPackages.size() > 1) { - mAppList = (PreferenceCategory) findPreference(KEY_APP_LIST); + mAppList = findPreference(KEY_APP_LIST); LoaderManager.getInstance(this).restartLoader(LOADER_APP_PREF, Bundle.EMPTY, mAppPrefCallbacks); } else { @@ -187,7 +192,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC } } else { final Context context = getActivity(); - UidDetail uidDetail = new UidDetailProvider(context).getUidDetail(mAppItem.key, true); + final UidDetail uidDetail = uidDetailProvider.getUidDetail(mAppItem.key, true); mIcon = uidDetail.icon; mLabel = uidDetail.label; mPackageName = context.getPackageName(); @@ -257,6 +262,11 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC updatePrefs(getAppRestrictBackground(), getUnrestrictData()); } + @VisibleForTesting + UidDetailProvider getUidDetailProvider() { + return new UidDetailProvider(mContext); + } + private void updatePrefs(boolean restrictBackground, boolean unrestrictData) { final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted( mContext, mPackageName, UserHandle.getUserId(mAppItem.key)); @@ -276,7 +286,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC } private void addUid(int uid) { - String[] packages = getPackageManager().getPackagesForUid(uid); + String[] packages = mPackageManager.getPackagesForUid(uid); if (packages != null) { for (int i = 0; i < packages.length; i++) { mPackages.add(packages[i]); diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java index 735532a5e2c..8eeb925f5e1 100644 --- a/src/com/android/settings/datausage/DataUsageList.java +++ b/src/com/android/settings/datausage/DataUsageList.java @@ -33,6 +33,7 @@ import android.net.ConnectivityManager; import android.net.NetworkPolicy; import android.net.NetworkTemplate; import android.os.Bundle; +import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -362,7 +363,8 @@ public class DataUsageList extends DataUsageBaseFragment { category = AppItem.CATEGORY_USER; } } - } else if (uid == UID_REMOVED || uid == UID_TETHERING) { + } else if (uid == UID_REMOVED || uid == UID_TETHERING + || uid == Process.OTA_UPDATE_UID) { collapseKey = uid; category = AppItem.CATEGORY_APP; } else { diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 28555546d87..4561ab67589 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -31,10 +32,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.net.NetworkPolicyManager; 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; @@ -56,6 +60,8 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.net.NetworkCycleDataForUid; import com.android.settingslib.net.NetworkCycleDataForUidLoader; +import com.android.settingslib.net.UidDetail; +import com.android.settingslib.net.UidDetailProvider; import org.junit.After; import org.junit.Before; @@ -95,6 +101,62 @@ public class AppDataUsageTest { ShadowEntityHeaderController.reset(); } + @Test + public void onCreate_appUid_shouldGetAppLabelFromAppInfo() throws NameNotFoundException { + mFragment = spy(new AppDataUsage()); + final FragmentActivity activity = spy(Robolectric.setupActivity(FragmentActivity.class)); + doReturn(mPackageManager).when(activity).getPackageManager(); + doReturn(activity).when(mFragment).getActivity(); + doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); + ReflectionHelpers.setField(mFragment, "mDashboardFeatureProvider", + FakeFeatureFactory.setupForTest().dashboardFeatureProvider); + final String packageName = "testPackage"; + final int uid = (Process.FIRST_APPLICATION_UID + Process.LAST_APPLICATION_UID) / 2; + doReturn(new String[] {packageName}).when(mPackageManager).getPackagesForUid(uid); + final String label = "testLabel"; + final AppItem appItem = new AppItem(uid); + appItem.uids.put(uid, true); + final ApplicationInfo info = spy(new ApplicationInfo()); + doReturn(label).when(info).loadLabel(mPackageManager); + when(mPackageManager.getApplicationInfoAsUser( + eq(packageName), anyInt() /* flags */, anyInt() /* userId */)).thenReturn(info); + final Bundle args = new Bundle(); + args.putParcelable(AppDataUsage.ARG_APP_ITEM, appItem); + args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid); + mFragment.setArguments(args); + + mFragment.onCreate(Bundle.EMPTY); + + assertThat(mFragment.mLabel).isEqualTo(label); + } + + @Test + public void onCreate_notAppUid_shouldGetAppLabelFromUidDetailProvider() { + mFragment = spy(new AppDataUsage()); + ReflectionHelpers.setField(mFragment, "mDashboardFeatureProvider", + FakeFeatureFactory.setupForTest().dashboardFeatureProvider); + doReturn(Robolectric.setupActivity(FragmentActivity.class)).when(mFragment).getActivity(); + doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); + final UidDetailProvider uidDetailProvider = mock(UidDetailProvider.class); + doReturn(uidDetailProvider).when(mFragment).getUidDetailProvider(); + final String label = "testLabel"; + final int uid = Process.SYSTEM_UID; + final UidDetail uidDetail = new UidDetail(); + uidDetail.label = label; + when(uidDetailProvider.getUidDetail(eq(uid), anyBoolean() /* blocking */)). + thenReturn(uidDetail); + final AppItem appItem = new AppItem(uid); + appItem.uids.put(uid, true); + final Bundle args = new Bundle(); + args.putParcelable(AppDataUsage.ARG_APP_ITEM, appItem); + args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid); + mFragment.setArguments(args); + + mFragment.onCreate(Bundle.EMPTY); + + assertThat(mFragment.mLabel).isEqualTo(label); + } + @Test public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() { ShadowEntityHeaderController.setUseMock(mHeaderController); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java index feb3533e49e..73fea77b0d3 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java @@ -341,7 +341,7 @@ public class StorageItemPreferenceControllerTest { final StorageItemPreference apps = spy(new StorageItemPreference(mContext)); apps.setIcon(R.drawable.ic_storage_apps); final StorageItemPreference system = spy(new StorageItemPreference(mContext)); - system.setIcon(R.drawable.ic_system_update_vd_theme_24); + system.setIcon(R.drawable.ic_system_update); final StorageItemPreference files = spy(new StorageItemPreference(mContext)); files.setIcon(R.drawable.ic_folder_vd_theme_24); final PreferenceScreen screen = mock(PreferenceScreen.class);