diff --git a/src/com/android/settings/applications/PackageManagerWrapper.java b/src/com/android/settings/applications/PackageManagerWrapper.java index 0cfbdc59101..580b578da73 100644 --- a/src/com/android/settings/applications/PackageManagerWrapper.java +++ b/src/com/android/settings/applications/PackageManagerWrapper.java @@ -111,4 +111,6 @@ public interface PackageManagerWrapper { */ void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags, int userId); + + int getPackageUidAsUser(String pkg, int userId) throws PackageManager.NameNotFoundException; } diff --git a/src/com/android/settings/applications/PackageManagerWrapperImpl.java b/src/com/android/settings/applications/PackageManagerWrapperImpl.java index 3a78e3c4463..a47137c069f 100644 --- a/src/com/android/settings/applications/PackageManagerWrapperImpl.java +++ b/src/com/android/settings/applications/PackageManagerWrapperImpl.java @@ -103,4 +103,10 @@ public class PackageManagerWrapperImpl implements PackageManagerWrapper { int userId) { mPm.deletePackageAsUser(packageName, observer, flags, userId); } + + @Override + public int getPackageUidAsUser(String pkg, int userId) + throws PackageManager.NameNotFoundException { + return mPm.getPackageUidAsUser(pkg, userId); + } } diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index af6306d3ab8..d9643f25489 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -36,12 +36,15 @@ import android.support.v7.preference.PreferenceCategory; import android.text.format.Formatter; import android.util.ArraySet; import android.util.IconDrawableFactory; +import android.util.Log; import android.view.View; import android.widget.AdapterView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.applications.AppInfoBase; +import com.android.settings.applications.PackageManagerWrapper; +import com.android.settings.applications.PackageManagerWrapperImpl; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.AppItem; import com.android.settingslib.net.ChartData; @@ -71,6 +74,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen private static final int LOADER_CHART_DATA = 2; private static final int LOADER_APP_PREF = 3; + private PackageManagerWrapper mPackageManagerWrapper; private final ArraySet mPackages = new ArraySet<>(); private Preference mTotalUsage; private Preference mForegroundUsage; @@ -99,6 +103,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + mPackageManagerWrapper = new PackageManagerWrapperImpl(getPackageManager()); final Bundle args = getArguments(); try { @@ -142,11 +147,11 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen if (mAppItem.key > 0) { if (mPackages.size() != 0) { - PackageManager pm = getPackageManager(); try { - ApplicationInfo info = pm.getApplicationInfo(mPackages.valueAt(0), 0); + ApplicationInfo info = mPackageManagerWrapper.getApplicationInfoAsUser( + mPackages.valueAt(0), 0, UserHandle.getUserId(mAppItem.key)); mIcon = IconDrawableFactory.newInstance(getActivity()).getBadgedIcon(info); - mLabel = info.loadLabel(pm); + mLabel = info.loadLabel(mPackageManagerWrapper.getPackageManager()); mPackageName = info.packageName; } catch (PackageManager.NameNotFoundException e) { } @@ -317,9 +322,13 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen String pkg = mPackages.size() != 0 ? mPackages.valueAt(0) : null; int uid = 0; - try { - uid = pkg != null ? getPackageManager().getPackageUid(pkg, 0) : 0; - } catch (PackageManager.NameNotFoundException e) { + if (pkg != null) { + try { + uid = mPackageManagerWrapper.getPackageUidAsUser(pkg, + UserHandle.getUserId(mAppItem.key)); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Skipping UID because cannot find package " + pkg); + } } final boolean showInfoButton = mAppItem.key > 0; @@ -328,6 +337,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen final Preference pref = EntityHeaderController .newInstance(activity, this, null /* header */) .setRecyclerView(getListView(), getLifecycle()) + .setUid(uid) .setButtonActions(showInfoButton ? EntityHeaderController.ActionType.ACTION_APP_INFO : EntityHeaderController.ActionType.ACTION_NONE, @@ -335,7 +345,6 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen .setIcon(mIcon) .setLabel(mLabel) .setPackageName(pkg) - .setUid(uid) .done(activity, getPrefContext()); getPreferenceScreen().addPreference(pref); } diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 8cbe9479569..a9b4d78f680 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -18,13 +18,16 @@ package com.android.settings.datausage; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; +import android.util.ArraySet; import android.view.View; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settings.widget.EntityHeaderController; @@ -43,6 +46,8 @@ import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -59,6 +64,8 @@ public class AppDataUsageTest { private Context mContext; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private EntityHeaderController mHeaderController; + @Mock + private PackageManagerWrapper mPackageManagerWrapper; private AppDataUsage mFragment; @@ -77,6 +84,7 @@ public class AppDataUsageTest { public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() { ShadowEntityHeaderController.setUseMock(mHeaderController); when(mHeaderController.setRecyclerView(any(), any())).thenReturn(mHeaderController); + when(mHeaderController.setUid(anyInt())).thenReturn(mHeaderController); mFragment = spy(new AppDataUsage()); @@ -90,4 +98,38 @@ public class AppDataUsageTest { verify(mHeaderController).setButtonActions(ActionType.ACTION_NONE, ActionType.ACTION_NONE); } + + @Test + public void bindAppHeader_workApp_shouldSetWorkAppUid() throws + PackageManager.NameNotFoundException { + final int fakeUserId = 100; + + mFragment = spy(new AppDataUsage()); + final ArraySet packages = new ArraySet<>(); + packages.add("pkg"); + final AppItem appItem = new AppItem(123456789); + + ReflectionHelpers.setField(mFragment, "mPackageManagerWrapper", mPackageManagerWrapper); + ReflectionHelpers.setField(mFragment, "mAppItem", appItem); + ReflectionHelpers.setField(mFragment, "mPackages", packages); + + when(mPackageManagerWrapper.getPackageUidAsUser(anyString(), anyInt())) + .thenReturn(fakeUserId); + + ShadowEntityHeaderController.setUseMock(mHeaderController); + when(mHeaderController.setRecyclerView(any(), any())).thenReturn(mHeaderController); + when(mHeaderController.setUid(fakeUserId)).thenReturn(mHeaderController); + + doReturn(mock(PreferenceManager.class, RETURNS_DEEP_STUBS)) + .when(mFragment) + .getPreferenceManager(); + doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); + + mFragment.onViewCreated(new View(RuntimeEnvironment.application), new Bundle()); + + verify(mHeaderController) + .setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE); + verify(mHeaderController) + .setUid(fakeUserId); + } }