diff options
30 files changed, 201 insertions, 72 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 0eba9d75fdfc..b54a74746152 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -112,6 +112,7 @@ package android { field public static final String MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE"; field public static final String MOUNT_FORMAT_FILESYSTEMS = "android.permission.MOUNT_FORMAT_FILESYSTEMS"; field public static final String MOUNT_UNMOUNT_FILESYSTEMS = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"; + field public static final String NEARBY_WIFI_DEVICES = "android.permission.NEARBY_WIFI_DEVICES"; field public static final String NFC = "android.permission.NFC"; field public static final String NFC_PREFERRED_PAYMENT_INFO = "android.permission.NFC_PREFERRED_PAYMENT_INFO"; field public static final String NFC_TRANSACTION_EVENT = "android.permission.NFC_TRANSACTION_EVENT"; diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 172818d12b9e..49df45ac0c4f 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -312,7 +312,7 @@ package android.os.storage { package android.provider { public static final class ContactsContract.RawContactsEntity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns { - method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public static java.util.Map<java.lang.String,java.util.List<android.content.ContentValues>> queryRawContactEntity(@NonNull android.content.Context, long); + method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public static java.util.Map<java.lang.String,java.util.List<android.content.ContentValues>> queryRawContactEntity(@NonNull android.content.ContentResolver, long); } public final class DeviceConfig { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 6f825ae4e003..9c6939e5aae5 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -1935,6 +1935,22 @@ package android.bluetooth { field @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED"; } + public final class BluetoothActivityEnergyInfo implements android.os.Parcelable { + method public int getBluetoothStackState(); + method public long getControllerEnergyUsed(); + method public long getControllerIdleTimeMillis(); + method public long getControllerRxTimeMillis(); + method public long getControllerTxTimeMillis(); + method public long getTimeStamp(); + method @NonNull public java.util.List<android.bluetooth.UidTraffic> getUidTraffic(); + method public boolean isValid(); + field public static final int BT_STACK_STATE_INVALID = 0; // 0x0 + field public static final int BT_STACK_STATE_STATE_ACTIVE = 1; // 0x1 + field public static final int BT_STACK_STATE_STATE_IDLE = 3; // 0x3 + field public static final int BT_STACK_STATE_STATE_SCANNING = 2; // 0x2 + field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothActivityEnergyInfo> CREATOR; + } + public final class BluetoothAdapter { method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean addOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull java.util.concurrent.Executor, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener); method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean disable(boolean); @@ -2234,6 +2250,13 @@ package android.bluetooth { method @NonNull public android.bluetooth.OobData.LeBuilder setRandomizerHash(@NonNull byte[]); } + public final class UidTraffic implements java.lang.Cloneable android.os.Parcelable { + method public long getRxBytes(); + method public long getTxBytes(); + method public int getUid(); + field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.UidTraffic> CREATOR; + } + } package android.bluetooth.le { diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index d932a29beca6..0b336f6fc47f 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1292,6 +1292,9 @@ public class AppOpsManager { /** @hide */ public static final int OP_UWB_RANGING = AppProtoEnums.APP_OP_UWB_RANGING; + /** @hide */ + public static final int OP_NEARBY_WIFI_DEVICES = AppProtoEnums.APP_OP_NEARBY_WIFI_DEVICES; + /** * Activity recognition being accessed by an activity recognition source, which * is a component that already has access since it is the one that detects @@ -1312,7 +1315,7 @@ public class AppOpsManager { /** @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public static final int _NUM_OP = 116; + public static final int _NUM_OP = 117; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -1731,6 +1734,8 @@ public class AppOpsManager { public static final String OPSTR_MANAGE_MEDIA = "android:manage_media"; /** @hide */ public static final String OPSTR_UWB_RANGING = "android:uwb_ranging"; + /** @hide */ + public static final String OPSTR_NEARBY_WIFI_DEVICES = "android:nearby_wifi_devices"; /** * Activity recognition being accessed by an activity recognition source, which @@ -1819,6 +1824,7 @@ public class AppOpsManager { OP_BLUETOOTH_CONNECT, OP_BLUETOOTH_ADVERTISE, OP_UWB_RANGING, + OP_NEARBY_WIFI_DEVICES, // APPOP PERMISSIONS OP_ACCESS_NOTIFICATIONS, @@ -1963,6 +1969,7 @@ public class AppOpsManager { OP_ACTIVITY_RECOGNITION, // OP_ACTIVITY_RECOGNITION_SOURCE OP_BLUETOOTH_ADVERTISE, // OP_BLUETOOTH_ADVERTISE OP_RECORD_INCOMING_PHONE_AUDIO, // OP_RECORD_INCOMING_PHONE_AUDIO + OP_NEARBY_WIFI_DEVICES, // OP_NEARBY_WIFI_DEVICES }; /** @@ -2085,6 +2092,7 @@ public class AppOpsManager { OPSTR_ACTIVITY_RECOGNITION_SOURCE, OPSTR_BLUETOOTH_ADVERTISE, OPSTR_RECORD_INCOMING_PHONE_AUDIO, + OPSTR_NEARBY_WIFI_DEVICES, }; /** @@ -2208,6 +2216,7 @@ public class AppOpsManager { "ACTIVITY_RECOGNITION_SOURCE", "BLUETOOTH_ADVERTISE", "RECORD_INCOMING_PHONE_AUDIO", + "NEARBY_WIFI_DEVICES" }; /** @@ -2332,6 +2341,7 @@ public class AppOpsManager { null, // no permission for OP_ACTIVITY_RECOGNITION_SOURCE, Manifest.permission.BLUETOOTH_ADVERTISE, null, // no permission for OP_RECORD_INCOMING_PHONE_AUDIO, + Manifest.permission.NEARBY_WIFI_DEVICES, }; /** @@ -2456,6 +2466,7 @@ public class AppOpsManager { null, // ACTIVITY_RECOGNITION_SOURCE null, // BLUETOOTH_ADVERTISE null, // RECORD_INCOMING_PHONE_AUDIO + null, // NEARBY_WIFI_DEVICES }; /** @@ -2579,6 +2590,7 @@ public class AppOpsManager { null, // ACTIVITY_RECOGNITION_SOURCE null, // BLUETOOTH_ADVERTISE null, // RECORD_INCOMING_PHONE_AUDIO + null, // NEARBY_WIFI_DEVICES }; /** @@ -2701,6 +2713,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, // ACTIVITY_RECOGNITION_SOURCE AppOpsManager.MODE_ALLOWED, // BLUETOOTH_ADVERTISE AppOpsManager.MODE_ALLOWED, // RECORD_INCOMING_PHONE_AUDIO + AppOpsManager.MODE_ALLOWED, // NEARBY_WIFI_DEVICES }; /** @@ -2827,6 +2840,7 @@ public class AppOpsManager { false, // ACTIVITY_RECOGNITION_SOURCE false, // BLUETOOTH_ADVERTISE false, // RECORD_INCOMING_PHONE_AUDIO + false, // NEARBY_WIFI_DEVICES }; /** diff --git a/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java b/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java index df065bf1bf8d..f371c6d78221 100644 --- a/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java +++ b/core/java/android/bluetooth/BluetoothActivityEnergyInfo.java @@ -16,18 +16,25 @@ package android.bluetooth; +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; -import java.util.Arrays; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Collections; +import java.util.List; /** * Record of energy and activity information from controller and * underlying bt stack state.Timestamp the record with system - * time + * time. * * @hide */ +@SystemApi(client = SystemApi.Client.PRIVILEGED_APPS) public final class BluetoothActivityEnergyInfo implements Parcelable { private final long mTimestamp; private int mBluetoothStackState; @@ -35,13 +42,24 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { private long mControllerRxTimeMs; private long mControllerIdleTimeMs; private long mControllerEnergyUsed; - private UidTraffic[] mUidTraffic; + private List<UidTraffic> mUidTraffic; + + /** @hide */ + @IntDef(prefix = { "BT_STACK_STATE_" }, value = { + BT_STACK_STATE_INVALID, + BT_STACK_STATE_STATE_ACTIVE, + BT_STACK_STATE_STATE_SCANNING, + BT_STACK_STATE_STATE_IDLE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface BluetoothStackState {} public static final int BT_STACK_STATE_INVALID = 0; public static final int BT_STACK_STATE_STATE_ACTIVE = 1; public static final int BT_STACK_STATE_STATE_SCANNING = 2; public static final int BT_STACK_STATE_STATE_IDLE = 3; + /** @hide */ public BluetoothActivityEnergyInfo(long timestamp, int stackState, long txTime, long rxTime, long idleTime, long energyUsed) { mTimestamp = timestamp; @@ -52,17 +70,18 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { mControllerEnergyUsed = energyUsed; } - @SuppressWarnings("unchecked") - BluetoothActivityEnergyInfo(Parcel in) { + /** @hide */ + private BluetoothActivityEnergyInfo(Parcel in) { mTimestamp = in.readLong(); mBluetoothStackState = in.readInt(); mControllerTxTimeMs = in.readLong(); mControllerRxTimeMs = in.readLong(); mControllerIdleTimeMs = in.readLong(); mControllerEnergyUsed = in.readLong(); - mUidTraffic = in.createTypedArray(UidTraffic.CREATOR); + mUidTraffic = in.createTypedArrayList(UidTraffic.CREATOR); } + /** @hide */ @Override public String toString() { return "BluetoothActivityEnergyInfo{" @@ -72,11 +91,11 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { + " mControllerRxTimeMs=" + mControllerRxTimeMs + " mControllerIdleTimeMs=" + mControllerIdleTimeMs + " mControllerEnergyUsed=" + mControllerEnergyUsed - + " mUidTraffic=" + Arrays.toString(mUidTraffic) + + " mUidTraffic=" + mUidTraffic + " }"; } - public static final @android.annotation.NonNull Parcelable.Creator<BluetoothActivityEnergyInfo> CREATOR = + public static final @NonNull Parcelable.Creator<BluetoothActivityEnergyInfo> CREATOR = new Parcelable.Creator<BluetoothActivityEnergyInfo>() { public BluetoothActivityEnergyInfo createFromParcel(Parcel in) { return new BluetoothActivityEnergyInfo(in); @@ -87,9 +106,8 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { } }; - + /** @hide */ @Override - @SuppressWarnings("unchecked") public void writeToParcel(Parcel out, int flags) { out.writeLong(mTimestamp); out.writeInt(mBluetoothStackState); @@ -97,17 +115,21 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { out.writeLong(mControllerRxTimeMs); out.writeLong(mControllerIdleTimeMs); out.writeLong(mControllerEnergyUsed); - out.writeTypedArray(mUidTraffic, flags); + out.writeTypedList(mUidTraffic); } + /** @hide */ @Override public int describeContents() { return 0; } /** - * @return bt stack reported state + * Get the Bluetooth stack state associated with the energy info. + * + * @return one of {@link #BluetoothStackState} states */ + @BluetoothStackState public int getBluetoothStackState() { return mBluetoothStackState; } @@ -134,7 +156,7 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { } /** - * product of current(mA), voltage(V) and time(ms) + * Get the product of current (mA), voltage (V), and time (ms). * * @return energy used */ @@ -143,22 +165,31 @@ public final class BluetoothActivityEnergyInfo implements Parcelable { } /** - * @return timestamp(real time elapsed in milliseconds since boot) of record creation. + * @return timestamp (real time elapsed in milliseconds since boot) of record creation */ public long getTimeStamp() { return mTimestamp; } - public UidTraffic[] getUidTraffic() { + /** + * Get the {@link List} of each application {@link android.bluetooth.UidTraffic}. + * + * @return current {@link List} of {@link android.bluetooth.UidTraffic} + */ + public @NonNull List<UidTraffic> getUidTraffic() { + if (mUidTraffic == null) { + return Collections.emptyList(); + } return mUidTraffic; } - public void setUidTraffic(UidTraffic[] traffic) { + /** @hide */ + public void setUidTraffic(List<UidTraffic> traffic) { mUidTraffic = traffic; } /** - * @return if the record is valid + * @return true if the record is valid */ public boolean isValid() { return ((mControllerTxTimeMs >= 0) && (mControllerRxTimeMs >= 0) diff --git a/core/java/android/bluetooth/UidTraffic.java b/core/java/android/bluetooth/UidTraffic.java index 2ee786a59091..9982fa6121e4 100644 --- a/core/java/android/bluetooth/UidTraffic.java +++ b/core/java/android/bluetooth/UidTraffic.java @@ -15,6 +15,7 @@ */ package android.bluetooth; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; @@ -23,27 +24,27 @@ import android.os.Parcelable; * * @hide */ -public class UidTraffic implements Cloneable, Parcelable { +@SystemApi(client = SystemApi.Client.PRIVILEGED_APPS) +public final class UidTraffic implements Cloneable, Parcelable { private final int mAppUid; private long mRxBytes; private long mTxBytes; - public UidTraffic(int appUid) { - mAppUid = appUid; - } - + /** @hide */ public UidTraffic(int appUid, long rx, long tx) { mAppUid = appUid; mRxBytes = rx; mTxBytes = tx; } - UidTraffic(Parcel in) { + /** @hide */ + private UidTraffic(Parcel in) { mAppUid = in.readInt(); mRxBytes = in.readLong(); mTxBytes = in.readLong(); } + /** @hide */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mAppUid); @@ -51,44 +52,60 @@ public class UidTraffic implements Cloneable, Parcelable { dest.writeLong(mTxBytes); } + /** @hide */ public void setRxBytes(long bytes) { mRxBytes = bytes; } + /** @hide */ public void setTxBytes(long bytes) { mTxBytes = bytes; } + /** @hide */ public void addRxBytes(long bytes) { mRxBytes += bytes; } + /** @hide */ public void addTxBytes(long bytes) { mTxBytes += bytes; } + /** + * @return corresponding app Uid + */ public int getUid() { return mAppUid; } + /** + * @return rx bytes count + */ public long getRxBytes() { return mRxBytes; } + /** + * @return tx bytes count + */ public long getTxBytes() { return mTxBytes; } + /** @hide */ @Override public int describeContents() { return 0; } + /** @hide */ @Override public UidTraffic clone() { return new UidTraffic(mAppUid, mRxBytes, mTxBytes); } + /** @hide */ @Override public String toString() { return "UidTraffic{mAppUid=" + mAppUid + ", mRxBytes=" + mRxBytes + ", mTxBytes=" diff --git a/core/java/android/bluetooth/le/BluetoothLeUtils.java b/core/java/android/bluetooth/le/BluetoothLeUtils.java index 6381f557c1b2..ed50b09597bb 100644 --- a/core/java/android/bluetooth/le/BluetoothLeUtils.java +++ b/core/java/android/bluetooth/le/BluetoothLeUtils.java @@ -24,6 +24,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.UUID; /** * Helper class for Bluetooth LE utils. @@ -137,4 +138,21 @@ public class BluetoothLeUtils { } } + /** + * Compares two UUIDs with a UUID mask. + * + * @param data first {@link #UUID} to compare. + * @param uuid second {@link #UUID} to compare. + * @param mask mask {@link #UUID}. + * @return true if both UUIDs are equals when masked, false otherwise. + */ + static boolean maskedEquals(UUID data, UUID uuid, UUID mask) { + if (mask == null) { + return Objects.equals(data, uuid); + } + return (data.getLeastSignificantBits() & mask.getLeastSignificantBits()) + == (uuid.getLeastSignificantBits() & mask.getLeastSignificantBits()) + && (data.getMostSignificantBits() & mask.getMostSignificantBits()) + == (uuid.getMostSignificantBits() & mask.getMostSignificantBits()); + } } diff --git a/core/java/android/bluetooth/le/ScanFilter.java b/core/java/android/bluetooth/le/ScanFilter.java index 8ff018121ab0..b059193ae03f 100644 --- a/core/java/android/bluetooth/le/ScanFilter.java +++ b/core/java/android/bluetooth/le/ScanFilter.java @@ -28,8 +28,6 @@ import android.os.Parcel; import android.os.ParcelUuid; import android.os.Parcelable; -import com.android.internal.util.BitUtils; - import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -448,7 +446,7 @@ public final class ScanFilter implements Parcelable { // Check if the uuid pattern matches the particular service uuid. private static boolean matchesServiceUuid(UUID uuid, UUID mask, UUID data) { - return BitUtils.maskedEquals(data, uuid, mask); + return BluetoothLeUtils.maskedEquals(data, uuid, mask); } /** @@ -478,7 +476,7 @@ public final class ScanFilter implements Parcelable { // Check if the solicitation uuid pattern matches the particular service solicitation uuid. private static boolean matchesServiceSolicitationUuid(UUID solicitationUuid, UUID solicitationUuidMask, UUID data) { - return BitUtils.maskedEquals(data, solicitationUuid, solicitationUuidMask); + return BluetoothLeUtils.maskedEquals(data, solicitationUuid, solicitationUuidMask); } // Check whether the data pattern matches the parsed data. diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 635f58182b34..b677b6900d5c 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -313,7 +313,7 @@ public class Binder implements IBinder { * @hide */ @CriticalNative - public static final native boolean isHandlingTransaction(); + public static final native boolean isDirectlyHandlingTransaction(); /** * Return the Linux uid assigned to the process that sent the transaction @@ -323,7 +323,7 @@ public class Binder implements IBinder { * executing an incoming transaction. */ public static final int getCallingUidOrThrow() { - if (!isHandlingTransaction()) { + if (!isDirectlyHandlingTransaction()) { throw new IllegalStateException( "Thread is not in a binder transcation"); } diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index a0f86159d50b..eda369984120 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -5207,7 +5207,7 @@ public final class ContactsContract { @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public static @NonNull Map<String, List<ContentValues>> queryRawContactEntity( - @NonNull Context context, long contactId) { + @NonNull ContentResolver contentResolver, long contactId) { Uri uri = RawContactsEntity.CONTENT_URI; long realContactId = contactId; @@ -5225,7 +5225,7 @@ public final class ContactsContract { final String selection = Data.CONTACT_ID + "=?"; final String[] selectionArgs = new String[] {String.valueOf(realContactId)}; - entityIterator = RawContacts.newEntityIterator(context.getContentResolver().query( + entityIterator = RawContacts.newEntityIterator(contentResolver.query( uri, null, selection, selectionArgs, null)); if (entityIterator == null) { diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 8c63f38494ea..630851d126cc 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -12143,7 +12143,7 @@ public class BatteryStatsImpl extends BatteryStats { rxTimeMs = info.getControllerRxTimeMillis(); txTimeMs = info.getControllerTxTimeMillis(); energy = info.getControllerEnergyUsed(); - if (info.getUidTraffic() != null) { + if (!info.getUidTraffic().isEmpty()) { for (UidTraffic traffic : info.getUidTraffic()) { uidRxBytes.put(traffic.getUid(), traffic.getRxBytes()); uidTxBytes.put(traffic.getUid(), traffic.getTxBytes()); @@ -12294,10 +12294,10 @@ public class BatteryStatsImpl extends BatteryStats { long totalTxBytes = 0; long totalRxBytes = 0; - final UidTraffic[] uidTraffic = info.getUidTraffic(); - final int numUids = uidTraffic != null ? uidTraffic.length : 0; + final List<UidTraffic> uidTraffic = info.getUidTraffic(); + final int numUids = uidTraffic.size(); for (int i = 0; i < numUids; i++) { - final UidTraffic traffic = uidTraffic[i]; + final UidTraffic traffic = uidTraffic.get(i); final long rxBytes = traffic.getRxBytes() - mLastBluetoothActivityInfo.uidRxBytes.get( traffic.getUid()); final long txBytes = traffic.getTxBytes() - mLastBluetoothActivityInfo.uidTxBytes.get( @@ -12320,7 +12320,7 @@ public class BatteryStatsImpl extends BatteryStats { if ((totalTxBytes != 0 || totalRxBytes != 0) && (leftOverRxTimeMs != 0 || leftOverTxTimeMs != 0)) { for (int i = 0; i < numUids; i++) { - final UidTraffic traffic = uidTraffic[i]; + final UidTraffic traffic = uidTraffic.get(i); final int uid = traffic.getUid(); final long rxBytes = traffic.getRxBytes() - mLastBluetoothActivityInfo.uidRxBytes.get(uid); diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index 0d338072fa00..be9aaaf407db 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -641,7 +641,7 @@ static jboolean android_os_Parcel_hasFileDescriptorsInRange(JNIEnv* env, jclass Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { bool result; - status_t err = parcel->hasFileDescriptorsInRange(offset, length, result); + status_t err = parcel->hasFileDescriptorsInRange(offset, length, &result); if (err != NO_ERROR) { signalExceptionForError(env, clazz, err); return JNI_FALSE; diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 793b4eba788c..61b91ddaa2e7 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -959,8 +959,7 @@ static jint android_os_Binder_getCallingUid() return IPCThreadState::self()->getCallingUid(); } -static jboolean android_os_Binder_isHandlingTransaction() -{ +static jboolean android_os_Binder_isDirectlyHandlingTransaction() { return getCurrentServingCall() == BinderCallType::BINDER; } @@ -1056,6 +1055,7 @@ static void android_os_Binder_setExtension(JNIEnv* env, jobject obj, jobject ext // ---------------------------------------------------------------------------- +// clang-format off static const JNINativeMethod gBinderMethods[] = { /* name, signature, funcPtr */ // @CriticalNative @@ -1063,7 +1063,7 @@ static const JNINativeMethod gBinderMethods[] = { // @CriticalNative { "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid }, // @CriticalNative - { "isHandlingTransaction", "()Z", (void*)android_os_Binder_isHandlingTransaction }, + { "isDirectlyHandlingTransaction", "()Z", (void*)android_os_Binder_isDirectlyHandlingTransaction }, // @CriticalNative { "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity }, // @CriticalNative @@ -1088,6 +1088,7 @@ static const JNINativeMethod gBinderMethods[] = { { "getExtension", "()Landroid/os/IBinder;", (void*)android_os_Binder_getExtension }, { "setExtension", "(Landroid/os/IBinder;)V", (void*)android_os_Binder_setExtension }, }; +// clang-format on const char* const kBinderPathName = "android/os/Binder"; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index bd89578f4208..1418dbe0f849 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1976,6 +1976,14 @@ android:label="@string/permlab_uwb_ranging" android:protectionLevel="dangerous" /> + <!-- Required to be able to advertise and connect to nearby devices via Wi-Fi. + <p>Protection level: dangerous --> + <permission android:name="android.permission.NEARBY_WIFI_DEVICES" + android:permissionGroup="android.permission-group.UNDEFINED" + android:description="@string/permdesc_nearby_wifi_devices" + android:label="@string/permlab_nearby_wifi_devices" + android:protectionLevel="dangerous" /> + <!-- @SystemApi @TestApi Allows an application to suspend other apps, which will prevent the user from using them until they are unsuspended. @hide diff --git a/core/res/OWNERS b/core/res/OWNERS index 684202bdb29e..165dcad896c9 100644 --- a/core/res/OWNERS +++ b/core/res/OWNERS @@ -28,3 +28,6 @@ yamasani@google.com # Multiuser per-file res/xml/config_user_types.xml = file:/MULTIUSER_OWNERS + +# Car +per-file res/values/dimens_car.xml = file:/platform/packages/services/Car:/OWNERS
\ No newline at end of file diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a99a22009e3b..a350d14d92ab 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1488,6 +1488,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=120]--> <string name="permdesc_uwb_ranging">Allow the app to determine relative position between nearby Ultra-Wideband devices</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=50]--> + <string name="permlab_nearby_wifi_devices">interact with nearby Wi\u2011Fi devices</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=120]--> + <string name="permdesc_nearby_wifi_devices">Allows the app to advertise, connect, and determine the relative position of nearby Wi\u2011Fi devices</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_preferredPaymentInfo">Preferred NFC Payment Service Information</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> diff --git a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java index 5c8479406c03..d361da95a1b9 100644 --- a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java @@ -33,6 +33,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; + @RunWith(AndroidJUnit4.class) @SmallTest public class BluetoothPowerCalculatorTest { @@ -105,10 +107,10 @@ public class BluetoothPowerCalculatorTest { final BluetoothActivityEnergyInfo info = new BluetoothActivityEnergyInfo(1000, BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_ACTIVE, 7000, 5000, 0, reportedEnergyUc); - info.setUidTraffic(new UidTraffic[]{ - new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000), - new UidTraffic(APP_UID, 3000, 4000) - }); + info.setUidTraffic(new ArrayList<UidTraffic>(){{ + add(new UidTraffic(Process.BLUETOOTH_UID, 1000, 2000)); + add(new UidTraffic(APP_UID, 3000, 4000)); + }}); mStatsRule.getBatteryStats().updateBluetoothStateLocked(info, consumedEnergyUc, 1000, 1000); } diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index c068963adc92..ed8cdb941792 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -5203,21 +5203,6 @@ public class AudioManager { } } - /** - * @hide - * Notifies AudioService that it is connected to an A2DP device that supports absolute volume, - * so that AudioService can send volume change events to the A2DP device, rather than handling - * them. - */ - public void avrcpSupportsAbsoluteVolume(String address, boolean support) { - final IAudioService service = getService(); - try { - service.avrcpSupportsAbsoluteVolume(address, support); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - /** * {@hide} */ diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 71912800e0d7..dd44fdf1e8c4 100755 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -171,8 +171,6 @@ interface IAudioService { int getEncodedSurroundMode(int targetSdkVersion); - oneway void avrcpSupportsAbsoluteVolume(String address, boolean support); - void setSpeakerphoneOn(IBinder cb, boolean on); boolean isSpeakerphoneOn(); diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index 95dc66727730..b6413773046f 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -16,6 +16,9 @@ per-file SensorPrivacyService.java = file:platform/frameworks/native:/libs/senso # ServiceWatcher per-file ServiceWatcher.java = sooniln@google.com +# Health +per-file BatteryService.java = file:platform/hardware/interfaces:/health/aidl/OWNERS + per-file *Alarm* = file:/apex/jobscheduler/OWNERS per-file *AppOp* = file:/core/java/android/permission/OWNERS per-file *Battery* = file:/BATTERY_STATS_OWNERS diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java index a03425c0bb75..b48e21e4e2c6 100644 --- a/services/core/java/com/android/server/VpnManagerService.java +++ b/services/core/java/com/android/server/VpnManagerService.java @@ -681,7 +681,7 @@ public class VpnManagerService extends IVpnManager.Stub { intentFilter = new IntentFilter(); intentFilter.addAction(LockdownVpnTracker.ACTION_LOCKDOWN_RESET); mUserAllContext.registerReceiver( - mIntentReceiver, intentFilter, NETWORK_STACK, mHandler); + mIntentReceiver, intentFilter, NETWORK_STACK, mHandler, Context.RECEIVER_EXPORTED); } private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index a2fec2753340..a29a49cb07d8 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -4906,7 +4906,9 @@ public final class ActiveServices { sr.setProcess(null, null, 0, null); sr.isolatedProc = null; sr.executeNesting = 0; - sr.forceClearTracker(); + synchronized (mAm.mProcessStats.mLock) { + sr.forceClearTracker(); + } if (mDestroyingServices.remove(sr)) { if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "killServices remove destroying " + sr); } @@ -5056,7 +5058,9 @@ public final class ActiveServices { i--; ServiceRecord sr = mDestroyingServices.get(i); if (sr.app == app) { - sr.forceClearTracker(); + synchronized (mAm.mProcessStats.mLock) { + sr.forceClearTracker(); + } mDestroyingServices.remove(i); if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "killServices remove destroying " + sr); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 8e1b06b8ca09..d75f21c4ef85 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -6136,6 +6136,11 @@ public class AudioService extends IAudioService.Stub if (pkgName == null) { pkgName = ""; } + if (device.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) { + avrcpSupportsAbsoluteVolume(device.getAddress(), + deviceVolumeBehavior == AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + return; + } int audioSystemDeviceOut = AudioDeviceInfo.convertDeviceTypeToInternalDevice( device.getType()); @@ -7792,7 +7797,7 @@ public class AudioService extends IAudioService.Stub } } - public void avrcpSupportsAbsoluteVolume(String address, boolean support) { + private void avrcpSupportsAbsoluteVolume(String address, boolean support) { // address is not used for now, but may be used when multiple a2dp devices are supported sVolumeLogger.log(new AudioEventLogger.StringEvent("avrcpSupportsAbsoluteVolume addr=" + address + " support=" + support)); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 565c9ae2142c..243a336b31f2 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1270,6 +1270,9 @@ public class Vpn { capsBuilder.addCapability(NET_CAPABILITY_NOT_METERED); } + capsBuilder.setUnderlyingNetworks((mConfig.underlyingNetworks != null) + ? Arrays.asList(mConfig.underlyingNetworks) : null); + mNetworkCapabilities = capsBuilder.build(); mNetworkAgent = new NetworkAgent(mContext, mLooper, NETWORKTYPE /* logtag */, mNetworkCapabilities, lp, @@ -1290,8 +1293,6 @@ public class Vpn { } finally { Binder.restoreCallingIdentity(token); } - mNetworkAgent.setUnderlyingNetworks((mConfig.underlyingNetworks != null) - ? Arrays.asList(mConfig.underlyingNetworks) : null); updateState(DetailedState.CONNECTED, "agentConnect"); } diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index d66d7ee99f2e..329a69634f71 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -512,7 +512,10 @@ public class DisplayModeDirector { */ public void setShouldAlwaysRespectAppRequestedMode(boolean enabled) { synchronized (mLock) { - mAlwaysRespectAppRequest = enabled; + if (mAlwaysRespectAppRequest != enabled) { + mAlwaysRespectAppRequest = enabled; + notifyDesiredDisplayModeSpecsChangedLocked(); + } } } diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index dab980a9e4b2..7bea01820a03 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -213,6 +213,7 @@ final class DefaultPermissionGrantPolicy { NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_CONNECT); NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_SCAN); NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.UWB_RANGING); + NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.NEARBY_WIFI_DEVICES); } private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1; diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 61770ea1c1c2..ba3123431b3c 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1601,7 +1601,7 @@ public class StatsPullAtomService extends SystemService { int pullBluetoothBytesTransferLocked(int atomTag, List<StatsEvent> pulledData) { BluetoothActivityEnergyInfo info = fetchBluetoothData(); - if (info == null || info.getUidTraffic() == null) { + if (info == null) { return StatsManager.PULL_SKIP; } for (UidTraffic traffic : info.getUidTraffic()) { diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 5540cc567ed2..4857fb3faa76 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1547,7 +1547,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio // activity as it could lead to incorrect display metrics. For ex, IME services // expect their config to match the config of the display with the IME window // showing. + // If the configuration has been overridden by previous activity, empty it. mIsActivityConfigOverrideAllowed = false; + unregisterActivityConfigurationListener(); break; default: break; diff --git a/services/tests/servicestests/src/com/android/server/OWNERS b/services/tests/servicestests/src/com/android/server/OWNERS index f1402ead3866..6a7d298514c5 100644 --- a/services/tests/servicestests/src/com/android/server/OWNERS +++ b/services/tests/servicestests/src/com/android/server/OWNERS @@ -3,4 +3,5 @@ per-file *AppOp* = file:/core/java/android/permission/OWNERS per-file *Bluetooth* = file:/core/java/android/bluetooth/OWNERS per-file *Gnss* = file:/services/core/java/com/android/server/location/OWNERS per-file *Network* = file:/services/core/java/com/android/server/net/OWNERS +per-file BatteryServiceTest.java = file:platform/hardware/interfaces:/health/aidl/OWNERS per-file GestureLauncherServiceTest.java = file:platform/packages/apps/EmergencyInfo:/OWNERS diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 255a61266ebf..a1bed29dec70 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -2945,7 +2945,12 @@ public class TelephonyManager { * currently in use on the device for data transmission. * * If this object has been created with {@link #createForSubscriptionId}, applies to the given - * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} + * subId. Otherwise, applies to {@link SubscriptionManager#getActiveDataSubscriptionId()}. + * + * Note: Before {@link SubscriptionManager#getActiveDataSubscriptionId()} was introduced in API + * level 30, it was applied to {@link SubscriptionManager#getDefaultDataSubscriptionId()} which + * may be different now from {@link SubscriptionManager#getActiveDataSubscriptionId()}, e.g. + * when opportunistic network is providing cellular internet connection to the user. * * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). |