Loading apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +46 −25 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; import android.annotation.Nullable; import android.app.job.JobInfo; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; Loading Loading @@ -86,9 +87,12 @@ public final class ConnectivityController extends RestrictingController implemen @GuardedBy("mLock") private final SparseArray<ArraySet<JobStatus>> mRequestedWhitelistJobs = new SparseArray<>(); /** List of currently available networks. */ /** * Set of currently available networks mapped to their latest network capabilities. Cache the * latest capabilities to avoid unnecessary calls into ConnectivityManager. */ @GuardedBy("mLock") private final ArraySet<Network> mAvailableNetworks = new ArraySet<>(); private final ArrayMap<Network, NetworkCapabilities> mAvailableNetworks = new ArrayMap<>(); private static final int MSG_DATA_SAVER_TOGGLED = 0; private static final int MSG_UID_RULES_CHANGES = 1; Loading Loading @@ -165,9 +169,8 @@ public final class ConnectivityController extends RestrictingController implemen public boolean isNetworkAvailable(JobStatus job) { synchronized (mLock) { for (int i = 0; i < mAvailableNetworks.size(); ++i) { final Network network = mAvailableNetworks.valueAt(i); final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities( network); final Network network = mAvailableNetworks.keyAt(i); final NetworkCapabilities capabilities = mAvailableNetworks.valueAt(i); final boolean satisfied = isSatisfied(job, network, capabilities, mConstants); if (DEBUG) { Slog.v(TAG, "isNetworkAvailable(" + job + ") with network " + network Loading Loading @@ -427,9 +430,33 @@ public final class ConnectivityController extends RestrictingController implemen return false; } @Nullable private NetworkCapabilities getNetworkCapabilities(@Nullable Network network) { if (network == null) { return null; } synchronized (mLock) { // There is technically a race here if the Network object is reused. This can happen // only if that Network disconnects and the auto-incrementing network ID in // ConnectivityService wraps. This should no longer be a concern if/when we only make // use of asynchronous calls. if (mAvailableNetworks.get(network) != null) { return mAvailableNetworks.get(network); } // This should almost never happen because any time a new network connects, the // NetworkCallback would populate mAvailableNetworks. However, it's currently necessary // because we also call synchronous methods such as getActiveNetworkForUid. // TODO(134978280): remove after switching to callback-based APIs final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network); mAvailableNetworks.put(network, capabilities); return capabilities; } } private boolean updateConstraintsSatisfied(JobStatus jobStatus) { final Network network = mConnManager.getActiveNetworkForUid(jobStatus.getSourceUid()); final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network); final NetworkCapabilities capabilities = getNetworkCapabilities(network); return updateConstraintsSatisfied(jobStatus, network, capabilities); } Loading Loading @@ -470,19 +497,13 @@ public final class ConnectivityController extends RestrictingController implemen */ private void updateTrackedJobs(int filterUid, Network filterNetwork) { synchronized (mLock) { // Since this is a really hot codepath, temporarily cache any // answers that we get from ConnectivityManager. final ArrayMap<Network, NetworkCapabilities> networkToCapabilities = new ArrayMap<>(); boolean changed = false; if (filterUid == -1) { for (int i = mTrackedJobs.size() - 1; i >= 0; i--) { changed |= updateTrackedJobsLocked(mTrackedJobs.valueAt(i), filterNetwork, networkToCapabilities); changed |= updateTrackedJobsLocked(mTrackedJobs.valueAt(i), filterNetwork); } } else { changed = updateTrackedJobsLocked(mTrackedJobs.get(filterUid), filterNetwork, networkToCapabilities); changed = updateTrackedJobsLocked(mTrackedJobs.get(filterUid), filterNetwork); } if (changed) { mStateChangedListener.onControllerStateChanged(); Loading @@ -490,18 +511,13 @@ public final class ConnectivityController extends RestrictingController implemen } } private boolean updateTrackedJobsLocked(ArraySet<JobStatus> jobs, Network filterNetwork, ArrayMap<Network, NetworkCapabilities> networkToCapabilities) { private boolean updateTrackedJobsLocked(ArraySet<JobStatus> jobs, Network filterNetwork) { if (jobs == null || jobs.size() == 0) { return false; } final Network network = mConnManager.getActiveNetworkForUid(jobs.valueAt(0).getSourceUid()); NetworkCapabilities capabilities = networkToCapabilities.get(network); if (capabilities == null) { capabilities = mConnManager.getNetworkCapabilities(network); networkToCapabilities.put(network, capabilities); } final NetworkCapabilities capabilities = getNetworkCapabilities(network); final boolean networkMatch = (filterNetwork == null || Objects.equals(filterNetwork, network)); Loading Loading @@ -544,9 +560,9 @@ public final class ConnectivityController extends RestrictingController implemen @Override public void onAvailable(Network network) { if (DEBUG) Slog.v(TAG, "onAvailable: " + network); synchronized (mLock) { mAvailableNetworks.add(network); } // Documentation says not to call getNetworkCapabilities here but wait for // onCapabilitiesChanged instead. onCapabilitiesChanged should be called immediately // after this, so no need to update mAvailableNetworks here. } @Override Loading @@ -554,6 +570,9 @@ public final class ConnectivityController extends RestrictingController implemen if (DEBUG) { Slog.v(TAG, "onCapabilitiesChanged: " + network); } synchronized (mLock) { mAvailableNetworks.put(network, capabilities); } updateTrackedJobs(-1, network); } Loading Loading @@ -630,6 +649,8 @@ public final class ConnectivityController extends RestrictingController implemen pw.println("Available networks:"); pw.increaseIndent(); for (int i = 0; i < mAvailableNetworks.size(); i++) { pw.print(mAvailableNetworks.keyAt(i)); pw.print(": "); pw.println(mAvailableNetworks.valueAt(i)); } pw.decreaseIndent(); Loading Loading @@ -667,7 +688,7 @@ public final class ConnectivityController extends RestrictingController implemen mRequestedWhitelistJobs.keyAt(i)); } for (int i = 0; i < mAvailableNetworks.size(); i++) { Network network = mAvailableNetworks.valueAt(i); Network network = mAvailableNetworks.keyAt(i); if (network != null) { network.dumpDebug(proto, StateControllerProto.ConnectivityController.AVAILABLE_NETWORKS); Loading core/java/android/accounts/GrantCredentialsPermissionActivity.java +28 −6 Original line number Diff line number Diff line Loading @@ -16,16 +16,23 @@ package android.accounts; import android.app.Activity; import android.content.res.Resources; import android.os.Bundle; import android.widget.TextView; import android.widget.LinearLayout; import android.view.View; import android.view.LayoutInflater; import android.app.ActivityTaskManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Bundle; import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.R; import java.io.IOException; Loading @@ -42,6 +49,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View private Account mAccount; private String mAuthTokenType; private int mUid; private int mCallingUid; private Bundle mResultBundle = null; protected LayoutInflater mInflater; Loading Loading @@ -77,6 +85,20 @@ public class GrantCredentialsPermissionActivity extends Activity implements View return; } try { IBinder activityToken = getActivityToken(); mCallingUid = ActivityTaskManager.getService().getLaunchedFromUid(activityToken); } catch (RemoteException re) { // Couldn't figure out caller details Log.w(getClass().getSimpleName(), "Unable to get caller identity \n" + re); } if (!UserHandle.isSameApp(mCallingUid, Process.SYSTEM_UID) && mCallingUid != mUid) { setResult(Activity.RESULT_CANCELED); finish(); return; } String accountTypeLabel; try { accountTypeLabel = getAccountLabel(mAccount); Loading core/java/android/content/pm/PackageManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -1688,6 +1688,15 @@ public abstract class PackageManager { * {@hide} */ public static final int DELETE_FAILED_USED_SHARED_LIBRARY = -6; /** * Deletion failed return code: this is passed to the * {@link IPackageDeleteObserver} if the system failed to delete the package * because there is an app pinned. * * @hide */ public static final int DELETE_FAILED_APP_PINNED = -7; /** * Return code that is passed to the {@link IPackageMoveObserver} when the * package has been successfully moved by the system. Loading Loading @@ -7545,6 +7554,7 @@ public abstract class PackageManager { case DELETE_FAILED_OWNER_BLOCKED: return "DELETE_FAILED_OWNER_BLOCKED"; case DELETE_FAILED_ABORTED: return "DELETE_FAILED_ABORTED"; case DELETE_FAILED_USED_SHARED_LIBRARY: return "DELETE_FAILED_USED_SHARED_LIBRARY"; case DELETE_FAILED_APP_PINNED: return "DELETE_FAILED_APP_PINNED"; default: return Integer.toString(status); } } Loading @@ -7559,6 +7569,7 @@ public abstract class PackageManager { case DELETE_FAILED_OWNER_BLOCKED: return PackageInstaller.STATUS_FAILURE_BLOCKED; case DELETE_FAILED_ABORTED: return PackageInstaller.STATUS_FAILURE_ABORTED; case DELETE_FAILED_USED_SHARED_LIBRARY: return PackageInstaller.STATUS_FAILURE_CONFLICT; case DELETE_FAILED_APP_PINNED: return PackageInstaller.STATUS_FAILURE_BLOCKED; default: return PackageInstaller.STATUS_FAILURE; } } Loading packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +4 −0 Original line number Diff line number Diff line Loading @@ -339,6 +339,10 @@ public class InstallInstalling extends AlertActivity { try { session = getPackageManager().getPackageInstaller().openSession(mSessionId); } catch (IOException e) { synchronized (this) { isDone = true; notifyAll(); } return null; } Loading services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +0 −3 Original line number Diff line number Diff line Loading @@ -3275,9 +3275,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub boolean hideCurrentInputLocked(IBinder windowToken, int flags, ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) { if (mCurClient == null || mCurClient.curSession == null) { return false; } if ((flags&InputMethodManager.HIDE_IMPLICIT_ONLY) != 0 && (mShowExplicitlyRequested || mShowForced)) { if (DEBUG) Slog.v(TAG, "Not hiding: explicit show not cancelled by non-explicit hide"); Loading Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +46 −25 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; import android.annotation.Nullable; import android.app.job.JobInfo; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; Loading Loading @@ -86,9 +87,12 @@ public final class ConnectivityController extends RestrictingController implemen @GuardedBy("mLock") private final SparseArray<ArraySet<JobStatus>> mRequestedWhitelistJobs = new SparseArray<>(); /** List of currently available networks. */ /** * Set of currently available networks mapped to their latest network capabilities. Cache the * latest capabilities to avoid unnecessary calls into ConnectivityManager. */ @GuardedBy("mLock") private final ArraySet<Network> mAvailableNetworks = new ArraySet<>(); private final ArrayMap<Network, NetworkCapabilities> mAvailableNetworks = new ArrayMap<>(); private static final int MSG_DATA_SAVER_TOGGLED = 0; private static final int MSG_UID_RULES_CHANGES = 1; Loading Loading @@ -165,9 +169,8 @@ public final class ConnectivityController extends RestrictingController implemen public boolean isNetworkAvailable(JobStatus job) { synchronized (mLock) { for (int i = 0; i < mAvailableNetworks.size(); ++i) { final Network network = mAvailableNetworks.valueAt(i); final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities( network); final Network network = mAvailableNetworks.keyAt(i); final NetworkCapabilities capabilities = mAvailableNetworks.valueAt(i); final boolean satisfied = isSatisfied(job, network, capabilities, mConstants); if (DEBUG) { Slog.v(TAG, "isNetworkAvailable(" + job + ") with network " + network Loading Loading @@ -427,9 +430,33 @@ public final class ConnectivityController extends RestrictingController implemen return false; } @Nullable private NetworkCapabilities getNetworkCapabilities(@Nullable Network network) { if (network == null) { return null; } synchronized (mLock) { // There is technically a race here if the Network object is reused. This can happen // only if that Network disconnects and the auto-incrementing network ID in // ConnectivityService wraps. This should no longer be a concern if/when we only make // use of asynchronous calls. if (mAvailableNetworks.get(network) != null) { return mAvailableNetworks.get(network); } // This should almost never happen because any time a new network connects, the // NetworkCallback would populate mAvailableNetworks. However, it's currently necessary // because we also call synchronous methods such as getActiveNetworkForUid. // TODO(134978280): remove after switching to callback-based APIs final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network); mAvailableNetworks.put(network, capabilities); return capabilities; } } private boolean updateConstraintsSatisfied(JobStatus jobStatus) { final Network network = mConnManager.getActiveNetworkForUid(jobStatus.getSourceUid()); final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network); final NetworkCapabilities capabilities = getNetworkCapabilities(network); return updateConstraintsSatisfied(jobStatus, network, capabilities); } Loading Loading @@ -470,19 +497,13 @@ public final class ConnectivityController extends RestrictingController implemen */ private void updateTrackedJobs(int filterUid, Network filterNetwork) { synchronized (mLock) { // Since this is a really hot codepath, temporarily cache any // answers that we get from ConnectivityManager. final ArrayMap<Network, NetworkCapabilities> networkToCapabilities = new ArrayMap<>(); boolean changed = false; if (filterUid == -1) { for (int i = mTrackedJobs.size() - 1; i >= 0; i--) { changed |= updateTrackedJobsLocked(mTrackedJobs.valueAt(i), filterNetwork, networkToCapabilities); changed |= updateTrackedJobsLocked(mTrackedJobs.valueAt(i), filterNetwork); } } else { changed = updateTrackedJobsLocked(mTrackedJobs.get(filterUid), filterNetwork, networkToCapabilities); changed = updateTrackedJobsLocked(mTrackedJobs.get(filterUid), filterNetwork); } if (changed) { mStateChangedListener.onControllerStateChanged(); Loading @@ -490,18 +511,13 @@ public final class ConnectivityController extends RestrictingController implemen } } private boolean updateTrackedJobsLocked(ArraySet<JobStatus> jobs, Network filterNetwork, ArrayMap<Network, NetworkCapabilities> networkToCapabilities) { private boolean updateTrackedJobsLocked(ArraySet<JobStatus> jobs, Network filterNetwork) { if (jobs == null || jobs.size() == 0) { return false; } final Network network = mConnManager.getActiveNetworkForUid(jobs.valueAt(0).getSourceUid()); NetworkCapabilities capabilities = networkToCapabilities.get(network); if (capabilities == null) { capabilities = mConnManager.getNetworkCapabilities(network); networkToCapabilities.put(network, capabilities); } final NetworkCapabilities capabilities = getNetworkCapabilities(network); final boolean networkMatch = (filterNetwork == null || Objects.equals(filterNetwork, network)); Loading Loading @@ -544,9 +560,9 @@ public final class ConnectivityController extends RestrictingController implemen @Override public void onAvailable(Network network) { if (DEBUG) Slog.v(TAG, "onAvailable: " + network); synchronized (mLock) { mAvailableNetworks.add(network); } // Documentation says not to call getNetworkCapabilities here but wait for // onCapabilitiesChanged instead. onCapabilitiesChanged should be called immediately // after this, so no need to update mAvailableNetworks here. } @Override Loading @@ -554,6 +570,9 @@ public final class ConnectivityController extends RestrictingController implemen if (DEBUG) { Slog.v(TAG, "onCapabilitiesChanged: " + network); } synchronized (mLock) { mAvailableNetworks.put(network, capabilities); } updateTrackedJobs(-1, network); } Loading Loading @@ -630,6 +649,8 @@ public final class ConnectivityController extends RestrictingController implemen pw.println("Available networks:"); pw.increaseIndent(); for (int i = 0; i < mAvailableNetworks.size(); i++) { pw.print(mAvailableNetworks.keyAt(i)); pw.print(": "); pw.println(mAvailableNetworks.valueAt(i)); } pw.decreaseIndent(); Loading Loading @@ -667,7 +688,7 @@ public final class ConnectivityController extends RestrictingController implemen mRequestedWhitelistJobs.keyAt(i)); } for (int i = 0; i < mAvailableNetworks.size(); i++) { Network network = mAvailableNetworks.valueAt(i); Network network = mAvailableNetworks.keyAt(i); if (network != null) { network.dumpDebug(proto, StateControllerProto.ConnectivityController.AVAILABLE_NETWORKS); Loading
core/java/android/accounts/GrantCredentialsPermissionActivity.java +28 −6 Original line number Diff line number Diff line Loading @@ -16,16 +16,23 @@ package android.accounts; import android.app.Activity; import android.content.res.Resources; import android.os.Bundle; import android.widget.TextView; import android.widget.LinearLayout; import android.view.View; import android.view.LayoutInflater; import android.app.ActivityTaskManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Bundle; import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.R; import java.io.IOException; Loading @@ -42,6 +49,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View private Account mAccount; private String mAuthTokenType; private int mUid; private int mCallingUid; private Bundle mResultBundle = null; protected LayoutInflater mInflater; Loading Loading @@ -77,6 +85,20 @@ public class GrantCredentialsPermissionActivity extends Activity implements View return; } try { IBinder activityToken = getActivityToken(); mCallingUid = ActivityTaskManager.getService().getLaunchedFromUid(activityToken); } catch (RemoteException re) { // Couldn't figure out caller details Log.w(getClass().getSimpleName(), "Unable to get caller identity \n" + re); } if (!UserHandle.isSameApp(mCallingUid, Process.SYSTEM_UID) && mCallingUid != mUid) { setResult(Activity.RESULT_CANCELED); finish(); return; } String accountTypeLabel; try { accountTypeLabel = getAccountLabel(mAccount); Loading
core/java/android/content/pm/PackageManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -1688,6 +1688,15 @@ public abstract class PackageManager { * {@hide} */ public static final int DELETE_FAILED_USED_SHARED_LIBRARY = -6; /** * Deletion failed return code: this is passed to the * {@link IPackageDeleteObserver} if the system failed to delete the package * because there is an app pinned. * * @hide */ public static final int DELETE_FAILED_APP_PINNED = -7; /** * Return code that is passed to the {@link IPackageMoveObserver} when the * package has been successfully moved by the system. Loading Loading @@ -7545,6 +7554,7 @@ public abstract class PackageManager { case DELETE_FAILED_OWNER_BLOCKED: return "DELETE_FAILED_OWNER_BLOCKED"; case DELETE_FAILED_ABORTED: return "DELETE_FAILED_ABORTED"; case DELETE_FAILED_USED_SHARED_LIBRARY: return "DELETE_FAILED_USED_SHARED_LIBRARY"; case DELETE_FAILED_APP_PINNED: return "DELETE_FAILED_APP_PINNED"; default: return Integer.toString(status); } } Loading @@ -7559,6 +7569,7 @@ public abstract class PackageManager { case DELETE_FAILED_OWNER_BLOCKED: return PackageInstaller.STATUS_FAILURE_BLOCKED; case DELETE_FAILED_ABORTED: return PackageInstaller.STATUS_FAILURE_ABORTED; case DELETE_FAILED_USED_SHARED_LIBRARY: return PackageInstaller.STATUS_FAILURE_CONFLICT; case DELETE_FAILED_APP_PINNED: return PackageInstaller.STATUS_FAILURE_BLOCKED; default: return PackageInstaller.STATUS_FAILURE; } } Loading
packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +4 −0 Original line number Diff line number Diff line Loading @@ -339,6 +339,10 @@ public class InstallInstalling extends AlertActivity { try { session = getPackageManager().getPackageInstaller().openSession(mSessionId); } catch (IOException e) { synchronized (this) { isDone = true; notifyAll(); } return null; } Loading
services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +0 −3 Original line number Diff line number Diff line Loading @@ -3275,9 +3275,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub boolean hideCurrentInputLocked(IBinder windowToken, int flags, ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) { if (mCurClient == null || mCurClient.curSession == null) { return false; } if ((flags&InputMethodManager.HIDE_IMPLICIT_ONLY) != 0 && (mShowExplicitlyRequested || mShowForced)) { if (DEBUG) Slog.v(TAG, "Not hiding: explicit show not cancelled by non-explicit hide"); Loading