Merge "Fix javadoc which was broken with renames" into rvc-dev
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 8f3cb93..45d6fed 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -1066,8 +1066,9 @@
* <li>One Jpeg ImageReader, any resolution: the camera device is
* allowed to slow down JPEG output speed by 50% if there is any ongoing offline
* session.</li>
- * <li>One ImageWriter surface of private format, any resolution if the device supports
- * PRIVATE_REPROCESSING capability</li>
+ * <li>If the device supports PRIVATE_REPROCESSING, one pair of ImageWriter/ImageReader
+ * surfaces of private format, with the same resolution that is larger or equal to
+ * the JPEG ImageReader resolution above.</li>
* </ol>
* </li>
* <li>Alternatively, the active camera session above can be replaced by an legacy
diff --git a/core/java/com/android/internal/compat/CompatibilityChangeInfo.java b/core/java/com/android/internal/compat/CompatibilityChangeInfo.java
index ab890d2..9ba0259 100644
--- a/core/java/com/android/internal/compat/CompatibilityChangeInfo.java
+++ b/core/java/com/android/internal/compat/CompatibilityChangeInfo.java
@@ -93,6 +93,43 @@
dest.writeString(mDescription);
}
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("CompatibilityChangeInfo(")
+ .append(getId());
+ if (getName() != null) {
+ sb.append("; name=").append(getName());
+ }
+ if (getEnableAfterTargetSdk() != -1) {
+ sb.append("; enableAfterTargetSdk=").append(getEnableAfterTargetSdk());
+ }
+ if (getDisabled()) {
+ sb.append("; disabled");
+ }
+ if (getLoggingOnly()) {
+ sb.append("; loggingOnly");
+ }
+ return sb.append(")").toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || !(o instanceof CompatibilityChangeInfo)) {
+ return false;
+ }
+ CompatibilityChangeInfo that = (CompatibilityChangeInfo) o;
+ return this.mChangeId == that.mChangeId
+ && this.mName.equals(that.mName)
+ && this.mEnableAfterTargetSdk == that.mEnableAfterTargetSdk
+ && this.mDisabled == that.mDisabled
+ && this.mLoggingOnly == that.mLoggingOnly
+ && this.mDescription.equals(that.mDescription);
+
+ }
+
public static final Parcelable.Creator<CompatibilityChangeInfo> CREATOR =
new Parcelable.Creator<CompatibilityChangeInfo>() {
diff --git a/core/java/com/android/internal/compat/IPlatformCompat.aidl b/core/java/com/android/internal/compat/IPlatformCompat.aidl
index 523ed6f..6408def 100644
--- a/core/java/com/android/internal/compat/IPlatformCompat.aidl
+++ b/core/java/com/android/internal/compat/IPlatformCompat.aidl
@@ -222,6 +222,14 @@
CompatibilityChangeInfo[] listAllChanges();
/**
+ * List the compatibility changes that should be present in the UI.
+ * Filters out certain changes like e.g. logging only.
+ *
+ * @return An array of {@link CompatChangeInfo}.
+ */
+ CompatibilityChangeInfo[] listUIChanges();
+
+ /**
* Get an instance that can determine whether a changeid can be overridden for a package name.
*/
IOverrideValidator getOverrideValidator();
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f7400bd..2c9d6b3 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1109,13 +1109,12 @@
grants your app this permission. If you don't need this permission, be sure your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
targetSdkVersion}</a> is 4 or higher.
- <p>Protection level: dangerous
+ <p>Protection level: normal
-->
<permission android:name="android.permission.READ_PHONE_STATE"
- android:permissionGroup="android.permission-group.UNDEFINED"
android:label="@string/permlab_readPhoneState"
android:description="@string/permdesc_readPhoneState"
- android:protectionLevel="dangerous" />
+ android:protectionLevel="normal" />
<!-- Allows read access to the device's phone number(s). This is a subset of the capabilities
granted by {@link #READ_PHONE_STATE} but is exposed to instant applications.
diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java
index 8519b00..44f571a 100644
--- a/services/core/java/com/android/server/compat/PlatformCompat.java
+++ b/services/core/java/com/android/server/compat/PlatformCompat.java
@@ -28,6 +28,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManagerInternal;
import android.os.Binder;
+import android.os.Build;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Slog;
@@ -44,6 +45,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.Arrays;
/**
* System server internal API for gating and reporting compatibility changes.
@@ -56,6 +58,9 @@
private final ChangeReporter mChangeReporter;
private final CompatConfig mCompatConfig;
+ private static int sMinTargetSdk = Build.VERSION_CODES.P;
+ private static int sMaxTargetSdk = Build.VERSION_CODES.Q;
+
public PlatformCompat(Context context) {
mContext = context;
mChangeReporter = new ChangeReporter(
@@ -220,6 +225,12 @@
return mCompatConfig.dumpChanges();
}
+ @Override
+ public CompatibilityChangeInfo[] listUIChanges() {
+ return Arrays.stream(listAllChanges()).filter(
+ x -> isShownInUI(x)).toArray(CompatibilityChangeInfo[]::new);
+ }
+
/**
* Check whether the change is known to the compat config.
*
@@ -339,4 +350,17 @@
checkCompatChangeReadPermission();
checkCompatChangeLogPermission();
}
+
+ private boolean isShownInUI(CompatibilityChangeInfo change) {
+ if (change.getLoggingOnly()) {
+ return false;
+ }
+ if (change.getEnableAfterTargetSdk() != 0) {
+ if (change.getEnableAfterTargetSdk() < sMinTargetSdk
+ || change.getEnableAfterTargetSdk() > sMaxTargetSdk) {
+ return false;
+ }
+ }
+ return true;
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 9a92832..a1902bb 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -2476,9 +2476,12 @@
boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener,
int waitingId) {
- boolean willSync = false;
- if (!isVisible()) {
- return willSync;
+ boolean willSync = true;
+
+ // If we are invisible, no need to sync, likewise if we are already engaged in a sync,
+ // we can't support overlapping syncs on a single container yet.
+ if (!isVisible() || mWaitingListener != null) {
+ return false;
}
mUsingBLASTSyncTransaction = true;
diff --git a/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java b/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java
index 53b90f2..72d8525 100644
--- a/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java
+++ b/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java
@@ -30,10 +30,12 @@
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
+import android.os.Build;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.compat.AndroidBuildClassifier;
+import com.android.internal.compat.CompatibilityChangeInfo;
import com.android.server.LocalServices;
import org.junit.Before;
@@ -78,6 +80,47 @@
}
@Test
+ public void testListAllChanges() {
+ mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)
+ .addEnabledChangeWithId(1L)
+ .addDisabledChangeWithIdAndName(2L, "change2")
+ .addTargetSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "description")
+ .addTargetSdkChangeWithId(Build.VERSION_CODES.P, 4L)
+ .addTargetSdkChangeWithId(Build.VERSION_CODES.Q, 5L)
+ .addTargetSdkChangeWithId(Build.VERSION_CODES.R, 6L)
+ .addLoggingOnlyChangeWithId(7L)
+ .build();
+ mPlatformCompat = new PlatformCompat(mContext, mCompatConfig);
+ assertThat(mPlatformCompat.listAllChanges()).asList().containsExactly(
+ new CompatibilityChangeInfo(1L, "", -1, false, false, ""),
+ new CompatibilityChangeInfo(2L, "change2", -1, true, false, ""),
+ new CompatibilityChangeInfo(3L, "", Build.VERSION_CODES.O, false, false,
+ "description"),
+ new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, false, false, ""),
+ new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, false, false, ""),
+ new CompatibilityChangeInfo(6L, "", Build.VERSION_CODES.R, false, false, ""),
+ new CompatibilityChangeInfo(7L, "", -1, false, true, ""));
+ }
+
+ public void testListUIChanges() {
+ mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)
+ .addEnabledChangeWithId(1L)
+ .addDisabledChangeWithIdAndName(2L, "change2")
+ .addTargetSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "description")
+ .addTargetSdkChangeWithId(Build.VERSION_CODES.P, 4L)
+ .addTargetSdkChangeWithId(Build.VERSION_CODES.Q, 5L)
+ .addTargetSdkChangeWithId(Build.VERSION_CODES.R, 6L)
+ .addLoggingOnlyChangeWithId(7L)
+ .build();
+ mPlatformCompat = new PlatformCompat(mContext, mCompatConfig);
+ assertThat(mPlatformCompat.listUIChanges()).asList().containsExactly(
+ new CompatibilityChangeInfo(1L, "", -1, false, false, ""),
+ new CompatibilityChangeInfo(2L, "change2", -1, true, false, ""),
+ new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, false, false, ""),
+ new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, false, false, ""));
+ }
+
+ @Test
public void testRegisterListenerToSameIdThrows() throws Exception {
// Registering a listener to change 1 is successful.
mPlatformCompat.registerListener(1, mListener1);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
index 8019e9d..71c837e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java
@@ -550,6 +550,9 @@
final Task task = createTaskInStack(stackController1, 0 /* userId */);
final ITaskOrganizer organizer = registerMockOrganizer();
+ spyOn(task);
+ doReturn(true).when(task).isVisible();
+
BLASTSyncEngine bse = new BLASTSyncEngine();
BLASTSyncEngine.TransactionReadyListener transactionListener =
@@ -564,6 +567,35 @@
}
@Test
+ public void testOverlappingBLASTCallback() throws RemoteException {
+ final ActivityStack stackController1 = createTaskStackOnDisplay(mDisplayContent);
+ final Task task = createTaskInStack(stackController1, 0 /* userId */);
+ final ITaskOrganizer organizer = registerMockOrganizer();
+
+ spyOn(task);
+ doReturn(true).when(task).isVisible();
+ final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window");
+ makeWindowVisible(w);
+
+ BLASTSyncEngine bse = new BLASTSyncEngine();
+
+ BLASTSyncEngine.TransactionReadyListener transactionListener =
+ mock(BLASTSyncEngine.TransactionReadyListener.class);
+
+ int id = bse.startSyncSet(transactionListener);
+ assertEquals(true, bse.addToSyncSet(id, task));
+ bse.setReady(id);
+
+ int id2 = bse.startSyncSet(transactionListener);
+ // We should be rejected from the second sync since we are already
+ // in one.
+ assertEquals(false, bse.addToSyncSet(id2, task));
+ w.finishDrawing(null);
+ assertEquals(true, bse.addToSyncSet(id2, task));
+ bse.setReady(id2);
+ }
+
+ @Test
public void testBLASTCallbackWithWindow() {
final ActivityStack stackController1 = createTaskStackOnDisplay(mDisplayContent);
final Task task = createTaskInStack(stackController1, 0 /* userId */);
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index b897725..f0f9721 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -437,8 +437,9 @@
/**
* Returns whether the caller can read phone numbers.
*
- * <p>Besides apps with the ability to read phone state per {@link #checkReadPhoneState}, the
- * default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS can also read phone numbers.
+ * <p>Besides apps with the ability to read phone state per {@link #checkReadPhoneState}
+ * (only prior to R), the default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS
+ * can also read phone numbers.
*/
public static boolean checkCallingOrSelfReadPhoneNumber(
Context context, int subId, String callingPackage, @Nullable String callingFeatureId,
@@ -451,8 +452,9 @@
/**
* Returns whether the caller can read phone numbers.
*
- * <p>Besides apps with the ability to read phone state per {@link #checkReadPhoneState}, the
- * default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS can also read phone numbers.
+ * <p>Besides apps with the ability to read phone state per {@link #checkReadPhoneState}
+ * (only prior to R), the default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS
+ * can also read phone numbers.
*/
@VisibleForTesting
public static boolean checkReadPhoneNumber(
@@ -468,12 +470,15 @@
// NOTE(b/73308711): If an app has one of the following AppOps bits explicitly revoked, they
// will be denied access, even if they have another permission and AppOps bit if needed.
- // First, check if we can read the phone state.
+ // First, check if we can read the phone state and the SDK version is below R.
try {
- return checkReadPhoneState(
- context, subId, pid, uid, callingPackage, callingFeatureId,
- message);
- } catch (SecurityException readPhoneStateSecurityException) {
+ ApplicationInfo info = context.getPackageManager().getApplicationInfoAsUser(
+ callingPackage, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
+ if (info.targetSdkVersion <= Build.VERSION_CODES.Q) {
+ return checkReadPhoneState(
+ context, subId, pid, uid, callingPackage, callingFeatureId, message);
+ }
+ } catch (SecurityException | PackageManager.NameNotFoundException e) {
}
// Can be read with READ_SMS too.
try {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 8cf596c..fbd69da8 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -4328,14 +4328,18 @@
/**
* Returns the phone number string for line 1, for example, the MSISDN
- * for a GSM phone. Return null if it is unavailable.
+ * for a GSM phone for a particular subscription. Return null if it is unavailable.
+ * <p>
+ * The default SMS app can also use this.
*
* <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE},
* {@link android.Manifest.permission#READ_SMS READ_SMS},
* {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS},
* that the caller is the default SMS app,
- * or that the caller has carrier privileges (see {@link #hasCarrierPrivileges}).
+ * or that the caller has carrier privileges (see {@link #hasCarrierPrivileges})
+ * for any API level.
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ * for apps targeting SDK API level 29 and below.
*/
@SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges or default SMS app
@RequiresPermission(anyOf = {
@@ -4353,6 +4357,15 @@
* <p>
* The default SMS app can also use this.
*
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_SMS READ_SMS},
+ * {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS},
+ * that the caller is the default SMS app,
+ * or that the caller has carrier privileges (see {@link #hasCarrierPrivileges})
+ * for any API level.
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ * for apps targeting SDK API level 29 and below.
+ *
* @param subId whose phone number for line 1 is returned
* @hide
*/
@@ -4533,25 +4546,50 @@
}
/**
- * Returns the MSISDN string.
- * for a GSM phone. Return null if it is unavailable.
+ * Returns the MSISDN string for a GSM phone. Return null if it is unavailable.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_SMS READ_SMS},
+ * {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS},
+ * that the caller is the default SMS app,
+ * or that the caller has carrier privileges (see {@link #hasCarrierPrivileges})
+ * for any API level.
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ * for apps targeting SDK API level 29 and below.
*
* @hide
*/
- @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PHONE_STATE,
+ android.Manifest.permission.READ_SMS,
+ android.Manifest.permission.READ_PHONE_NUMBERS
+ })
@UnsupportedAppUsage
public String getMsisdn() {
return getMsisdn(getSubId());
}
/**
- * Returns the MSISDN string.
- * for a GSM phone. Return null if it is unavailable.
+ * Returns the MSISDN string for a GSM phone. Return null if it is unavailable.
*
* @param subId for which msisdn is returned
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#READ_SMS READ_SMS},
+ * {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS},
+ * that the caller is the default SMS app,
+ * or that the caller has carrier privileges (see {@link #hasCarrierPrivileges})
+ * for any API level.
+ * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ * for apps targeting SDK API level 29 and below.
+ *
* @hide
*/
- @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ @RequiresPermission(anyOf = {
+ android.Manifest.permission.READ_PHONE_STATE,
+ android.Manifest.permission.READ_SMS,
+ android.Manifest.permission.READ_PHONE_NUMBERS
+ })
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public String getMsisdn(int subId) {
try {