diff options
37 files changed, 350 insertions, 105 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 5bcf30771436..2c7ee212b7b5 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -582,6 +582,7 @@ bool BootAnimation::threadLoop() { result = movie(); } + mCallbacks->shutdown(); eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroyContext(mDisplay, mContext); eglDestroySurface(mDisplay, mSurface); @@ -668,7 +669,6 @@ void BootAnimation::checkExit() { int exitnow = atoi(value); if (exitnow) { requestExit(); - mCallbacks->shutdown(); } } diff --git a/cmds/statsd/OWNERS b/cmds/statsd/OWNERS index a61babf32e58..4e4e11988b62 100644 --- a/cmds/statsd/OWNERS +++ b/cmds/statsd/OWNERS @@ -1,9 +1 @@ -jeffreyhuang@google.com -joeo@google.com -jtnguyen@google.com -muhammadq@google.com -ruchirr@google.com -singhtejinder@google.com -tsaichristine@google.com -yaochen@google.com -yro@google.com +baligh@google.com diff --git a/core/api/current.txt b/core/api/current.txt index a20b58efb53f..7e7c22c282df 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -45091,6 +45091,7 @@ package android.telephony { } public static final class CarrierConfigManager.Ims { + field public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL = "ims.enable_presence_publish_bool"; field public static final String KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL = "ims.ims_single_registration_required_bool"; field public static final String KEY_PREFIX = "ims."; field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 3d69cbdfae60..bb72096ab270 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -10153,6 +10153,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimCardState(int); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Locale getSimLocale(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getSupportedRadioAccessFamily(); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.telephony.RadioAccessSpecifier> getSystemSelectionChannels(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo(); method @Nullable public android.os.Bundle getVisualVoicemailSettings(); diff --git a/core/java/android/hardware/hdmi/HdmiDeviceInfo.java b/core/java/android/hardware/hdmi/HdmiDeviceInfo.java index 55b07268d201..6b2bab4f5a4f 100644 --- a/core/java/android/hardware/hdmi/HdmiDeviceInfo.java +++ b/core/java/android/hardware/hdmi/HdmiDeviceInfo.java @@ -513,4 +513,19 @@ public class HdmiDeviceInfo implements Parcelable { && mDeviceId == other.mDeviceId && mAdopterId == other.mAdopterId; } + + @Override + public int hashCode() { + return java.util.Objects.hash( + mHdmiDeviceType, + mPhysicalAddress, + mPortId, + mLogicalAddress, + mDeviceType, + mVendorId, + mDevicePowerStatus, + mDisplayName, + mDeviceId, + mAdopterId); + } } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 8926b2740d6e..67d5f5f205cc 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -3172,28 +3172,55 @@ public class UserManager { } /** - * Returns information for all users on this device, including ones marked for deletion. - * To retrieve only users that are alive, use {@link #getUsers(boolean)}. + * Returns information for all fully-created users on this device, including ones marked for + * deletion. + * + * <p>To retrieve only users that are not marked for deletion, use {@link #getAliveUsers()}. + * + * <p>To retrieve *all* users (including partial and pre-created users), use + * {@link #getUsers(boolean, boolean, boolean)) getUsers(false, false, false)}. + * + * <p>To retrieve a more specific list of users, use + * {@link #getUsers(boolean, boolean, boolean)}. + * + * @return the list of users that were created. * - * @return the list of users that exist on the device. * @hide */ @UnsupportedAppUsage @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public List<UserInfo> getUsers() { - return getUsers(/* excludeDying= */ false); + return getUsers(/*excludePartial= */ true, /* excludeDying= */ false, + /* excludePreCreated= */ true); } /** - * Returns information for all users on this device. Requires - * {@link android.Manifest.permission#MANAGE_USERS} permission. + * Returns information for all "usable" users on this device (i.e, it excludes users that are + * marked for deletion, pre-created users, etc...). + * + * <p>To retrieve all fully-created users, use {@link #getUsers()}. + * + * <p>To retrieve a more specific list of users, use + * {@link #getUsers(boolean, boolean, boolean)}. * - * @param excludeDying specify if the list should exclude users being - * removed. * @return the list of users that were created. * @hide */ + @RequiresPermission(android.Manifest.permission.MANAGE_USERS) + public @NonNull List<UserInfo> getAliveUsers() { + return getUsers(/*excludePartial= */ true, /* excludeDying= */ true, + /* excludePreCreated= */ true); + } + + /** + * @deprecated use {@link #getAliveUsers()} for {@code getUsers(true)}, or + * {@link #getUsers()} for @code getUsers(false)}. + * + * @hide + */ + @Deprecated @UnsupportedAppUsage + @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public @NonNull List<UserInfo> getUsers(boolean excludeDying) { return getUsers(/*excludePartial= */ true, excludeDying, /* excludePreCreated= */ true); diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index e6bb08836aee..3edc154656c3 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -200,6 +200,21 @@ public class VolumeInfo implements Parcelable { internalPath = parcel.readString8(); } + public VolumeInfo(VolumeInfo volumeInfo) { + this.id = volumeInfo.id; + this.type = volumeInfo.type; + this.disk = volumeInfo.disk; + this.partGuid = volumeInfo.partGuid; + this.mountFlags = volumeInfo.mountFlags; + this.mountUserId = volumeInfo.mountUserId; + this.state = volumeInfo.state; + this.fsType = volumeInfo.fsType; + this.fsUuid = volumeInfo.fsUuid; + this.fsLabel = volumeInfo.fsLabel; + this.path = volumeInfo.path; + this.internalPath = volumeInfo.internalPath; + } + @UnsupportedAppUsage public static @NonNull String getEnvironmentForState(int state) { final String envState = sStateToEnvironment.get(state); diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 1f625443c96e..7493e39538dc 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -336,7 +336,7 @@ static jint getVectorOfAudioDeviceTypeAddr(JNIEnv *env, jintArray deviceTypes, return (jint)AUDIO_JAVA_BAD_VALUE; } const char *address = env->GetStringUTFChars((jstring)addrJobj, NULL); - AudioDeviceTypeAddr dev = AudioDeviceTypeAddr(typesPtr[i], address); + AudioDeviceTypeAddr dev = AudioDeviceTypeAddr((audio_devices_t)typesPtr[i], address); audioDeviceTypeAddrVector.add(dev); env->ReleaseStringUTFChars((jstring)addrJobj, address); } @@ -818,7 +818,8 @@ static void convertAudioGainConfigToNative(JNIEnv *env, bool useInMask) { nAudioGainConfig->index = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mIndex); - nAudioGainConfig->mode = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mMode); + nAudioGainConfig->mode = + (audio_gain_mode_t)env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mMode); ALOGV("convertAudioGainConfigToNative got gain index %d", nAudioGainConfig->index); jint jMask = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mChannelMask); audio_channel_mask_t nMask; @@ -938,8 +939,8 @@ static jint convertAudioPortConfigToNativeWithDevicePort(JNIEnv *env, jobject jAudioDevicePort = env->GetObjectField(jAudioPortConfig, gAudioPortConfigFields.mPort); - nAudioPortConfig->ext.device.type = env->GetIntField(jAudioDevicePort, - gAudioPortFields.mType); + nAudioPortConfig->ext.device.type = + (audio_devices_t)env->GetIntField(jAudioDevicePort, gAudioPortFields.mType); jstring jDeviceAddress = (jstring)env->GetObjectField(jAudioDevicePort, gAudioPortFields.mAddress); const char *nDeviceAddress = env->GetStringUTFChars(jDeviceAddress, NULL); @@ -2332,7 +2333,7 @@ static jint android_media_AudioSystem_setSupportedSystemUsages(JNIEnv *env, jobj static jint android_media_AudioSystem_setAllowedCapturePolicy(JNIEnv *env, jobject thiz, jint uid, jint flags) { - return AudioSystem::setAllowedCapturePolicy(uid, flags); + return AudioSystem::setAllowedCapturePolicy(uid, static_cast<audio_flags_mask_t>(flags)); } static jint @@ -2367,8 +2368,10 @@ android_media_AudioSystem_setPreferredDeviceForStrategy(JNIEnv *env, jobject thi const char *c_address = env->GetStringUTFChars(deviceAddress, NULL); int status = check_AudioSystem_Command( - AudioSystem::setPreferredDeviceForStrategy((product_strategy_t) strategy, - AudioDeviceTypeAddr(deviceType, c_address))); + AudioSystem::setPreferredDeviceForStrategy((product_strategy_t)strategy, + AudioDeviceTypeAddr((audio_devices_t) + deviceType, + c_address))); env->ReleaseStringUTFChars(deviceAddress, c_address); return (jint) status; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index a417f0c708b2..e6619f58f273 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3032,6 +3032,12 @@ <permission android:name="android.permission.DUMP" android:protectionLevel="signature|privileged|development" /> + <!-- Allows an application to start tracing for InputMethod and WindowManager. + <p>Not for use by third-party applications. + @hide --> + <permission android:name="android.permission.CONTROL_UI_TRACING" + android:protectionLevel="signature|privileged|development" /> + <!-- Allows an application to read the low-level system log files. <p>Not for use by third-party applications, because Log entries can contain the user's private information. --> diff --git a/core/tests/hdmitests/Android.bp b/core/tests/hdmitests/Android.bp index 2194d4b030ce..4755e0ea5259 100644 --- a/core/tests/hdmitests/Android.bp +++ b/core/tests/hdmitests/Android.bp @@ -19,6 +19,7 @@ android_test { static_libs: [ "androidx.test.rules", "frameworks-base-testutils", + "guava-android-testlib", "truth-prebuilt", ], libs: ["android.test.runner"], diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiDeviceInfoTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiDeviceInfoTest.java new file mode 100755 index 000000000000..4c0de629c464 --- /dev/null +++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiDeviceInfoTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.hdmi; + +import androidx.test.filters.SmallTest; + +import com.google.common.testing.EqualsTester; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link HdmiDeviceInfo} */ +@RunWith(JUnit4.class) +@SmallTest +public class HdmiDeviceInfoTest { + + @Test + public void testEquals() { + int logicalAddr = 0x00; + int phyAddr = 0x1000; + int portId = 1; + int deviceType = 0; + int vendorId = 0x123456; + String displayName = "test device"; + int powerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY; + int deviceId = 3; + int adopterId = 2; + + new EqualsTester() + .addEqualityGroup(new HdmiDeviceInfo()) + .addEqualityGroup( + new HdmiDeviceInfo(phyAddr, portId), new HdmiDeviceInfo(phyAddr, portId)) + .addEqualityGroup( + new HdmiDeviceInfo(phyAddr, portId, adopterId, deviceId), + new HdmiDeviceInfo(phyAddr, portId, adopterId, deviceId)) + .addEqualityGroup( + new HdmiDeviceInfo( + logicalAddr, phyAddr, portId, deviceType, vendorId, displayName), + new HdmiDeviceInfo( + logicalAddr, phyAddr, portId, deviceType, vendorId, displayName)) + .addEqualityGroup( + new HdmiDeviceInfo( + logicalAddr, + phyAddr, + portId, + deviceType, + vendorId, + displayName, + powerStatus), + new HdmiDeviceInfo( + logicalAddr, + phyAddr, + portId, + deviceType, + vendorId, + displayName, + powerStatus)) + .testEquals(); + } +} diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 0806e7151997..ce6deeab87fa 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -316,6 +316,7 @@ applications that come with the platform <permission name="android.permission.DELETE_CACHE_FILES"/> <permission name="android.permission.DELETE_PACKAGES"/> <permission name="android.permission.DUMP"/> + <permission name="android.permission.CONTROL_UI_TRACING"/> <permission name="android.permission.ACTIVITY_EMBEDDING"/> <permission name="android.permission.FORCE_STOP_PACKAGES"/> <permission name="android.permission.GET_APP_OPS_STATS"/> diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp index 96961ac21a2d..d55e9d0efffd 100644 --- a/media/jni/audioeffect/android_media_AudioEffect.cpp +++ b/media/jni/audioeffect/android_media_AudioEffect.cpp @@ -331,7 +331,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t } if (deviceType != AUDIO_DEVICE_NONE) { - device.mType = deviceType; + device.mType = (audio_devices_t)deviceType; ScopedUtfChars address(env, deviceAddress); device.mAddress = address.c_str(); } diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp index ca3cc8552990..26725f87bfdc 100644 --- a/media/jni/soundpool/android_media_SoundPool.cpp +++ b/media/jni/soundpool/android_media_SoundPool.cpp @@ -200,7 +200,7 @@ android_media_SoundPool_native_setup(JNIEnv *env, jobject thiz, jobject weakRef, paa->usage = (audio_usage_t) env->GetIntField(jaa, javaAudioAttrFields.fieldUsage); paa->content_type = (audio_content_type_t) env->GetIntField(jaa, javaAudioAttrFields.fieldContentType); - paa->flags = env->GetIntField(jaa, javaAudioAttrFields.fieldFlags); + paa->flags = (audio_flags_mask_t) env->GetIntField(jaa, javaAudioAttrFields.fieldFlags); ALOGV("android_media_SoundPool_native_setup"); auto *ap = new SoundPool(maxChannels, paa); diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index a9279971ce1e..fa4da2826b54 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -70,6 +70,7 @@ <uses-permission android:name="android.permission.SET_PROCESS_LIMIT" /> <uses-permission android:name="android.permission.SET_ALWAYS_FINISH" /> <uses-permission android:name="android.permission.DUMP" /> + <uses-permission android:name="android.permission.CONTROL_UI_TRACING" /> <uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES" /> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <!-- Internal permissions granted to the shell. --> diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 1147db511a87..70ef44c3edb3 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1391,12 +1391,13 @@ class StorageManagerService extends IStorageManager.Stub final int oldState = vol.state; final int newState = state; vol.state = newState; + final VolumeInfo vInfo = new VolumeInfo(vol); final SomeArgs args = SomeArgs.obtain(); - args.arg1 = vol; + args.arg1 = vInfo; args.arg2 = oldState; args.arg3 = newState; mHandler.obtainMessage(H_VOLUME_STATE_CHANGED, args).sendToTarget(); - onVolumeStateChangedLocked(vol, oldState, newState); + onVolumeStateChangedLocked(vInfo, oldState, newState); } } } diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java index d6bd5a1d7c4c..a45466d98563 100644 --- a/services/core/java/com/android/server/TestNetworkService.java +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -29,9 +29,9 @@ import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkAgent; +import android.net.NetworkAgentConfig; import android.net.NetworkCapabilities; -import android.net.NetworkInfo; -import android.net.NetworkInfo.DetailedState; +import android.net.NetworkProvider; import android.net.RouteInfo; import android.net.StringNetworkSpecifier; import android.net.TestNetworkInterface; @@ -62,7 +62,8 @@ import java.util.concurrent.atomic.AtomicInteger; /** @hide */ class TestNetworkService extends ITestNetworkManager.Stub { @NonNull private static final String TAG = TestNetworkService.class.getSimpleName(); - @NonNull private static final String TEST_NETWORK_TYPE = "TEST_NETWORK"; + @NonNull private static final String TEST_NETWORK_LOGTAG = "TestNetworkAgent"; + @NonNull private static final String TEST_NETWORK_PROVIDER_NAME = TAG; @NonNull private static final AtomicInteger sTestTunIndex = new AtomicInteger(); @NonNull private final Context mContext; @@ -72,6 +73,9 @@ class TestNetworkService extends ITestNetworkManager.Stub { @NonNull private final HandlerThread mHandlerThread; @NonNull private final Handler mHandler; + @NonNull private final ConnectivityManager mCm; + @NonNull private final NetworkProvider mNetworkProvider; + // Native method stubs private static native int jniCreateTunTap(boolean isTun, @NonNull String iface); @@ -85,6 +89,10 @@ class TestNetworkService extends ITestNetworkManager.Stub { mContext = Objects.requireNonNull(context, "missing Context"); mNMS = Objects.requireNonNull(netManager, "missing INetworkManagementService"); mNetd = Objects.requireNonNull(NetdService.getInstance(), "could not get netd instance"); + mCm = mContext.getSystemService(ConnectivityManager.class); + mNetworkProvider = new NetworkProvider(mContext, mHandler.getLooper(), + TEST_NETWORK_PROVIDER_NAME); + mCm.registerNetworkProvider(mNetworkProvider); } /** @@ -150,9 +158,6 @@ class TestNetworkService extends ITestNetworkManager.Stub { private static final int NETWORK_SCORE = 1; // Use a low, non-zero score. private final int mUid; - @NonNull private final NetworkInfo mNi; - @NonNull private final NetworkCapabilities mNc; - @NonNull private final LinkProperties mLp; @GuardedBy("mBinderLock") @NonNull @@ -161,20 +166,18 @@ class TestNetworkService extends ITestNetworkManager.Stub { @NonNull private final Object mBinderLock = new Object(); private TestNetworkAgent( - @NonNull Looper looper, @NonNull Context context, - @NonNull NetworkInfo ni, + @NonNull Looper looper, + @NonNull NetworkAgentConfig config, @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, int uid, - @NonNull IBinder binder) + @NonNull IBinder binder, + @NonNull NetworkProvider np) throws RemoteException { - super(looper, context, TEST_NETWORK_TYPE, ni, nc, lp, NETWORK_SCORE); + super(context, looper, TEST_NETWORK_LOGTAG, nc, lp, NETWORK_SCORE, config, np); mUid = uid; - mNi = ni; - mNc = nc; - mLp = lp; synchronized (mBinderLock) { mBinder = binder; // Binder null-checks in create() @@ -203,9 +206,7 @@ class TestNetworkService extends ITestNetworkManager.Stub { } private void teardown() { - mNi.setDetailedState(DetailedState.DISCONNECTED, null, null); - mNi.setIsAvailable(false); - sendNetworkInfo(mNi); + unregister(); // Synchronize on mBinderLock to ensure that unlinkToDeath is never called more than // once (otherwise it could throw an exception) @@ -238,11 +239,6 @@ class TestNetworkService extends ITestNetworkManager.Stub { Objects.requireNonNull(context, "missing Context"); // iface and binder validity checked by caller - // Build network info with special testing type - NetworkInfo ni = new NetworkInfo(ConnectivityManager.TYPE_TEST, 0, TEST_NETWORK_TYPE, ""); - ni.setDetailedState(DetailedState.CONNECTED, null, null); - ni.setIsAvailable(true); - // Build narrow set of NetworkCapabilities, useful only for testing NetworkCapabilities nc = new NetworkCapabilities(); nc.clearAll(); // Remove default capabilities. @@ -290,7 +286,12 @@ class TestNetworkService extends ITestNetworkManager.Stub { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null, iface)); } - return new TestNetworkAgent(looper, context, ni, nc, lp, callingUid, binder); + final TestNetworkAgent agent = new TestNetworkAgent(context, looper, + new NetworkAgentConfig.Builder().build(), nc, lp, callingUid, binder, + mNetworkProvider); + agent.register(); + agent.markConnected(); + return agent; } /** diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java index a75a80a606eb..4c63eb488118 100644 --- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java +++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java @@ -174,7 +174,7 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms); } - List<UserInfo> users = mUserManager.getUsers(true); // exclude dying users + List<UserInfo> users = mUserManager.getAliveUsers(); if (users != null) { for (UserInfo user : users) { mUsers.add(user.id); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index ed1f60fb0bc1..3445275b76dd 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1403,7 +1403,7 @@ public class Vpn { final long token = Binder.clearCallingIdentity(); List<UserInfo> users; try { - users = UserManager.get(mContext).getUsers(true); + users = UserManager.get(mContext).getAliveUsers(); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 804cc92cca08..b2d694b20d80 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -1569,10 +1569,11 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // When the device is not unplugged but reawaken from standby, we check if the System // Audio Control Feature is enabled or not then decide if turning SAM on/off accordingly. if (getAvrDeviceInfo() != null && portId == getAvrDeviceInfo().getPortId()) { + HdmiLogger.debug("Port ID:%d, 5v=%b", portId, connected); if (!connected) { setSystemAudioMode(false); - } else if (mSystemAudioControlFeatureEnabled != mService.isSystemAudioActivated()){ - setSystemAudioMode(mSystemAudioControlFeatureEnabled); + } else { + onNewAvrAdded(getAvrDeviceInfo()); } } diff --git a/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java b/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java index 6633789ffc06..db93ad0617ff 100644 --- a/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java +++ b/services/core/java/com/android/server/hdmi/SetArcTransmissionStateAction.java @@ -102,12 +102,12 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction { } private void setArcStatus(boolean enabled) { - boolean wasEnabled = tv().setArcStatus(enabled); - Slog.i(TAG, "Change arc status [old:" + wasEnabled + ", new:" + enabled + "]"); + tv().setArcStatus(enabled); + Slog.i(TAG, "Change arc status to " + enabled); // If enabled before and set to "disabled" and send <Report Arc Terminated> to // av reciever. - if (!enabled && wasEnabled) { + if (!enabled) { sendCommand(HdmiCecMessageBuilder.buildReportArcTerminated(getSourceAddress(), mAvrAddress)); } diff --git a/services/core/java/com/android/server/media/MediaKeyDispatcher.java b/services/core/java/com/android/server/media/MediaKeyDispatcher.java index 5933723f01b6..fc7c82ac5fd1 100644 --- a/services/core/java/com/android/server/media/MediaKeyDispatcher.java +++ b/services/core/java/com/android/server/media/MediaKeyDispatcher.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; +import android.content.Context; import android.media.session.ISessionManager; import android.media.session.MediaSession; import android.os.Binder; @@ -60,7 +61,7 @@ public abstract class MediaKeyDispatcher { private Map<Integer, Integer> mOverriddenKeyEvents; - public MediaKeyDispatcher() { + public MediaKeyDispatcher(Context context) { // Constructor used for reflection mOverriddenKeyEvents = new HashMap<>(); mOverriddenKeyEvents.put(KeyEvent.KEYCODE_MEDIA_PLAY, 0); diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index b02b90092b7a..9dde4c83e2a2 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -96,7 +96,6 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; /** * System implementation of MediaSessionManager @@ -152,7 +151,6 @@ public class MediaSessionService extends SystemService implements Monitor { private SessionPolicyProvider mCustomSessionPolicyProvider; private MediaKeyDispatcher mCustomMediaKeyDispatcher; - private Map<Integer, Integer> mOverriddenKeyEventsMap; public MediaSessionService(Context context) { super(context); @@ -771,7 +769,6 @@ public class MediaSessionService extends SystemService implements Monitor { private void instantiateCustomDispatcher(String nameFromTesting) { synchronized (mLock) { mCustomMediaKeyDispatcher = null; - mOverriddenKeyEventsMap = null; String customDispatcherClassName = (nameFromTesting == null) ? mContext.getResources().getString(R.string.config_customMediaKeyDispatcher) @@ -779,9 +776,10 @@ public class MediaSessionService extends SystemService implements Monitor { try { if (!TextUtils.isEmpty(customDispatcherClassName)) { Class customDispatcherClass = Class.forName(customDispatcherClassName); - Constructor constructor = customDispatcherClass.getDeclaredConstructor(); - mCustomMediaKeyDispatcher = (MediaKeyDispatcher) constructor.newInstance(); - mOverriddenKeyEventsMap = mCustomMediaKeyDispatcher.getOverriddenKeyEvents(); + Constructor constructor = + customDispatcherClass.getDeclaredConstructor(Context.class); + mCustomMediaKeyDispatcher = + (MediaKeyDispatcher) constructor.newInstance(mContext); } } catch (ClassNotFoundException | InstantiationException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e) { @@ -801,9 +799,10 @@ public class MediaSessionService extends SystemService implements Monitor { try { if (!TextUtils.isEmpty(customProviderClassName)) { Class customProviderClass = Class.forName(customProviderClassName); - Constructor constructor = customProviderClass.getDeclaredConstructor(); + Constructor constructor = + customProviderClass.getDeclaredConstructor(Context.class); mCustomSessionPolicyProvider = - (SessionPolicyProvider) constructor.newInstance(); + (SessionPolicyProvider) constructor.newInstance(mContext); } } catch (ClassNotFoundException | InstantiationException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e) { @@ -2398,9 +2397,12 @@ public class MediaSessionService extends SystemService implements Monitor { return; } - int overriddenKeyEvents = (mCustomMediaKeyDispatcher == null) ? 0 - : mCustomMediaKeyDispatcher.getOverriddenKeyEvents() - .get(keyEvent.getKeyCode()); + int overriddenKeyEvents = 0; + if (mCustomMediaKeyDispatcher != null + && mCustomMediaKeyDispatcher.getOverriddenKeyEvents() != null) { + overriddenKeyEvents = mCustomMediaKeyDispatcher.getOverriddenKeyEvents() + .get(keyEvent.getKeyCode()); + } cancelTrackingIfNeeded(packageName, pid, uid, asSystemService, keyEvent, needWakeLock, opPackageName, stream, musicOnly, overriddenKeyEvents); if (!needTracking(keyEvent, overriddenKeyEvents)) { diff --git a/services/core/java/com/android/server/media/SessionPolicyProvider.java b/services/core/java/com/android/server/media/SessionPolicyProvider.java index 5f02a075344e..332c85adec01 100644 --- a/services/core/java/com/android/server/media/SessionPolicyProvider.java +++ b/services/core/java/com/android/server/media/SessionPolicyProvider.java @@ -18,6 +18,7 @@ package com.android.server.media; import android.annotation.IntDef; import android.annotation.NonNull; +import android.content.Context; import android.media.session.MediaSession; import java.lang.annotation.Retention; @@ -54,7 +55,7 @@ public abstract class SessionPolicyProvider { */ static final int SESSION_POLICY_IGNORE_BUTTON_SESSION = 1 << 1; - public SessionPolicyProvider() { + public SessionPolicyProvider(Context context) { // Constructor used for reflection } diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java index c312fc0eca2f..a0b2e86e6a1d 100644 --- a/services/core/java/com/android/server/pm/PreferredComponent.java +++ b/services/core/java/com/android/server/pm/PreferredComponent.java @@ -254,6 +254,37 @@ public class PreferredComponent { return numMatch == NS; } + public boolean sameSet(PreferredComponent pc) { + if (mSetPackages == null || pc == null || pc.mSetPackages == null + || !sameComponent(pc.mComponent)) { + return false; + } + final int otherPackageCount = pc.mSetPackages.length; + final int packageCount = mSetPackages.length; + if (otherPackageCount != packageCount) { + return false; + } + for (int i = 0; i < packageCount; i++) { + if (!mSetPackages[i].equals(pc.mSetPackages[i]) + || !mSetClasses[i].equals(pc.mSetClasses[i])) { + return false; + } + } + return true; + } + + /** Returns true if the preferred component represents the provided ComponentName. */ + private boolean sameComponent(ComponentName comp) { + if (mComponent == null || comp == null) { + return false; + } + if (mComponent.getPackageName().equals(comp.getPackageName()) + && mComponent.getClassName().equals(comp.getClassName())) { + return true; + } + return false; + } + public boolean isSuperset(List<ResolveInfo> query, boolean excludeSetupWizardPackage) { if (mSetPackages == null) { return query == null; diff --git a/services/core/java/com/android/server/pm/PreferredIntentResolver.java b/services/core/java/com/android/server/pm/PreferredIntentResolver.java index a261e29b05a7..ff3df130a3cc 100644 --- a/services/core/java/com/android/server/pm/PreferredIntentResolver.java +++ b/services/core/java/com/android/server/pm/PreferredIntentResolver.java @@ -22,6 +22,7 @@ import android.content.IntentFilter; import java.io.PrintWriter; import com.android.server.IntentResolver; +import java.util.ArrayList; public class PreferredIntentResolver extends IntentResolver<PreferredActivity, PreferredActivity> { @@ -45,4 +46,24 @@ public class PreferredIntentResolver protected IntentFilter getIntentFilter(@NonNull PreferredActivity input) { return input; } + + public boolean shouldAddPreferredActivity(PreferredActivity pa) { + ArrayList<PreferredActivity> pal = findFilters(pa); + if (pal == null || pal.isEmpty()) { + return true; + } + if (!pa.mPref.mAlways) { + return false; + } + final int activityCount = pal.size(); + for (int i = 0; i < activityCount; i++) { + PreferredActivity cur = pal.get(i); + if (cur.mPref.mAlways + && cur.mPref.mMatch == (pa.mPref.mMatch & IntentFilter.MATCH_CATEGORY_MASK) + && cur.mPref.sameSet(pa.mPref)) { + return false; + } + } + return true; + } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 0f5d9781c612..79e5b276ac64 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1410,8 +1410,7 @@ public final class Settings { PreferredActivity pa = new PreferredActivity(parser); if (pa.mPref.getParseError() == null) { final PreferredIntentResolver resolver = editPreferredActivitiesLPw(userId); - ArrayList<PreferredActivity> pal = resolver.findFilters(pa); - if (pal == null || pal.size() == 0 || pa.mPref.mAlways) { + if (resolver.shouldAddPreferredActivity(pa)) { resolver.addFilter(pa); } } else { diff --git a/services/wifi/java/android/net/wifi/WifiApiServiceInfo.aidl b/services/wifi/java/android/net/wifi/WifiApiServiceInfo.aidl deleted file mode 100644 index 45e4c69102f0..000000000000 --- a/services/wifi/java/android/net/wifi/WifiApiServiceInfo.aidl +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi; - -/** @hide */ -parcelable WifiApiServiceInfo { - String name; - IBinder binder; -} diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 92febd962958..27ea6902146f 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -2030,8 +2030,16 @@ public class CarrierConfigManager { "allow_hold_call_during_emergency_bool"; /** - * Flag indicating whether the carrier supports RCS presence indication for - * User Capability Exchange (UCE). When presence is supported, the device should use the + * Flag indicating whether or not the carrier supports the periodic exchange of phone numbers + * in the user's address book with the carrier's presence server in order to retrieve the RCS + * capabilities for each contact used in the RCS User Capability Exchange (UCE) procedure. See + * RCC.71, section 3 for more information. + * <p> + * The flag {@link Ims#KEY_ENABLE_PRESENCE_PUBLISH_BOOL} must also be enabled if this flag is + * enabled, as sending a periodic SIP PUBLISH with this device's RCS capabilities is a + * requirement for capability exchange to begin. + * <p> + * When presence is supported, the device should use the * {@link android.provider.ContactsContract.Data#CARRIER_PRESENCE} bit mask and set the * {@link android.provider.ContactsContract.Data#CARRIER_PRESENCE_VT_CAPABLE} bit to indicate * whether each contact supports video calling. The UI is made aware that presence is enabled @@ -3847,12 +3855,27 @@ public class CarrierConfigManager { public static final String KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL = KEY_PREFIX + "ims_single_registration_required_bool"; + /** + * A boolean flag specifying whether or not this carrier supports the device notifying the + * network of its RCS capabilities using the SIP PUBLISH procedure defined for User + * Capability Exchange (UCE). See RCC.71, section 3 for more information. + * <p> + * If this key's value is set to false, the procedure for RCS contact capability exchange + * via SIP SUBSCRIBE/NOTIFY will also be disabled internally, and + * {@link #KEY_USE_RCS_PRESENCE_BOOL} must also be set to false to ensure apps do not + * improperly think that capability exchange via SIP PUBLISH is enabled. + * <p> The default value for this key is {@code false}. + */ + public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL = + KEY_PREFIX + "enable_presence_publish_bool"; + private Ims() {} private static PersistableBundle getDefaults() { PersistableBundle defaults = new PersistableBundle(); defaults.putInt(KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT, 4000); defaults.putBoolean(KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false); + defaults.putBoolean(KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false); return defaults; } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 44aa6bcde0fa..d156907af081 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -13030,6 +13030,37 @@ public class TelephonyManager { } /** + * Get which bands the modem's background scan is acting on, specified by + * {@link #setSystemSelectionChannels}. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * + * @return a list of {@link RadioAccessSpecifier}, or an empty list if no bands are specified. + * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public @NonNull List<RadioAccessSpecifier> getSystemSelectionChannels() { + try { + ITelephony service = getITelephony(); + if (service != null) { + return service.getSystemSelectionChannels(getSubId()); + } else { + throw new IllegalStateException("telephony service is null."); + } + } catch (RemoteException ex) { + if (!isSystemProcess()) { + ex.rethrowAsRuntimeException(); + } + } + return new ArrayList<>(); + } + + /** * Verifies whether the input MCC/MNC and MVNO correspond to the current carrier. * * @param mccmnc the carrier's mccmnc that you want to match diff --git a/telephony/java/android/telephony/ims/RcsContactUceCapability.java b/telephony/java/android/telephony/ims/RcsContactUceCapability.java index d12a6aef5186..5848be8b0bf2 100644 --- a/telephony/java/android/telephony/ims/RcsContactUceCapability.java +++ b/telephony/java/android/telephony/ims/RcsContactUceCapability.java @@ -105,10 +105,17 @@ public final class RcsContactUceCapability implements Parcelable { public @interface RequestResult {} /** + * The base class of {@link OptionsBuilder} and {@link PresenceBuilder} + */ + public static abstract class RcsUcsCapabilityBuilder { + public abstract @NonNull RcsContactUceCapability build(); + } + + /** * Builder to help construct {@link RcsContactUceCapability} instances when capabilities were * queried through SIP OPTIONS. */ - public static class OptionsBuilder { + public static class OptionsBuilder extends RcsUcsCapabilityBuilder { private final RcsContactUceCapability mCapabilities; @@ -155,6 +162,7 @@ public final class RcsContactUceCapability implements Parcelable { /** * @return the constructed instance. */ + @Override public @NonNull RcsContactUceCapability build() { return mCapabilities; } @@ -164,7 +172,7 @@ public final class RcsContactUceCapability implements Parcelable { * Builder to help construct {@link RcsContactUceCapability} instances when capabilities were * queried through a presence server. */ - public static class PresenceBuilder { + public static class PresenceBuilder extends RcsUcsCapabilityBuilder { private final RcsContactUceCapability mCapabilities; @@ -205,6 +213,7 @@ public final class RcsContactUceCapability implements Parcelable { /** * @return the RcsContactUceCapability instance. */ + @Override public @NonNull RcsContactUceCapability build() { return mCapabilities; } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 9f675f6b4dd2..69525a887af9 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -2159,6 +2159,8 @@ interface ITelephony { oneway void setSystemSelectionChannels(in List<RadioAccessSpecifier> specifiers, int subId, IBooleanConsumer resultCallback); + List<RadioAccessSpecifier> getSystemSelectionChannels(int subId); + boolean isMvnoMatched(int subId, int mvnoType, String mvnoMatchData); /** diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 9d4072f1cf1c..a2361a7d34a1 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -519,6 +519,7 @@ public interface RILConstants { int RIL_REQUEST_RELEASE_PDU_SESSION_ID = 216; int RIL_REQUEST_START_HANDOVER = 217; int RIL_REQUEST_CANCEL_HANDOVER = 218; + int RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS = 219; /* Responses begin */ int RIL_RESPONSE_ACKNOWLEDGEMENT = 800; diff --git a/tests/BootImageProfileTest/TEST_MAPPING b/tests/BootImageProfileTest/TEST_MAPPING new file mode 100644 index 000000000000..1b569f9455bf --- /dev/null +++ b/tests/BootImageProfileTest/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "BootImageProfileTest" + } + ] +} diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 878f6fa0f96a..7a1cb25b2d3a 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1235,7 +1235,7 @@ public class ConnectivityServiceTest { MockitoAnnotations.initMocks(this); when(mMetricsService.defaultNetworkMetrics()).thenReturn(mDefaultNetworkMetrics); - when(mUserManager.getUsers(eq(true))).thenReturn( + when(mUserManager.getAliveUsers()).thenReturn( Arrays.asList(new UserInfo[] { new UserInfo(VPN_USER, "", 0), })); diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java index 5a29c2c96ba7..de35f910d53a 100644 --- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java @@ -123,7 +123,7 @@ public class PermissionMonitorTest { MockitoAnnotations.initMocks(this); when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager); - when(mUserManager.getUsers(eq(true))).thenReturn( + when(mUserManager.getAliveUsers()).thenReturn( Arrays.asList(new UserInfo[] { new UserInfo(MOCK_USER1, "", 0), new UserInfo(MOCK_USER2, "", 0), diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java index 1c1b5e1c66f0..337507ac1d46 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/tests/net/java/com/android/server/connectivity/VpnTest.java @@ -1220,15 +1220,14 @@ public class VpnTest { * @see UserManagerService#getUsers(boolean) */ doAnswer(invocation -> { - final boolean excludeDying = (boolean) invocation.getArguments()[0]; final ArrayList<UserInfo> result = new ArrayList<>(users.length); for (UserInfo ui : users) { - if (!excludeDying || (ui.isEnabled() && !ui.partial)) { + if (ui.isEnabled() && !ui.partial) { result.add(ui); } } return result; - }).when(mUserManager).getUsers(anyBoolean()); + }).when(mUserManager).getAliveUsers(); doAnswer(invocation -> { final int id = (int) invocation.getArguments()[0]; |