Adding per-app support for app add/remove
Adding support for per-app network functionality to react to application installs, removals and updates. Also, opportunistic cleanup of a couple annotations. Bug: 177092163 Bug: 176494815 Test: atest FrameworksNetTests atest NetworkStackTests atest FrameworksNetIntegrationTests atest NetworkStackIntegrationTests atest CtsNetTestCasesLatestSdk Change-Id: I45acbd0d2ef50d575f14a944ce82b185ed69f219
This commit is contained in:
parent
a7d7793a88
commit
02220e23c0
1 changed files with 161 additions and 21 deletions
|
|
@ -1281,14 +1281,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
|
||||
mPermissionMonitor = new PermissionMonitor(mContext, mNetd);
|
||||
|
||||
mUserAllContext = mContext.createContextAsUser(UserHandle.ALL, 0 /* flags */);
|
||||
// Listen for user add/removes to inform PermissionMonitor.
|
||||
// Should run on mHandler to avoid any races.
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(Intent.ACTION_USER_ADDED);
|
||||
intentFilter.addAction(Intent.ACTION_USER_REMOVED);
|
||||
final IntentFilter userIntentFilter = new IntentFilter();
|
||||
userIntentFilter.addAction(Intent.ACTION_USER_ADDED);
|
||||
userIntentFilter.addAction(Intent.ACTION_USER_REMOVED);
|
||||
mUserAllContext.registerReceiver(mUserIntentReceiver, userIntentFilter,
|
||||
null /* broadcastPermission */, mHandler);
|
||||
|
||||
mUserAllContext = mContext.createContextAsUser(UserHandle.ALL, 0 /* flags */);
|
||||
mUserAllContext.registerReceiver(mIntentReceiver, intentFilter,
|
||||
// Listen to package add/removes for netd
|
||||
final IntentFilter packageIntentFilter = new IntentFilter();
|
||||
packageIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
|
||||
packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
|
||||
packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
|
||||
packageIntentFilter.addDataScheme("package");
|
||||
mUserAllContext.registerReceiver(mPackageIntentReceiver, packageIntentFilter,
|
||||
null /* broadcastPermission */, mHandler);
|
||||
|
||||
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNetd);
|
||||
|
|
@ -5303,14 +5311,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
}
|
||||
}
|
||||
|
||||
private void onUserAdded(UserHandle user) {
|
||||
private void onUserAdded(@NonNull final UserHandle user) {
|
||||
mPermissionMonitor.onUserAdded(user);
|
||||
if (mOemNetworkPreferences.getNetworkPreferences().size() > 0) {
|
||||
handleSetOemNetworkPreference(mOemNetworkPreferences, null);
|
||||
}
|
||||
}
|
||||
|
||||
private void onUserRemoved(UserHandle user) {
|
||||
private void onUserRemoved(@NonNull final UserHandle user) {
|
||||
mPermissionMonitor.onUserRemoved(user);
|
||||
// If there was a network preference for this user, remove it.
|
||||
handleSetProfileNetworkPreference(new ProfileNetworkPreferences.Preference(user, null),
|
||||
|
|
@ -5320,7 +5328,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
}
|
||||
}
|
||||
|
||||
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
|
||||
private void onPackageChanged(@NonNull final String packageName) {
|
||||
// This is necessary in case a package is added or removed, but also when it's replaced to
|
||||
// run as a new UID by its manifest rules. Also, if a separate package shares the same UID
|
||||
// as one in the preferences, then it should follow the same routing as that other package,
|
||||
// which means updating the rules is never to be needed in this case (whether it joins or
|
||||
// leaves a UID with a preference).
|
||||
if (isMappedInOemNetworkPreference(packageName)) {
|
||||
handleSetOemNetworkPreference(mOemNetworkPreferences, null);
|
||||
}
|
||||
}
|
||||
|
||||
private final BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
ensureRunningOnConnectivityServiceThread();
|
||||
|
|
@ -5343,6 +5362,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
}
|
||||
};
|
||||
|
||||
private final BroadcastReceiver mPackageIntentReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
ensureRunningOnConnectivityServiceThread();
|
||||
switch (intent.getAction()) {
|
||||
case Intent.ACTION_PACKAGE_ADDED:
|
||||
case Intent.ACTION_PACKAGE_REMOVED:
|
||||
case Intent.ACTION_PACKAGE_REPLACED:
|
||||
onPackageChanged(intent.getData().getSchemeSpecificPart());
|
||||
break;
|
||||
default:
|
||||
Log.wtf(TAG, "received unexpected intent: " + intent.getAction());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private final HashMap<Messenger, NetworkProviderInfo> mNetworkProviderInfos = new HashMap<>();
|
||||
private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests = new HashMap<>();
|
||||
|
||||
|
|
@ -6166,6 +6201,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
@NonNull
|
||||
private ProfileNetworkPreferences mProfileNetworkPreferences = new ProfileNetworkPreferences();
|
||||
|
||||
/**
|
||||
* Determine whether a given package has a mapping in the current OemNetworkPreferences.
|
||||
* @param packageName the package name to check existence of a mapping for.
|
||||
* @return true if a mapping exists, false otherwise
|
||||
*/
|
||||
private boolean isMappedInOemNetworkPreference(@NonNull final String packageName) {
|
||||
return mOemNetworkPreferences.getNetworkPreferences().containsKey(packageName);
|
||||
}
|
||||
|
||||
// The always-on request for an Internet-capable network that apps without a specific default
|
||||
// fall back to.
|
||||
@VisibleForTesting
|
||||
|
|
@ -6186,7 +6230,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
* @return the NetworkRequestInfo tracking the given uid.
|
||||
*/
|
||||
@NonNull
|
||||
private NetworkRequestInfo getDefaultRequestTrackingUid(@NonNull final int uid) {
|
||||
private NetworkRequestInfo getDefaultRequestTrackingUid(final int uid) {
|
||||
for (final NetworkRequestInfo nri : mDefaultNetworkRequests) {
|
||||
if (nri == mDefaultRequest) {
|
||||
continue;
|
||||
|
|
@ -9593,7 +9637,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
new OemNetworkRequestFactory().createNrisFromOemNetworkPreferences(preference);
|
||||
replaceDefaultNetworkRequestsForPreference(nris);
|
||||
mOemNetworkPreferences = preference;
|
||||
// TODO http://b/176496396 persist data to shared preferences.
|
||||
|
||||
if (null != listener) {
|
||||
try {
|
||||
|
|
@ -9750,7 +9793,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
// packages are sent on a network preference as the system will watch for
|
||||
// package installations associated with this network preference and update
|
||||
// accordingly. This is done so as to minimize race conditions on app install.
|
||||
// TODO b/177092163 add app install watching.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue