Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 593ddf9c authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Automerger Merge Worker
Browse files

Merge "Update network rules for only uids that are installed." into tm-dev am: 26e122a5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17301717

Change-Id: Ia9e21cafe09b8eb524f7ef468bcb02d1ad46c84a
parents 1e0bbdd5 26e122a5
Loading
Loading
Loading
Loading
+21 −18
Original line number Diff line number Diff line
@@ -162,6 +162,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
@@ -4539,9 +4540,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        }
        try {
            // update rules for all installed applications
            final PackageManager pm = mContext.getPackageManager();
            final List<UserInfo> users;
            final List<ApplicationInfo> apps;

            Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-users");
            try {
@@ -4549,25 +4548,29 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
            }
            Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-uids");
            Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "iterate-uids");
            try {
                apps = pm.getInstalledApplications(
                        PackageManager.MATCH_ANY_USER | PackageManager.MATCH_DISABLED_COMPONENTS
                                | PackageManager.MATCH_DIRECT_BOOT_AWARE
                                | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
            }

                final PackageManagerInternal packageManagerInternal = LocalServices.getService(
                        PackageManagerInternal.class);
                final int usersSize = users.size();
            final int appsSize = apps.size();
            for (int i = 0; i < usersSize; i++) {
                final UserInfo user = users.get(i);
                for (int j = 0; j < appsSize; j++) {
                    final ApplicationInfo app = apps.get(j);
                    final int uid = UserHandle.getUid(user.id, app.uid);
                for (int i = 0; i < usersSize; ++i) {
                    final int userId = users.get(i).id;
                    final SparseBooleanArray sharedAppIdsHandled = new SparseBooleanArray();
                    packageManagerInternal.forEachInstalledPackage(androidPackage -> {
                        final int appId = androidPackage.getUid();
                        if (androidPackage.getSharedUserId() != null) {
                            if (sharedAppIdsHandled.indexOfKey(appId) < 0) {
                                sharedAppIdsHandled.put(appId, true);
                            } else {
                                return;
                            }
                        }
                        final int uid = UserHandle.getUid(userId, appId);
                        consumer.accept(uid);
                    }, userId);
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
+26 −7
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
@@ -166,6 +167,7 @@ import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent;
import com.android.internal.util.test.FsUtil;
import com.android.server.DeviceIdleInternal;
import com.android.server.LocalServices;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.usage.AppStandbyInternal;

import com.google.common.util.concurrent.AbstractFuture;
@@ -216,6 +218,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
import java.util.stream.Collectors;

/**
@@ -274,6 +277,7 @@ public class NetworkPolicyManagerServiceTest {
            ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);

    private ActivityManagerInternal mActivityManagerInternal;
    private PackageManagerInternal mPackageManagerInternal;

    private IUidObserver mUidObserver;
    private INetworkManagementEventObserver mNetworkObserver;
@@ -335,6 +339,7 @@ public class NetworkPolicyManagerServiceTest {
        when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{});

        mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class);
        mPackageManagerInternal = addLocalServiceMock(PackageManagerInternal.class);

        final PowerSaveState state = new PowerSaveState.Builder()
                .setBatterySaverEnabled(false).build();
@@ -483,8 +488,15 @@ public class NetworkPolicyManagerServiceTest {
                .thenReturn(buildApplicationInfo(PKG_NAME_B, UID_B));
        when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt()))
                .thenReturn(buildApplicationInfo(PKG_NAME_C, UID_C));
        when(mPackageManager.getInstalledApplications(anyInt())).thenReturn(
                buildInstalledApplicationInfoList());
        doAnswer(arg -> {
            final Consumer<AndroidPackage> consumer =
                    (Consumer<AndroidPackage>) arg.getArguments()[0];
            for (AndroidPackage androidPackage : buildInstalledPackageList()) {
                consumer.accept(androidPackage);
            }
            return null;
        }).when(mPackageManagerInternal).forEachInstalledPackage(
                any(Consumer.class), anyInt());
        when(mUserManager.getUsers()).thenReturn(buildUserInfoList());
        when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true);
        when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true);
@@ -536,6 +548,7 @@ public class NetworkPolicyManagerServiceTest {
        LocalServices.removeServiceForTest(DeviceIdleInternal.class);
        LocalServices.removeServiceForTest(AppStandbyInternal.class);
        LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
        LocalServices.removeServiceForTest(PackageManagerInternal.class);
    }

    @After
@@ -2037,14 +2050,20 @@ public class NetworkPolicyManagerServiceTest {
        return ai;
    }

    private List<ApplicationInfo> buildInstalledApplicationInfoList() {
        final List<ApplicationInfo> installedApps = new ArrayList<>();
        installedApps.add(buildApplicationInfo(PKG_NAME_A, UID_A));
        installedApps.add(buildApplicationInfo(PKG_NAME_B, UID_B));
        installedApps.add(buildApplicationInfo(PKG_NAME_C, UID_C));
    private List<AndroidPackage> buildInstalledPackageList() {
        final List<AndroidPackage> installedApps = new ArrayList<>();
        installedApps.add(createPackageMock(UID_A));
        installedApps.add(createPackageMock(UID_B));
        installedApps.add(createPackageMock(UID_C));
        return installedApps;
    }

    private AndroidPackage createPackageMock(int uid) {
        final AndroidPackage androidPackage = mock(AndroidPackage.class);
        when(androidPackage.getUid()).thenReturn(uid);
        return androidPackage;
    }

    private List<UserInfo> buildUserInfoList() {
        final List<UserInfo> users = new ArrayList<>();
        users.add(new UserInfo(USER_ID, "user1", 0));