diff options
40 files changed, 810 insertions, 131 deletions
diff --git a/Android.bp b/Android.bp index 0f9977cb65b3..c22dafb670a3 100644 --- a/Android.bp +++ b/Android.bp @@ -289,6 +289,14 @@ java_defaults { "staledataclass-annotation-processor", "error_prone_android_framework", ], + // Exports needed for staledataclass-annotation-processor, see b/139342589. + javacflags: [ + "-J--add-modules=jdk.compiler", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", + ], required: [ // TODO(b/120066492): remove default_television.xml when the build system // propagates "required" properly. diff --git a/apct-tests/perftests/core/src/android/opengl/perftests/MatrixPerfTest.java b/apct-tests/perftests/core/src/android/opengl/perftests/MatrixPerfTest.java new file mode 100644 index 000000000000..b29614817ee2 --- /dev/null +++ b/apct-tests/perftests/core/src/android/opengl/perftests/MatrixPerfTest.java @@ -0,0 +1,397 @@ +/* + * Copyright (C) 2022 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.opengl.perftests; + +import android.opengl.Matrix; +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; + +import androidx.test.filters.LargeTest; + +import org.junit.Rule; +import org.junit.Test; + +import java.util.Random; + +@LargeTest +public class MatrixPerfTest { + @Rule + public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Rule + public float[] array = new float[48]; + + @Rule + public float[] bigArray = new float[16 * 1024 * 1024]; + + + @Test + public void testMultiplyMM() { + Random rng = new Random(); + for (int i = 0; i < 32; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMM(array, 32, array, 16, array, 0); + } + } + + @Test + public void testMultiplyMMLeftOverlapResult() { + Random rng = new Random(); + for (int i = 0; i < 32; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMM(array, 16, array, 16, array, 0); + } + } + + @Test + public void testMultiplyMMRightOverlapResult() { + Random rng = new Random(); + for (int i = 0; i < 32; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMM(array, 0, array, 16, array, 0); + } + } + + @Test + public void testMultiplyMMAllOverlap() { + Random rng = new Random(); + for (int i = 0; i < 16; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMM(array, 0, array, 0, array, 0); + } + } + + @Test + public void testMultiplyMMOutputBigArray() { + Random rng = new Random(); + for (int i = 0; i < 32; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMM(bigArray, 1024, array, 16, array, 0); + } + } + + @Test + public void testMultiplyMMAllBigArray() { + Random rng = new Random(); + for (int i = 0; i < 32; i++) { + bigArray[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMM(bigArray, 1024, bigArray, 16, bigArray, 0); + } + } + + @Test + public void testMultiplyMV() { + Random rng = new Random(); + for (int i = 0; i < 20; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMV(array, 20, array, 4, array, 0); + } + } + + @Test + public void testMultiplyMVLeftOverlapResult() { + Random rng = new Random(); + for (int i = 0; i < 20; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMV(array, 4, array, 4, array, 0); + } + } + + @Test + public void testMultiplyMVRightOverlapResult() { + Random rng = new Random(); + for (int i = 0; i < 32; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMV(array, 0, array, 16, array, 0); + } + } + + @Test + public void testMultiplyMVAllOverlap() { + Random rng = new Random(); + for (int i = 0; i < 16; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMV(array, 0, array, 0, array, 0); + } + } + + @Test + public void testMultiplyMVOutputBigArray() { + Random rng = new Random(); + for (int i = 0; i < 20; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMV(bigArray, 1024, array, 16, array, 0); + } + } + + @Test + public void testMultiplyMVAllBigArray() { + Random rng = new Random(); + for (int i = 0; i < 20; i++) { + bigArray[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.multiplyMV(bigArray, 1024, bigArray, 16, bigArray, 0); + } + } + + @Test + public void testTransposeM() { + Random rng = new Random(); + for (int i = 0; i < 16; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.transposeM(array, 16, array, 0); + } + } + + @Test + public void testInvertM() { + // non-singular matrix + array[ 0] = 0.814f; + array[ 1] = 4.976f; + array[ 2] = -3.858f; + array[ 3] = 7.206f; + array[ 4] = 5.112f; + array[ 5] = -2.420f; + array[ 6] = 8.791f; + array[ 7] = 6.426f; + array[ 8] = 2.945f; + array[ 9] = 1.801f; + array[10] = -2.594f; + array[11] = 2.663f; + array[12] = -5.003f; + array[13] = -4.188f; + array[14] = 3.340f; + array[15] = -1.235f; + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.invertM(array, 16, array, 0); + } + } + + @Test + public void testOrthoM() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.orthoM(array, 0, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); + } + } + + @Test + public void testFrustumM() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.frustumM(array, 0, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); + } + } + + @Test + public void testPerspectiveM() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.perspectiveM(array, 0, 45.0f, 1.0f, 1.0f, 100.0f); + } + } + + @Test + public void testLength() { + Random rng = new Random(); + for (int i = 0; i < 3; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.length(array[0], array[1], array[2]); + } + } + + @Test + public void testSetIdentityM() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.setIdentityM(array, 0); + } + } + + @Test + public void testScaleM() { + Random rng = new Random(); + for (int i = 0; i < 19; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.scaleM(array, 19, array, 0, array[16], array[17], array[18]); + } + } + + @Test + public void testScaleMInPlace() { + Random rng = new Random(); + for (int i = 0; i < 19; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.scaleM(array, 0, array[16], array[17], array[18]); + } + } + + @Test + public void testTranslateM() { + Random rng = new Random(); + for (int i = 0; i < 19; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.translateM(array, 19, array, 0, array[16], array[17], array[18]); + } + } + + @Test + public void testTranslateMInPlace() { + Random rng = new Random(); + for (int i = 0; i < 19; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.translateM(array, 0, array[16], array[17], array[18]); + } + } + + @Test + public void testRotateM() { + Random rng = new Random(); + for (int i = 0; i < 20; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.rotateM(array, 20, array, 0, array[16], array[17], array[18], array[19]); + } + } + + @Test + public void testRotateMInPlace() { + Random rng = new Random(); + for (int i = 0; i < 20; i++) { + array[i] = rng.nextFloat(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.rotateM(array, 0, array[16], array[17], array[18], array[19]); + } + } + + @Test + public void testSetRotateM() { + Random rng = new Random(); + array[0] = rng.nextFloat() * 90.0f; + array[1] = rng.nextFloat() + 0.5f; + array[2] = rng.nextFloat() + 0.5f; + array[3] = rng.nextFloat() + 0.5f; + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.setRotateM(array, 4, array[0], array[1], array[2], array[3]); + } + } + + @Test + public void testSetRotateEulerM() { + Random rng = new Random(); + array[0] = rng.nextFloat() * 90.0f; + array[1] = rng.nextFloat() * 90.0f; + array[2] = rng.nextFloat() * 90.0f; + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.setRotateEulerM(array, 3, array[0], array[1], array[2]); + } + } + + @Test + public void testSetLookAtM() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Matrix.setLookAtM(array, 9, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f); + } + } +} diff --git a/core/api/current.txt b/core/api/current.txt index 644a194f6ed1..05e2a9aa7286 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -4415,6 +4415,7 @@ package android.app { method public void readFromParcel(android.os.Parcel); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.app.ActivityManager.MemoryInfo> CREATOR; + field public long advertisedMem; field public long availMem; field public boolean lowMemory; field public long threshold; diff --git a/core/java/android/accessibilityservice/OWNERS b/core/java/android/accessibilityservice/OWNERS index a31cfae995b2..fb06e236dd8a 100644 --- a/core/java/android/accessibilityservice/OWNERS +++ b/core/java/android/accessibilityservice/OWNERS @@ -1,4 +1,6 @@ -svetoslavganov@google.com pweaver@google.com -rhedjao@google.com ryanlwlin@google.com +danielnorman@google.com +sallyyuen@google.com +aarmaly@google.com +fuego@google.com diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 5d1d225f4d2d..6f9a98d8313f 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -29,6 +29,7 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; @@ -2813,6 +2814,15 @@ public class ActivityManager { */ public static class MemoryInfo implements Parcelable { /** + * The advertised memory of the system, as the end user would encounter in a retail display + * environment. This value might be different from {@code totalMem}. This could be due to + * many reasons. For example, the ODM could reserve part of the memory for the Trusted + * Execution Environment (TEE) which the kernel doesn't have access or knowledge about it. + */ + @SuppressLint("MutableBareField") + public long advertisedMem; + + /** * The available memory on the system. This number should not * be considered absolute: due to the nature of the kernel, a significant * portion of this memory is actually in use and needed for the overall @@ -2861,6 +2871,7 @@ public class ActivityManager { } public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(advertisedMem); dest.writeLong(availMem); dest.writeLong(totalMem); dest.writeLong(threshold); @@ -2872,6 +2883,7 @@ public class ActivityManager { } public void readFromParcel(Parcel source) { + advertisedMem = source.readLong(); availMem = source.readLong(); totalMem = source.readLong(); threshold = source.readLong(); diff --git a/core/java/android/app/OWNERS b/core/java/android/app/OWNERS index 068304d75910..f3fc46869916 100644 --- a/core/java/android/app/OWNERS +++ b/core/java/android/app/OWNERS @@ -29,7 +29,7 @@ per-file ProfilerInfo* = file:/services/core/java/com/android/server/am/OWNERS per-file Service* = file:/services/core/java/com/android/server/am/OWNERS per-file SystemServiceRegistry.java = file:/services/core/java/com/android/server/am/OWNERS per-file *UserSwitchObserver* = file:/services/core/java/com/android/server/am/OWNERS -per-file UiAutomation.java = file:/services/accessibility/OWNERS +per-file UiAutomation* = file:/services/accessibility/OWNERS per-file GameManager* = file:/GAME_MANAGER_OWNERS per-file GameState* = file:/GAME_MANAGER_OWNERS per-file IGameManager* = file:/GAME_MANAGER_OWNERS diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index edfcb3d6f12a..d5c3de146015 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -54,6 +54,7 @@ import android.system.ErrnoException; import android.system.Os; import android.system.StructStat; import android.text.TextUtils; +import android.util.DataUnit; import android.util.Log; import android.util.Slog; import android.webkit.MimeTypeMap; @@ -83,6 +84,7 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; @@ -1309,6 +1311,85 @@ public final class FileUtils { return val * pow; } + private static long toBytes(long value, String unit) { + unit = unit.toUpperCase(); + + if (List.of("B").contains(unit)) { + return value; + } + + if (List.of("K", "KB").contains(unit)) { + return DataUnit.KILOBYTES.toBytes(value); + } + + if (List.of("M", "MB").contains(unit)) { + return DataUnit.MEGABYTES.toBytes(value); + } + + if (List.of("G", "GB").contains(unit)) { + return DataUnit.GIGABYTES.toBytes(value); + } + + if (List.of("KI", "KIB").contains(unit)) { + return DataUnit.KIBIBYTES.toBytes(value); + } + + if (List.of("MI", "MIB").contains(unit)) { + return DataUnit.MEBIBYTES.toBytes(value); + } + + if (List.of("GI", "GIB").contains(unit)) { + return DataUnit.GIBIBYTES.toBytes(value); + } + + return Long.MIN_VALUE; + } + + /** + * @param fmtSize The string that contains the size to be parsed. The + * expected format is: + * + * <p>"^((\\s*[-+]?[0-9]+)\\s*(B|K|KB|M|MB|G|GB|Ki|KiB|Mi|MiB|Gi|GiB)\\s*)$" + * + * <p>For example: 10Kb, 500GiB, 100mb. The unit is not case sensitive. + * + * @return the size in bytes. If {@code fmtSize} has invalid format, it + * returns {@link Long#MIN_VALUE}. + * @hide + */ + public static long parseSize(@Nullable String fmtSize) { + if (fmtSize == null || fmtSize.isBlank()) { + return Long.MIN_VALUE; + } + + int sign = 1; + fmtSize = fmtSize.trim(); + char first = fmtSize.charAt(0); + if (first == '-' || first == '+') { + if (first == '-') { + sign = -1; + } + + fmtSize = fmtSize.replace(first + "", ""); + } + + int index = 0; + // Find the last index of the value in fmtSize. + while (index < fmtSize.length() && Character.isDigit(fmtSize.charAt(index))) { + index++; + } + + // Check if number and units are present. + if (index == 0 || index == fmtSize.length()) { + return Long.MIN_VALUE; + } + + long value = sign * Long.valueOf(fmtSize.substring(0, index)); + String unit = fmtSize.substring(index).trim(); + + return toBytes(value, unit); + } + /** * Closes the given object quietly, ignoring any checked exceptions. Does * nothing if the given object is {@code null}. diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 56652f57e6f1..a6ae663dabb0 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -560,7 +560,9 @@ public final class Parcel { */ public final void recycle() { if (mRecycled) { - Log.w(TAG, "Recycle called on unowned Parcel. (recycle twice?)", mStack); + Log.w(TAG, "Recycle called on unowned Parcel. (recycle twice?) Here: " + + Log.getStackTraceString(new Throwable()) + + " Original recycle call (if DEBUG_RECYCLE): ", mStack); } mRecycled = true; diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index e06e7326a860..b3afaecca849 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -26,6 +26,7 @@ import android.annotation.TestApi; import android.annotation.UptimeMillisLong; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build.VERSION_CODES; +import android.sysprop.MemoryProperties; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -1336,6 +1337,24 @@ public class Process { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public static final native void sendSignalQuiet(int pid, int signal); + /** + * @return The advertised memory of the system, as the end user would encounter in a retail + * display environment. If the advertised memory is not defined, it returns + * {@code getTotalMemory()} rounded. + * + * @hide + */ + public static final long getAdvertisedMem() { + String formatSize = MemoryProperties.memory_ddr_size().orElse("0KB"); + long memSize = FileUtils.parseSize(formatSize); + + if (memSize == Long.MIN_VALUE) { + return FileUtils.roundStorageSize(getTotalMemory()); + } + + return memSize; + } + /** @hide */ @UnsupportedAppUsage public static final native long getFreeMemory(); diff --git a/core/java/android/text/OWNERS b/core/java/android/text/OWNERS index 0b51b2d90b79..a6be687ab4c9 100644 --- a/core/java/android/text/OWNERS +++ b/core/java/android/text/OWNERS @@ -1,4 +1,10 @@ set noparent +halilibo@google.com +haoyuchang@google.com +justinghan@google.com +klippenstein@google.com +nona@google.com +seanmcq@google.com siyamed@google.com -nona@google.com
\ No newline at end of file +soboleva@google.com diff --git a/core/java/android/view/accessibility/OWNERS b/core/java/android/view/accessibility/OWNERS index b1d3967a8b04..73d134146c3f 100644 --- a/core/java/android/view/accessibility/OWNERS +++ b/core/java/android/view/accessibility/OWNERS @@ -10,3 +10,7 @@ ogunwale@google.com jjaggi@google.com pweaver@google.com ryanlwlin@google.com +danielnorman@google.com +sallyyuen@google.com +aarmaly@google.com +fuego@google.com diff --git a/core/java/android/widget/OWNERS b/core/java/android/widget/OWNERS index 56310aef7752..02dafd44d3bd 100644 --- a/core/java/android/widget/OWNERS +++ b/core/java/android/widget/OWNERS @@ -8,8 +8,8 @@ siyamed@google.com mount@google.com njawad@google.com -per-file TextView*,EditText.java,Editor.java,EditorTouchState.java = file:../text/OWNERS +per-file TextView*,Edit*,Selection* = file:../text/OWNERS per-file SpellChecker.java = file:../view/inputmethod/OWNERS -per-file RemoteViews* = file:../appwidget/OWNERS
\ No newline at end of file +per-file RemoteViews* = file:../appwidget/OWNERS diff --git a/core/java/com/android/internal/accessibility/OWNERS b/core/java/com/android/internal/accessibility/OWNERS index b3c09e9d539a..0955e005791e 100644 --- a/core/java/com/android/internal/accessibility/OWNERS +++ b/core/java/com/android/internal/accessibility/OWNERS @@ -1,4 +1,6 @@ # Bug component: 44214 -svetoslavganov@google.com pweaver@google.com -qasid@google.com +danielnorman@google.com +sallyyuen@google.com +aarmaly@google.com +fuego@google.com diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java index c1e72fe75666..5f731e201866 100644 --- a/core/tests/coretests/src/android/os/FileUtilsTest.java +++ b/core/tests/coretests/src/android/os/FileUtilsTest.java @@ -58,10 +58,10 @@ import android.provider.DocumentsContract.Document; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; -import libcore.io.Streams; - import com.google.android.collect.Sets; +import libcore.io.Streams; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -524,6 +524,56 @@ public class FileUtilsTest { } @Test + public void testParseSize() { + assertEquals(0L, FileUtils.parseSize("0MB")); + assertEquals(1_024L, FileUtils.parseSize("1024b")); + assertEquals(-1L, FileUtils.parseSize(" -1 b ")); + assertEquals(0L, FileUtils.parseSize(" -0 gib ")); + assertEquals(1_000L, FileUtils.parseSize("1K")); + assertEquals(1_000L, FileUtils.parseSize("1KB")); + assertEquals(10_000L, FileUtils.parseSize("10KB")); + assertEquals(100_000L, FileUtils.parseSize("100KB")); + assertEquals(1_000_000L, FileUtils.parseSize("1000KB")); + assertEquals(1_024_000L, FileUtils.parseSize("1000KiB")); + assertEquals(70_000_000L, FileUtils.parseSize("070M")); + assertEquals(70_000_000L, FileUtils.parseSize("070MB")); + assertEquals(73_400_320L, FileUtils.parseSize("70MiB")); + assertEquals(700_000_000L, FileUtils.parseSize("700000KB")); + assertEquals(200_000_000L, FileUtils.parseSize("+200MB")); + assertEquals(1_000_000_000L, FileUtils.parseSize("1000MB")); + assertEquals(1_000_000_000L, FileUtils.parseSize("+1000 mb")); + assertEquals(644_245_094_400L, FileUtils.parseSize("600GiB")); + assertEquals(999_000_000_000L, FileUtils.parseSize("999GB")); + assertEquals(999_000_000_000L, FileUtils.parseSize("999 gB")); + assertEquals(9_999_000_000_000L, FileUtils.parseSize("9999GB")); + assertEquals(9_000_000_000_000L, FileUtils.parseSize(" 9000 GB ")); + assertEquals(1_234_000_000_000L, FileUtils.parseSize(" 1234 GB ")); + assertEquals(1_234_567_890_000L, FileUtils.parseSize(" 1234567890 KB ")); + } + + @Test + public void testParseSize_invalidArguments() { + assertEquals(Long.MIN_VALUE, FileUtils.parseSize(null)); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("null")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize(" ")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("KB")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("123 dd")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("Invalid")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize(" ABC890 KB ")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("-=+90 KB ")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("123")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("--123")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("-KB")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("++123")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("+")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("+ 1 +")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("+--+ 1 +")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize("1GB+")); + assertEquals(Long.MIN_VALUE, FileUtils.parseSize(" + 1234567890 KB ")); + } + + @Test public void testTranslateMode() throws Exception { assertTranslate("r", O_RDONLY, MODE_READ_ONLY); diff --git a/core/tests/coretests/src/android/os/ProcessTest.java b/core/tests/coretests/src/android/os/ProcessTest.java index ae4edb97aab0..52846dfbb14b 100644 --- a/core/tests/coretests/src/android/os/ProcessTest.java +++ b/core/tests/coretests/src/android/os/ProcessTest.java @@ -72,4 +72,7 @@ public class ProcessTest extends TestCase { assertEquals(-1, Process.getThreadGroupLeader(BAD_PID)); } + public void testGetAdvertisedMem() { + assertTrue(Process.getTotalMemory() <= Process.getAdvertisedMem()); + } } diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 59c914f0198c..03f02de98efe 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -243,7 +243,9 @@ bool DrawFrameTask::syncFrameState(TreeInfo& info) { mContext->unpinImages(); for (size_t i = 0; i < mLayers.size(); i++) { - mLayers[i]->apply(); + if (mLayers[i]) { + mLayers[i]->apply(); + } } mLayers.clear(); mContext->setContentDrawBounds(mContentDrawBounds); diff --git a/media/native/midi/Android.bp b/media/native/midi/Android.bp index 7acb8c744ba7..a991a71fd3f1 100644 --- a/media/native/midi/Android.bp +++ b/media/native/midi/Android.bp @@ -74,4 +74,8 @@ ndk_library { symbol_file: "libamidi.map.txt", first_version: "29", + export_header_libs: [ + "amidi", + ], + } diff --git a/native/android/Android.bp b/native/android/Android.bp index 32b7a0780e63..8594ba5ca2da 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -27,6 +27,9 @@ ndk_library { symbol_file: "libandroid.map.txt", first_version: "9", unversioned_until: "current", + export_header_libs: [ + "libandroid_headers", + ], } cc_defaults { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt index b8a00133c728..1f7021e514e5 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt @@ -18,6 +18,7 @@ package com.android.systemui.controls.ui import android.annotation.AnyThread import android.annotation.MainThread +import android.app.Activity import android.app.AlertDialog import android.app.Dialog import android.app.PendingIntent @@ -119,8 +120,16 @@ class ControlActionCoordinatorImpl @Inject constructor( } override fun closeDialogs() { - dialog?.dismiss() - dialog = null + val isActivityFinishing = + (activityContext as? Activity)?.let { it.isFinishing || it.isDestroyed } + if (isActivityFinishing == true) { + dialog = null + return + } + if (dialog?.isShowing == true) { + dialog?.dismiss() + dialog = null + } } override fun toggle(cvh: ControlViewHolder, templateId: String, isChecked: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 7e57dd452cb8..296653861bc6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -3384,7 +3384,8 @@ public class CentralSurfacesImpl extends CoreStartable implements // lock screen where users can use the UDFPS affordance to enter the device mStatusBarKeyguardViewManager.reset(true); } else if ((mState == StatusBarState.KEYGUARD - && !mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()) + && !mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing() + && isKeyguardSecure()) || mState == StatusBarState.SHADE_LOCKED) { mStatusBarKeyguardViewManager.showGenericBouncer(true /* scrimmed */); } diff --git a/services/accessibility/OWNERS b/services/accessibility/OWNERS index 2b9f179b832d..6e76a207e06f 100644 --- a/services/accessibility/OWNERS +++ b/services/accessibility/OWNERS @@ -2,3 +2,5 @@ pweaver@google.com sallyyuen@google.com ryanlwlin@google.com fuego@google.com +danielnorman@google.com +aarmaly@google.com diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 9a1d29554ad6..8044af5dcb58 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -728,7 +728,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub intentFilter.addAction(Intent.ACTION_USER_SWITCHED); intentFilter.addAction(Intent.ACTION_USER_UNLOCKED); intentFilter.addAction(Intent.ACTION_USER_REMOVED); - intentFilter.addAction(Intent.ACTION_USER_PRESENT); intentFilter.addAction(Intent.ACTION_SETTING_RESTORED); mContext.registerReceiverAsUser(new BroadcastReceiver() { @@ -746,14 +745,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); - } else if (Intent.ACTION_USER_PRESENT.equals(action)) { - // We will update when the automation service dies. - synchronized (mLock) { - AccessibilityUserState userState = getCurrentUserStateLocked(); - if (readConfigurationForUserStateLocked(userState)) { - onUserStateChangedLocked(userState); - } - } } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) { final String which = intent.getStringExtra(Intent.EXTRA_SETTING_NAME); if (Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(which)) { diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index 6ff8e36a1f82..5dbdb9b3b77c 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -35,6 +35,8 @@ per-file NetIdManager.java = file:/services/core/java/com/android/server/net/OWN per-file PackageWatchdog.java, RescueParty.java = file:/services/core/java/com/android/server/rollback/OWNERS per-file PinnerService.java = file:/apct-tests/perftests/OWNERS per-file RescueParty.java = fdunlap@google.com, shuc@google.com +per-file SystemClockTime.java = file:/services/core/java/com/android/server/timedetector/OWNERS +per-file SystemTimeZone.java = file:/services/core/java/com/android/server/timezonedetector/OWNERS per-file TelephonyRegistry.java = file:/telephony/OWNERS per-file UiModeManagerService.java = file:/packages/SystemUI/OWNERS per-file VcnManagementService.java = file:/services/core/java/com/android/server/vcn/OWNERS diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 178b6bbe755e..eb6a3b3a3cea 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -27,6 +27,7 @@ import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT; import static android.os.Process.SYSTEM_UID; import static android.os.Process.THREAD_PRIORITY_BACKGROUND; import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY; +import static android.os.Process.getAdvertisedMem; import static android.os.Process.getFreeMemory; import static android.os.Process.getTotalMemory; import static android.os.Process.killProcessQuiet; @@ -1524,6 +1525,7 @@ public final class ProcessList { void getMemoryInfo(ActivityManager.MemoryInfo outInfo) { final long homeAppMem = getMemLevel(HOME_APP_ADJ); final long cachedAppMem = getMemLevel(CACHED_APP_MIN_ADJ); + outInfo.advertisedMem = getAdvertisedMem(); outInfo.availMem = getFreeMemory(); outInfo.totalMem = getTotalMemory(); outInfo.threshold = homeAppMem; diff --git a/services/core/java/com/android/server/am/ProcessProfileRecord.java b/services/core/java/com/android/server/am/ProcessProfileRecord.java index cee34d5568b5..252a00bace20 100644 --- a/services/core/java/com/android/server/am/ProcessProfileRecord.java +++ b/services/core/java/com/android/server/am/ProcessProfileRecord.java @@ -17,7 +17,6 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; -import static android.app.ActivityManager.processStateAmToProto; import android.annotation.IntDef; import android.app.IApplicationThread; @@ -318,12 +317,6 @@ final class ProcessProfileRecord { origBase.setState(ProcessStats.STATE_NOTHING, tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList.getPackageListLocked()); - pkgList.forEachPackage((pkgName, holder) -> - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_STATE_CHANGED, - mApp.uid, mApp.processName, pkgName, - processStateAmToProto(ProcessStats.STATE_NOTHING), - holder.appVersion) - ); } origBase.makeInactive(); } @@ -362,12 +355,6 @@ final class ProcessProfileRecord { origBase.setState(ProcessStats.STATE_NOTHING, tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList.getPackageListLocked()); - pkgList.forEachPackage((pkgName, holder) -> - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_STATE_CHANGED, - mApp.uid, mApp.processName, pkgName, - processStateAmToProto(ProcessStats.STATE_NOTHING), - holder.appVersion) - ); } origBase.makeInactive(); setBaseProcessTracker(null); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 07b6fcdcb0ca..482e6a792a90 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -54,7 +54,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.procstats.ProcessState; import com.android.internal.app.procstats.ProcessStats; import com.android.internal.os.Zygote; -import com.android.internal.util.FrameworkStatsLog; import com.android.server.wm.WindowProcessController; import com.android.server.wm.WindowProcessListener; @@ -1212,12 +1211,6 @@ class ProcessRecord implements WindowProcessListener { long now = SystemClock.uptimeMillis(); baseProcessTracker.setState(ProcessStats.STATE_NOTHING, tracker.getMemFactorLocked(), now, mPkgList.getPackageListLocked()); - mPkgList.forEachPackage((pkgName, holder) -> - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_STATE_CHANGED, - uid, processName, pkgName, - ActivityManager.processStateAmToProto(ProcessStats.STATE_NOTHING), - holder.appVersion) - ); if (numOfPkgs != 1) { mPkgList.forEachPackageProcessStats(holder -> { if (holder.state != null && holder.state != baseProcessTracker) { diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java index 262436d693ec..f0241aa5ed82 100644 --- a/services/core/java/com/android/server/am/ProcessStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessStateRecord.java @@ -36,7 +36,6 @@ import android.util.TimeUtils; import com.android.internal.annotations.CompositeRWLock; import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.FrameworkStatsLog; import com.android.server.am.PlatformCompatCache.CachedCompatChangeId; import java.io.PrintWriter; @@ -599,12 +598,6 @@ final class ProcessStateRecord { @GuardedBy({"mService", "mProcLock"}) void setReportedProcState(int repProcState) { mRepProcState = repProcState; - mApp.getPkgList().forEachPackage((pkgName, holder) -> - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_STATE_CHANGED, - mApp.uid, mApp.processName, pkgName, - ActivityManager.processStateAmToProto(mRepProcState), - holder.appVersion) - ); mApp.getWindowProcessController().setReportedProcState(repProcState); } @@ -620,12 +613,6 @@ final class ProcessStateRecord { mRepProcState = newState; setCurProcState(newState); setCurRawProcState(newState); - mApp.getPkgList().forEachPackage((pkgName, holder) -> - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_STATE_CHANGED, - mApp.uid, mApp.processName, pkgName, - ActivityManager.processStateAmToProto(mRepProcState), - holder.appVersion) - ); } } } diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index eba9c7a5f14e..9a5171243864 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -17,9 +17,12 @@ package com.android.server.audio; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.compat.CompatChanges; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothProfile; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledSince; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -118,8 +121,39 @@ import java.util.concurrent.atomic.AtomicBoolean; // TODO do not "share" the lock between AudioService and BtHelpr, see b/123769055 /*package*/ final Object mSetModeLock = new Object(); - /** PID of current audio mode owner communicated by AudioService */ - private int mModeOwnerPid = 0; + /** AudioModeInfo contains information on current audio mode owner + * communicated by AudioService */ + /* package */ static final class AudioModeInfo { + /** Current audio mode */ + final int mMode; + /** PID of current audio mode owner */ + final int mPid; + /** UID of current audio mode owner */ + final int mUid; + + AudioModeInfo(int mode, int pid, int uid) { + mMode = mode; + mPid = pid; + mUid = uid; + } + + @Override + public String toString() { + return "AudioModeInfo: mMode=" + AudioSystem.modeToString(mMode) + + ", mPid=" + mPid + + ", mUid=" + mUid; + } + }; + + private AudioModeInfo mAudioModeOwner = new AudioModeInfo(AudioSystem.MODE_NORMAL, 0, 0); + + /** + * Indicates that default communication device is chosen by routing rules in audio policy + * manager and not forced by AudioDeviceBroker. + */ + @ChangeId + @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.S_V2) + public static final long USE_SET_COMMUNICATION_DEVICE = 243827847L; //------------------------------------------------------------------- /*package*/ AudioDeviceBroker(@NonNull Context context, @NonNull AudioService service) { @@ -187,7 +221,7 @@ import java.util.concurrent.atomic.AtomicBoolean; /*package*/ void onSystemReady() { synchronized (mSetModeLock) { synchronized (mDeviceStateLock) { - mModeOwnerPid = mAudioService.getModeOwnerPid(); + mAudioModeOwner = mAudioService.getAudioModeOwner(); mBtHelper.onSystemReady(); } } @@ -368,11 +402,11 @@ import java.util.concurrent.atomic.AtomicBoolean; @GuardedBy("mDeviceStateLock") private CommunicationRouteClient topCommunicationRouteClient() { for (CommunicationRouteClient crc : mCommunicationRouteClients) { - if (crc.getPid() == mModeOwnerPid) { + if (crc.getPid() == mAudioModeOwner.mPid) { return crc; } } - if (!mCommunicationRouteClients.isEmpty() && mModeOwnerPid == 0) { + if (!mCommunicationRouteClients.isEmpty() && mAudioModeOwner.mPid == 0) { return mCommunicationRouteClients.get(0); } return null; @@ -390,7 +424,7 @@ import java.util.concurrent.atomic.AtomicBoolean; AudioDeviceAttributes device = crc != null ? crc.getDevice() : null; if (AudioService.DEBUG_COMM_RTE) { Log.v(TAG, "requestedCommunicationDevice, device: " - + device + " mode owner pid: " + mModeOwnerPid); + + device + "mAudioModeOwner: " + mAudioModeOwner.toString()); } return device; } @@ -774,8 +808,9 @@ import java.util.concurrent.atomic.AtomicBoolean; sendLMsgNoDelay(MSG_II_SET_LE_AUDIO_OUT_VOLUME, SENDMSG_REPLACE, info); } - /*package*/ void postSetModeOwnerPid(int pid, int mode) { - sendIIMsgNoDelay(MSG_I_SET_MODE_OWNER_PID, SENDMSG_REPLACE, pid, mode); + /*package*/ void postSetModeOwner(int mode, int pid, int uid) { + sendLMsgNoDelay(MSG_I_SET_MODE_OWNER, SENDMSG_REPLACE, + new AudioModeInfo(mode, pid, uid)); } /*package*/ void postBluetoothA2dpDeviceConfigChange(@NonNull BluetoothDevice device) { @@ -1162,7 +1197,7 @@ import java.util.concurrent.atomic.AtomicBoolean; pw.println(prefix + "mAccessibilityStrategyId: " + mAccessibilityStrategyId); - pw.println("\n" + prefix + "mModeOwnerPid: " + mModeOwnerPid); + pw.println("\n" + prefix + "mAudioModeOwner: " + mAudioModeOwner); mBtHelper.dump(pw, prefix); } @@ -1288,12 +1323,19 @@ import java.util.concurrent.atomic.AtomicBoolean; } break; case MSG_L_SET_BT_ACTIVE_DEVICE: - synchronized (mDeviceStateLock) { - BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj; - mDeviceInventory.onSetBtActiveDevice(btInfo, - (btInfo.mProfile != BluetoothProfile.LE_AUDIO || btInfo.mIsLeOutput) - ? mAudioService.getBluetoothContextualVolumeStream() - : AudioSystem.STREAM_DEFAULT); + synchronized (mSetModeLock) { + synchronized (mDeviceStateLock) { + BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj; + mDeviceInventory.onSetBtActiveDevice(btInfo, + (btInfo.mProfile + != BluetoothProfile.LE_AUDIO || btInfo.mIsLeOutput) + ? mAudioService.getBluetoothContextualVolumeStream() + : AudioSystem.STREAM_DEFAULT); + if (btInfo.mProfile == BluetoothProfile.LE_AUDIO + || btInfo.mProfile == BluetoothProfile.HEARING_AID) { + onUpdateCommunicationRouteClient("setBluetoothActiveDevice"); + } + } } break; case MSG_BT_HEADSET_CNCT_FAILED: @@ -1338,11 +1380,11 @@ import java.util.concurrent.atomic.AtomicBoolean; mBtHelper.setAvrcpAbsoluteVolumeIndex(msg.arg1); } break; - case MSG_I_SET_MODE_OWNER_PID: + case MSG_I_SET_MODE_OWNER: synchronized (mSetModeLock) { synchronized (mDeviceStateLock) { - mModeOwnerPid = msg.arg1; - if (msg.arg2 != AudioSystem.MODE_RINGTONE) { + mAudioModeOwner = (AudioModeInfo) msg.obj; + if (mAudioModeOwner.mMode != AudioSystem.MODE_RINGTONE) { onUpdateCommunicationRouteClient("setNewModeOwner"); } } @@ -1504,7 +1546,7 @@ import java.util.concurrent.atomic.AtomicBoolean; private static final int MSG_REPORT_NEW_ROUTES = 13; private static final int MSG_II_SET_HEARING_AID_VOLUME = 14; private static final int MSG_I_SET_AVRCP_ABSOLUTE_VOLUME = 15; - private static final int MSG_I_SET_MODE_OWNER_PID = 16; + private static final int MSG_I_SET_MODE_OWNER = 16; private static final int MSG_I_BT_SERVICE_DISCONNECTED_PROFILE = 22; private static final int MSG_IL_BT_SERVICE_CONNECTED_PROFILE = 23; @@ -1826,8 +1868,16 @@ import java.util.concurrent.atomic.AtomicBoolean; AudioSystem.setParameters("BT_SCO=on"); } if (preferredCommunicationDevice == null) { - removePreferredDevicesForStrategySync(mCommunicationStrategyId); - removePreferredDevicesForStrategySync(mAccessibilityStrategyId); + AudioDeviceAttributes defaultDevice = getDefaultCommunicationDevice(); + if (defaultDevice != null) { + setPreferredDevicesForStrategySync( + mCommunicationStrategyId, Arrays.asList(defaultDevice)); + setPreferredDevicesForStrategySync( + mAccessibilityStrategyId, Arrays.asList(defaultDevice)); + } else { + removePreferredDevicesForStrategySync(mCommunicationStrategyId); + removePreferredDevicesForStrategySync(mAccessibilityStrategyId); + } } else { setPreferredDevicesForStrategySync( mCommunicationStrategyId, Arrays.asList(preferredCommunicationDevice)); @@ -1856,26 +1906,24 @@ import java.util.concurrent.atomic.AtomicBoolean; } } + // @GuardedBy("mSetModeLock") + @GuardedBy("mDeviceStateLock") private void onUpdatePhoneStrategyDevice(AudioDeviceAttributes device) { - synchronized (mSetModeLock) { - synchronized (mDeviceStateLock) { - boolean wasSpeakerphoneActive = isSpeakerphoneActive(); - mPreferredCommunicationDevice = device; - updateActiveCommunicationDevice(); - if (wasSpeakerphoneActive != isSpeakerphoneActive()) { - try { - mContext.sendBroadcastAsUser( - new Intent(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED) - .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), - UserHandle.ALL); - } catch (Exception e) { - Log.w(TAG, "failed to broadcast ACTION_SPEAKERPHONE_STATE_CHANGED: " + e); - } - } - mAudioService.postUpdateRingerModeServiceInt(); - dispatchCommunicationDevice(); + boolean wasSpeakerphoneActive = isSpeakerphoneActive(); + mPreferredCommunicationDevice = device; + updateActiveCommunicationDevice(); + if (wasSpeakerphoneActive != isSpeakerphoneActive()) { + try { + mContext.sendBroadcastAsUser( + new Intent(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED) + .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), + UserHandle.ALL); + } catch (Exception e) { + Log.w(TAG, "failed to broadcast ACTION_SPEAKERPHONE_STATE_CHANGED: " + e); } } + mAudioService.postUpdateRingerModeServiceInt(); + dispatchCommunicationDevice(); } private CommunicationRouteClient removeCommunicationRouteClient( @@ -1915,6 +1963,32 @@ import java.util.concurrent.atomic.AtomicBoolean; return null; } + @GuardedBy("mDeviceStateLock") + private boolean communnicationDeviceCompatOn() { + return mAudioModeOwner.mMode == AudioSystem.MODE_IN_COMMUNICATION + && !(CompatChanges.isChangeEnabled( + USE_SET_COMMUNICATION_DEVICE, mAudioModeOwner.mUid) + || mAudioModeOwner.mUid == android.os.Process.SYSTEM_UID); + } + + @GuardedBy("mDeviceStateLock") + AudioDeviceAttributes getDefaultCommunicationDevice() { + // For system server (Telecom) and APKs targeting S and above, we let the audio + // policy routing rules select the default communication device. + // For older APKs, we force Hearing Aid or LE Audio headset when connected as + // those APKs cannot select a LE Audio or Hearing Aid device explicitly. + AudioDeviceAttributes device = null; + if (communnicationDeviceCompatOn()) { + // If both LE and Hearing Aid are active (thie should not happen), + // priority to Hearing Aid. + device = mDeviceInventory.getDeviceOfType(AudioSystem.DEVICE_OUT_HEARING_AID); + if (device == null) { + device = mDeviceInventory.getDeviceOfType(AudioSystem.DEVICE_OUT_BLE_HEADSET); + } + } + return device; + } + @Nullable UUID getDeviceSensorUuid(AudioDeviceAttributes device) { synchronized (mDeviceStateLock) { return mDeviceInventory.getDeviceSensorUuid(device); diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index c1f496905dba..e90bfe85fc89 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -294,6 +294,7 @@ public class AudioDeviceInventory { } } + // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") void onSetBtActiveDevice(@NonNull AudioDeviceBroker.BtDeviceInfo btInfo, int streamType) { if (AudioService.DEBUG_DEVICES) { @@ -1526,6 +1527,19 @@ public class AudioDeviceInventory { return di.mSensorUuid; } } + + /* package */ AudioDeviceAttributes getDeviceOfType(int type) { + synchronized (mDevicesLock) { + for (DeviceInfo di : mConnectedDevices.values()) { + if (di.mDeviceType == type) { + return new AudioDeviceAttributes( + di.mDeviceType, di.mDeviceAddress, di.mDeviceName); + } + } + } + return null; + } + //---------------------------------------------------------- // For tests only diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 56874f74afb1..e9913999f062 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -5053,16 +5053,17 @@ public class AudioService extends IAudioService.Stub } /** - * Return the pid of the current audio mode owner + * Return information on the current audio mode owner * @return 0 if nobody owns the mode */ @GuardedBy("mDeviceBroker.mSetModeLock") - /*package*/ int getModeOwnerPid() { + /*package*/ AudioDeviceBroker.AudioModeInfo getAudioModeOwner() { SetModeDeathHandler hdlr = getAudioModeOwnerHandler(); if (hdlr != null) { - return hdlr.getPid(); + return new AudioDeviceBroker.AudioModeInfo( + hdlr.getMode(), hdlr.getPid(), hdlr.getUid()); } - return 0; + return new AudioDeviceBroker.AudioModeInfo(AudioSystem.MODE_NORMAL, 0 , 0); } /** @@ -5248,7 +5249,7 @@ public class AudioService extends IAudioService.Stub // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all SCO // connections not started by the application changing the mode when pid changes - mDeviceBroker.postSetModeOwnerPid(pid, mode); + mDeviceBroker.postSetModeOwner(mode, pid, uid); } else { Log.w(TAG, "onUpdateAudioMode: failed to set audio mode to: " + mode); } @@ -5575,7 +5576,10 @@ public class AudioService extends IAudioService.Stub } return deviceIds.stream().mapToInt(Integer::intValue).toArray(); } - /** @see AudioManager#setCommunicationDevice(int) */ + /** + * @see AudioManager#setCommunicationDevice(int) + * @see AudioManager#clearCommunicationDevice() + */ public boolean setCommunicationDevice(IBinder cb, int portId) { final int uid = Binder.getCallingUid(); final int pid = Binder.getCallingPid(); @@ -5590,7 +5594,8 @@ public class AudioService extends IAudioService.Stub throw new IllegalArgumentException("invalid device type " + device.getType()); } } - final String eventSource = new StringBuilder("setCommunicationDevice(") + final String eventSource = new StringBuilder() + .append(device == null ? "clearCommunicationDevice(" : "setCommunicationDevice(") .append(") from u/pid:").append(uid).append("/") .append(pid).toString(); diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 7d35fc5c8bd5..f8a74f4f3f55 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -266,10 +266,6 @@ public class HdmiControlService extends SystemService { // Make sure HdmiCecConfig is instantiated and the XMLs are read. private HdmiCecConfig mHdmiCecConfig; - // Last return value of getPhysicalAddress(). Only updated on calls of getPhysicalAddress(). - // Does not represent the current physical address at all times. Not to be used as a cache. - private int mPhysicalAddress = Constants.INVALID_PHYSICAL_ADDRESS; - /** * Interface to report send result. */ @@ -2084,15 +2080,9 @@ public class HdmiControlService extends SystemService { @Override public int getPhysicalAddress() { initBinderCall(); - runOnServiceThread(new Runnable() { - @Override - public void run() { - synchronized (mLock) { - mPhysicalAddress = mHdmiCecNetwork.getPhysicalAddress(); - } - } - }); - return mPhysicalAddress; + synchronized (mLock) { + return mHdmiCecNetwork.getPhysicalAddress(); + } } @Override diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 1b0c01816f73..9050d79d714f 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1695,7 +1695,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { ProtoLog.v(WM_DEBUG_STATES, "Executing finish of activity: %s", prev); prev = prev.completeFinishing(false /* updateVisibility */, "completePausedLocked"); - } else if (prev.hasProcess()) { + } else if (prev.attachedToProcess()) { ProtoLog.v(WM_DEBUG_STATES, "Enqueue pending stop if needed: %s " + "wasStopping=%b visibleRequested=%b", prev, wasStopping, prev.mVisibleRequested); diff --git a/services/core/jni/com_android_server_companion_virtual_InputController.cpp b/services/core/jni/com_android_server_companion_virtual_InputController.cpp index 8197b67355d4..daca1531d41f 100644 --- a/services/core/jni/com_android_server_companion_virtual_InputController.cpp +++ b/services/core/jni/com_android_server_companion_virtual_InputController.cpp @@ -21,6 +21,7 @@ #include <android/keycodes.h> #include <errno.h> #include <fcntl.h> +#include <input/Input.h> #include <linux/uinput.h> #include <math.h> #include <nativehelper/JNIHelp.h> @@ -271,6 +272,14 @@ static int openUinput(const char* readableName, jint vendorId, jint productId, c ALOGE("Error creating touchscreen uinput pressure axis: %s", strerror(errno)); return -errno; } + uinput_abs_setup slotAbsSetup; + slotAbsSetup.code = ABS_MT_SLOT; + slotAbsSetup.absinfo.maximum = MAX_POINTERS; + slotAbsSetup.absinfo.minimum = 0; + if (ioctl(fd, UI_ABS_SETUP, &slotAbsSetup) != 0) { + ALOGE("Error creating touchscreen uinput slots: %s", strerror(errno)); + return -errno; + } } if (ioctl(fd, UI_DEV_SETUP, &setup) != 0) { ALOGE("Error creating uinput device: %s", strerror(errno)); diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 6196c49c88ce..9c9b363b948e 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1287,8 +1287,8 @@ int IncrementalService::addBindMount(IncFsMount& ifs, StorageId storage, bp.set_allocated_dest_path(&target); bp.set_allocated_source_subdir(&source); const auto metadata = bp.SerializeAsString(); - bp.release_dest_path(); - bp.release_source_subdir(); + static_cast<void>(bp.release_dest_path()); + static_cast<void>(bp.release_source_subdir()); mdFileName = makeBindMdName(); metadataFullPath = path::join(ifs.root, constants().mount, mdFileName); auto node = mIncFs->makeFile(ifs.control, metadataFullPath, 0444, idFromMetadata(metadata), diff --git a/tests/Codegen/Android.bp b/tests/Codegen/Android.bp index ddbf16817b94..7fbe3b37f99e 100644 --- a/tests/Codegen/Android.bp +++ b/tests/Codegen/Android.bp @@ -24,6 +24,14 @@ android_test { plugins: [ "staledataclass-annotation-processor", ], + // Exports needed for staledataclass-annotation-processor, see b/139342589. + javacflags: [ + "-J--add-modules=jdk.compiler", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", + ], static_libs: [ "junit", "hamcrest", diff --git a/tests/HandwritingIme/OWNERS b/tests/HandwritingIme/OWNERS new file mode 100644 index 000000000000..6bb4b17ed4eb --- /dev/null +++ b/tests/HandwritingIme/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 34867 + +include /services/core/java/com/android/server/inputmethod/OWNERS diff --git a/tests/RollbackTest/Android.bp b/tests/RollbackTest/Android.bp index b7c4c5b28168..f2234fb64108 100644 --- a/tests/RollbackTest/Android.bp +++ b/tests/RollbackTest/Android.bp @@ -51,6 +51,7 @@ java_test_host { data: [ ":com.android.apex.apkrollback.test_v1", ":test.rebootless_apex_v1", + ":RollbackTest", ], } diff --git a/tools/lint/checks/src/main/java/com/google/android/lint/EnforcePermissionDetector.kt b/tools/lint/checks/src/main/java/com/google/android/lint/EnforcePermissionDetector.kt index 8011b36c9a8f..8f553abfee31 100644 --- a/tools/lint/checks/src/main/java/com/google/android/lint/EnforcePermissionDetector.kt +++ b/tools/lint/checks/src/main/java/com/google/android/lint/EnforcePermissionDetector.kt @@ -65,8 +65,16 @@ class EnforcePermissionDetector : Detector(), SourceCodeScanner { if (attr1[i].name != attr2[i].name) { return false } - val v1 = ConstantEvaluator.evaluate(context, attr1[i].value) - val v2 = ConstantEvaluator.evaluate(context, attr2[i].value) + val value1 = attr1[i].value + val value2 = attr2[i].value + if (value1 == null && value2 == null) { + continue + } + if (value1 == null || value2 == null) { + return false + } + val v1 = ConstantEvaluator.evaluate(context, value1) + val v2 = ConstantEvaluator.evaluate(context, value2) if (v1 != v2) { return false } diff --git a/tools/processors/staledataclass/Android.bp b/tools/processors/staledataclass/Android.bp index 1e5097662a0a..2169c49a91a5 100644 --- a/tools/processors/staledataclass/Android.bp +++ b/tools/processors/staledataclass/Android.bp @@ -22,17 +22,13 @@ java_plugin { static_libs: [ "codegen-version-info", ], - // The --add-modules/exports flags below don't work for kotlinc yet, so pin this module to Java language level 8 (see b/139342589): - java_version: "1.8", - openjdk9: { - javacflags: [ - "--add-modules=jdk.compiler", - "--add-exports jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", - "--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", - "--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", - "--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", - ], - }, + javacflags: [ + "--add-modules=jdk.compiler", + "--add-exports jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", + "--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED", + "--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", + ], use_tools_jar: true, } diff --git a/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt b/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt index 27a8853a2219..1cef5b0c8dfb 100644 --- a/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt +++ b/tools/processors/staledataclass/src/android/processor/staledataclass/StaleDataclassProcessor.kt @@ -14,6 +14,7 @@ * limitations under the License. */ +@file:Suppress("JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE") package android.processor.staledataclass |