2929import static android .os .Process .SYSTEM_UID ;
3030
3131import android .annotation .NonNull ;
32+ import android .annotation .UserIdInt ;
3233import android .content .Context ;
3334import android .content .pm .ApplicationInfo ;
3435import android .content .pm .PackageInfo ;
5556import com .android .internal .util .IndentingPrintWriter ;
5657import com .android .server .LocalServices ;
5758import com .android .server .SystemConfig ;
59+ import com .android .server .pm .permission .PermissionManagerServiceInternal ;
5860
5961import java .util .ArrayList ;
6062import java .util .Collection ;
@@ -80,6 +82,7 @@ public class PermissionMonitor {
8082 private static final int VERSION_Q = Build .VERSION_CODES .Q ;
8183
8284 private final PackageManager mPackageManager ;
85+ private final PackageManagerInternal mPackageManagerInternal ;
8386 private final UserManager mUserManager ;
8487 private final INetd mNetd ;
8588
@@ -104,26 +107,6 @@ public class PermissionMonitor {
104107
105108 private class PackageListObserver implements PackageManagerInternal .PackageListObserver {
106109
107- private int getPermissionForUid (int uid ) {
108- int permission = 0 ;
109- // Check all the packages for this UID. The UID has the permission if any of the
110- // packages in it has the permission.
111- String [] packages = mPackageManager .getPackagesForUid (uid );
112- if (packages != null && packages .length > 0 ) {
113- for (String name : packages ) {
114- final PackageInfo app = getPackageInfo (name );
115- if (app != null && app .requestedPermissions != null ) {
116- permission |= getNetdPermissionMask (app .requestedPermissions ,
117- app .requestedPermissionsFlags );
118- }
119- }
120- } else {
121- // The last package of this uid is removed from device. Clean the package up.
122- permission = INetd .PERMISSION_UNINSTALLED ;
123- }
124- return permission ;
125- }
126-
127110 @ Override
128111 public void onPackageAdded (String packageName , int uid ) {
129112 sendPackagePermissionsForUid (uid , getPermissionForUid (uid ));
@@ -135,10 +118,46 @@ public void onPackageRemoved(String packageName, int uid) {
135118 }
136119 }
137120
121+ private int getPermissionForUid (int uid ) {
122+ int permission = 0 ;
123+ // Check all the packages for this UID. The UID has the permission if any of the
124+ // packages in it has the permission.
125+ String [] packages = mPackageManager .getPackagesForUid (uid );
126+ if (packages != null && packages .length > 0 ) {
127+ for (String name : packages ) {
128+ final PackageInfo app = getPackageInfo (name );
129+ if (app != null && app .requestedPermissions != null ) {
130+ permission |= getNetdPermissionMask (app .requestedPermissions ,
131+ app .requestedPermissionsFlags );
132+ }
133+ }
134+ } else {
135+ // The last package of this uid is removed from device. Clean the package up.
136+ permission = INetd .PERMISSION_UNINSTALLED ;
137+ }
138+ return permission ;
139+ }
140+
141+ // implements OnRuntimePermissionStateChangedListener
142+ private void enforceINTERNETAsRuntimePermission (@ NonNull String packageName ,
143+ @ UserIdInt int userId ) {
144+ // userId is _not_ uid
145+ int uid = mPackageManagerInternal .getPackageUid (packageName , 0 , userId );
146+ sendPackagePermissionsForUid (uid , getPermissionForUid (uid ));
147+ }
148+
138149 public PermissionMonitor (Context context , INetd netd ) {
139150 mPackageManager = context .getPackageManager ();
140151 mUserManager = (UserManager ) context .getSystemService (Context .USER_SERVICE );
141152 mNetd = netd ;
153+
154+ mPackageManagerInternal = LocalServices .getService (
155+ PackageManagerInternal .class );
156+
157+ final PermissionManagerServiceInternal permManagerInternal = LocalServices .getService (
158+ PermissionManagerServiceInternal .class );
159+ permManagerInternal .addOnRuntimePermissionStateChangedListener (
160+ this ::enforceINTERNETAsRuntimePermission );
142161 }
143162
144163 // Intended to be called only once at startup, after the system is ready. Installs a broadcast
0 commit comments