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

Commit 1906fd1b authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Automerger Merge Worker
Browse files

Update network rules for only uids that are installed. am: c3580425 am: b8ea68c2

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


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

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


import com.google.common.util.concurrent.AbstractFuture;
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.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Collectors;


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


    private ActivityManagerInternal mActivityManagerInternal;
    private ActivityManagerInternal mActivityManagerInternal;
    private PackageManagerInternal mPackageManagerInternal;


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


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


        final PowerSaveState state = new PowerSaveState.Builder()
        final PowerSaveState state = new PowerSaveState.Builder()
                .setBatterySaverEnabled(false).build();
                .setBatterySaverEnabled(false).build();
@@ -483,8 +488,15 @@ public class NetworkPolicyManagerServiceTest {
                .thenReturn(buildApplicationInfo(PKG_NAME_B, UID_B));
                .thenReturn(buildApplicationInfo(PKG_NAME_B, UID_B));
        when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt()))
        when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt()))
                .thenReturn(buildApplicationInfo(PKG_NAME_C, UID_C));
                .thenReturn(buildApplicationInfo(PKG_NAME_C, UID_C));
        when(mPackageManager.getInstalledApplications(anyInt())).thenReturn(
        doAnswer(arg -> {
                buildInstalledApplicationInfoList());
            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(mUserManager.getUsers()).thenReturn(buildUserInfoList());
        when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true);
        when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true);
        when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true);
        when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true);
@@ -536,6 +548,7 @@ public class NetworkPolicyManagerServiceTest {
        LocalServices.removeServiceForTest(DeviceIdleInternal.class);
        LocalServices.removeServiceForTest(DeviceIdleInternal.class);
        LocalServices.removeServiceForTest(AppStandbyInternal.class);
        LocalServices.removeServiceForTest(AppStandbyInternal.class);
        LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
        LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
        LocalServices.removeServiceForTest(PackageManagerInternal.class);
    }
    }


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


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


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

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