Merge "Address code warnings in the android.app package."
diff --git a/Android.bp b/Android.bp
index 62d2632..93d1e4e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -345,6 +345,7 @@
"framework-permission-aidl-java",
"spatializer-aidl-java",
"audiopolicy-types-aidl-java",
+ "modules-utils-expresslog",
],
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/TimeController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/TimeController.java
index 80a70a6..1cd1a46 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/TimeController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/TimeController.java
@@ -31,7 +31,7 @@
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.expresslog.Counter;
+import com.android.modules.expresslog.Counter;
import com.android.server.job.JobSchedulerService;
import com.android.server.job.StateControllerProto;
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionJpegProcessor.java b/core/java/android/hardware/camera2/impl/CameraExtensionJpegProcessor.java
index aee20db..e977751 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionJpegProcessor.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionJpegProcessor.java
@@ -46,6 +46,7 @@
public class CameraExtensionJpegProcessor implements ICaptureProcessorImpl {
public final static String TAG = "CameraExtensionJpeg";
private final static int JPEG_QUEUE_SIZE = 1;
+ private final static int JPEG_APP_SEGMENT_SIZE = 64 * 1024;
private final Handler mHandler;
private final HandlerThread mHandlerThread;
@@ -225,9 +226,10 @@
private void initializePipeline() throws RemoteException {
if ((mFormat != -1) && (mOutputSurface != null) && (mResolution != null) &&
(mYuvReader == null)) {
- // Jpeg/blobs are expected to be configured with (w*h)x1
+ // Jpeg/blobs are expected to be configured with (w*h)x1.5 + 64k Jpeg APP1 segment
mOutputWriter = ImageWriter.newInstance(mOutputSurface, 1 /*maxImages*/,
- ImageFormat.JPEG, mResolution.width * mResolution.height, 1);
+ ImageFormat.JPEG,
+ (mResolution.width * mResolution.height * 3)/2 + JPEG_APP_SEGMENT_SIZE, 1);
mYuvReader = ImageReader.newInstance(mResolution.width, mResolution.height, mFormat,
JPEG_QUEUE_SIZE);
mYuvReader.setOnImageAvailableListener(new YuvCallback(), mHandler);
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index fadad99..14aac89 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -709,7 +709,10 @@
}
getPositionListener().addSubscriber(mCursorAnchorInfoNotifier, true);
- makeBlink();
+ // Call resumeBlink here instead of makeBlink to ensure that if mBlink is not null the
+ // Blink object is uncancelled. This ensures when a view is removed and added back the
+ // cursor will resume blinking.
+ resumeBlink();
}
void onDetachedFromWindow() {
@@ -1081,8 +1084,10 @@
private void resumeBlink() {
if (mBlink != null) {
mBlink.uncancel();
- makeBlink();
}
+ // Moving makeBlink outside of the null check block ensures that mBlink object gets
+ // instantiated when the view is added to the window if mBlink is still null.
+ makeBlink();
}
void adjustInputType(boolean password, boolean passwordInputType,
@@ -2862,6 +2867,9 @@
if (shouldBlink()) {
mShowCursor = SystemClock.uptimeMillis();
if (mBlink == null) mBlink = new Blink();
+ // Call uncancel as mBlink could have previously been cancelled and cursor will not
+ // resume blinking unless uncancelled.
+ mBlink.uncancel();
mTextView.removeCallbacks(mBlink);
mTextView.postDelayed(mBlink, BLINK);
} else {
diff --git a/core/java/com/android/internal/expresslog/Counter.java b/core/java/com/android/internal/expresslog/Counter.java
deleted file mode 100644
index 4a46d91..0000000
--- a/core/java/com/android/internal/expresslog/Counter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2023 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 com.android.internal.expresslog;
-
-import android.annotation.NonNull;
-
-import com.android.internal.util.FrameworkStatsLog;
-
-/** Counter encapsulates StatsD write API calls */
-public final class Counter {
-
- // Not instantiable.
- private Counter() {}
-
- /**
- * Increments Telemetry Express Counter metric by 1
- * @param metricId to log, no-op if metricId is not defined in the TeX catalog
- * @hide
- */
- public static void logIncrement(@NonNull String metricId) {
- logIncrement(metricId, 1);
- }
-
- /**
- * Increments Telemetry Express Counter metric by 1
- * @param metricId to log, no-op if metricId is not defined in the TeX catalog
- * @param uid used as a dimension for the count metric
- * @hide
- */
- public static void logIncrementWithUid(@NonNull String metricId, int uid) {
- logIncrementWithUid(metricId, uid, 1);
- }
-
- /**
- * Increments Telemetry Express Counter metric by arbitrary value
- * @param metricId to log, no-op if metricId is not defined in the TeX catalog
- * @param amount to increment counter
- * @hide
- */
- public static void logIncrement(@NonNull String metricId, long amount) {
- final long metricIdHash = Utils.hashString(metricId);
- FrameworkStatsLog.write(FrameworkStatsLog.EXPRESS_EVENT_REPORTED, metricIdHash, amount);
- }
-
- /**
- * Increments Telemetry Express Counter metric by arbitrary value
- * @param metricId to log, no-op if metricId is not defined in the TeX catalog
- * @param uid used as a dimension for the count metric
- * @param amount to increment counter
- * @hide
- */
- public static void logIncrementWithUid(@NonNull String metricId, int uid, long amount) {
- final long metricIdHash = Utils.hashString(metricId);
- FrameworkStatsLog.write(
- FrameworkStatsLog.EXPRESS_UID_EVENT_REPORTED, metricIdHash, amount, uid);
- }
-}
diff --git a/core/java/com/android/internal/expresslog/Histogram.java b/core/java/com/android/internal/expresslog/Histogram.java
deleted file mode 100644
index 2fe784a..0000000
--- a/core/java/com/android/internal/expresslog/Histogram.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2023 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 com.android.internal.expresslog;
-
-import android.annotation.FloatRange;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-
-import com.android.internal.util.FrameworkStatsLog;
-
-import java.util.Arrays;
-
-/** Histogram encapsulates StatsD write API calls */
-public final class Histogram {
-
- private final long mMetricIdHash;
- private final BinOptions mBinOptions;
-
- /**
- * Creates Histogram metric logging wrapper
- *
- * @param metricId to log, logging will be no-op if metricId is not defined in the TeX catalog
- * @param binOptions to calculate bin index for samples
- * @hide
- */
- public Histogram(@NonNull String metricId, @NonNull BinOptions binOptions) {
- mMetricIdHash = Utils.hashString(metricId);
- mBinOptions = binOptions;
- }
-
- /**
- * Logs increment sample count for automatically calculated bin
- *
- * @param sample value
- * @hide
- */
- public void logSample(float sample) {
- final int binIndex = mBinOptions.getBinForSample(sample);
- FrameworkStatsLog.write(FrameworkStatsLog.EXPRESS_HISTOGRAM_SAMPLE_REPORTED, mMetricIdHash,
- /*count*/ 1, binIndex);
- }
-
- /**
- * Logs increment sample count for automatically calculated bin
- *
- * @param uid used as a dimension for the count metric
- * @param sample value
- * @hide
- */
- public void logSampleWithUid(int uid, float sample) {
- final int binIndex = mBinOptions.getBinForSample(sample);
- FrameworkStatsLog.write(FrameworkStatsLog.EXPRESS_UID_HISTOGRAM_SAMPLE_REPORTED,
- mMetricIdHash, /*count*/ 1, binIndex, uid);
- }
-
- /** Used by Histogram to map data sample to corresponding bin */
- public interface BinOptions {
- /**
- * Returns bins count to be used by a histogram
- *
- * @return bins count used to initialize Options, including overflow & underflow bins
- * @hide
- */
- int getBinsCount();
-
- /**
- * Returns bin index for the input sample value
- * index == 0 stands for underflow
- * index == getBinsCount() - 1 stands for overflow
- *
- * @return zero based index
- * @hide
- */
- int getBinForSample(float sample);
- }
-
- /** Used by Histogram to map data sample to corresponding bin for uniform bins */
- public static final class UniformOptions implements BinOptions {
-
- private final int mBinCount;
- private final float mMinValue;
- private final float mExclusiveMaxValue;
- private final float mBinSize;
-
- /**
- * Creates options for uniform (linear) sized bins
- *
- * @param binCount amount of histogram bins. 2 bin indexes will be calculated
- * automatically to represent underflow & overflow bins
- * @param minValue is included in the first bin, values less than minValue
- * go to underflow bin
- * @param exclusiveMaxValue is included in the overflow bucket. For accurate
- * measure up to kMax, then exclusiveMaxValue
- * should be set to kMax + 1
- * @hide
- */
- public UniformOptions(@IntRange(from = 1) int binCount, float minValue,
- float exclusiveMaxValue) {
- if (binCount < 1) {
- throw new IllegalArgumentException("Bin count should be positive number");
- }
-
- if (exclusiveMaxValue <= minValue) {
- throw new IllegalArgumentException("Bins range invalid (maxValue < minValue)");
- }
-
- mMinValue = minValue;
- mExclusiveMaxValue = exclusiveMaxValue;
- mBinSize = (mExclusiveMaxValue - minValue) / binCount;
-
- // Implicitly add 2 for the extra underflow & overflow bins
- mBinCount = binCount + 2;
- }
-
- @Override
- public int getBinsCount() {
- return mBinCount;
- }
-
- @Override
- public int getBinForSample(float sample) {
- if (sample < mMinValue) {
- // goes to underflow
- return 0;
- } else if (sample >= mExclusiveMaxValue) {
- // goes to overflow
- return mBinCount - 1;
- }
- return (int) ((sample - mMinValue) / mBinSize + 1);
- }
- }
-
- /** Used by Histogram to map data sample to corresponding bin for scaled bins */
- public static final class ScaledRangeOptions implements BinOptions {
- // store minimum value per bin
- final long[] mBins;
-
- /**
- * Creates options for scaled range bins
- *
- * @param binCount amount of histogram bins. 2 bin indexes will be calculated
- * automatically to represent underflow & overflow bins
- * @param minValue is included in the first bin, values less than minValue
- * go to underflow bin
- * @param firstBinWidth used to represent first bin width and as a reference to calculate
- * width for consecutive bins
- * @param scaleFactor used to calculate width for consecutive bins
- * @hide
- */
- public ScaledRangeOptions(@IntRange(from = 1) int binCount, int minValue,
- @FloatRange(from = 1.f) float firstBinWidth,
- @FloatRange(from = 1.f) float scaleFactor) {
- if (binCount < 1) {
- throw new IllegalArgumentException("Bin count should be positive number");
- }
-
- if (firstBinWidth < 1.f) {
- throw new IllegalArgumentException(
- "First bin width invalid (should be 1.f at minimum)");
- }
-
- if (scaleFactor < 1.f) {
- throw new IllegalArgumentException(
- "Scaled factor invalid (should be 1.f at minimum)");
- }
-
- // precalculating bins ranges (no need to create a bin for underflow reference value)
- mBins = initBins(binCount + 1, minValue, firstBinWidth, scaleFactor);
- }
-
- @Override
- public int getBinsCount() {
- return mBins.length + 1;
- }
-
- @Override
- public int getBinForSample(float sample) {
- if (sample < mBins[0]) {
- // goes to underflow
- return 0;
- } else if (sample >= mBins[mBins.length - 1]) {
- // goes to overflow
- return mBins.length;
- }
-
- return lower_bound(mBins, (long) sample) + 1;
- }
-
- // To find lower bound using binary search implementation of Arrays utility class
- private static int lower_bound(long[] array, long sample) {
- int index = Arrays.binarySearch(array, sample);
- // If key is not present in the array
- if (index < 0) {
- // Index specify the position of the key when inserted in the sorted array
- // so the element currently present at this position will be the lower bound
- return Math.abs(index) - 2;
- }
- return index;
- }
-
- private static long[] initBins(int count, int minValue, float firstBinWidth,
- float scaleFactor) {
- long[] bins = new long[count];
- bins[0] = minValue;
- double lastWidth = firstBinWidth;
- for (int i = 1; i < count; i++) {
- // current bin minValue = previous bin width * scaleFactor
- double currentBinMinValue = bins[i - 1] + lastWidth;
- if (currentBinMinValue > Integer.MAX_VALUE) {
- throw new IllegalArgumentException(
- "Attempted to create a bucket larger than maxint");
- }
-
- bins[i] = (long) currentBinMinValue;
- lastWidth *= scaleFactor;
- }
- return bins;
- }
- }
-}
diff --git a/core/java/com/android/internal/expresslog/OWNERS b/core/java/com/android/internal/expresslog/OWNERS
deleted file mode 100644
index ee865b1..0000000
--- a/core/java/com/android/internal/expresslog/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /services/core/java/com/android/server/stats/OWNERS
diff --git a/core/java/com/android/internal/expresslog/TEST_MAPPING b/core/java/com/android/internal/expresslog/TEST_MAPPING
deleted file mode 100644
index c9b0cf8..0000000
--- a/core/java/com/android/internal/expresslog/TEST_MAPPING
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "presubmit": [
- {
- "name": "ExpressLogTests",
- "options": [
- {
- "exclude-annotation": "org.junit.Ignore"
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/core/java/com/android/internal/expresslog/Utils.java b/core/java/com/android/internal/expresslog/Utils.java
deleted file mode 100644
index d82192f..0000000
--- a/core/java/com/android/internal/expresslog/Utils.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2023 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 com.android.internal.expresslog;
-
-final class Utils {
- static native long hashString(String stringToHash);
-}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index b5b7c0f..73c93ac 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -221,7 +221,6 @@
"android_content_res_Configuration.cpp",
"android_security_Scrypt.cpp",
"com_android_internal_content_om_OverlayConfig.cpp",
- "com_android_internal_expresslog_Utils.cpp",
"com_android_internal_net_NetworkUtilsInternal.cpp",
"com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
@@ -256,6 +255,7 @@
"libstatssocket_lazy",
"libskia",
"libtextclassifier_hash_static",
+ "libexpresslog_jni",
],
shared_libs: [
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 9c7f0a8..6919a76 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -195,8 +195,7 @@
extern int register_android_security_Scrypt(JNIEnv *env);
extern int register_com_android_internal_content_F2fsUtils(JNIEnv* env);
extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
-extern int register_com_android_internal_content_om_OverlayConfig(JNIEnv *env);
-extern int register_com_android_internal_expresslog_Utils(JNIEnv* env);
+extern int register_com_android_internal_content_om_OverlayConfig(JNIEnv* env);
extern int register_com_android_internal_net_NetworkUtilsInternal(JNIEnv* env);
extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
@@ -213,6 +212,7 @@
extern int register_com_android_internal_os_ZygoteInit(JNIEnv *env);
extern int register_com_android_internal_security_VerityUtils(JNIEnv* env);
extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env);
+extern int register_com_android_modules_expresslog_Utils(JNIEnv* env);
extern int register_android_window_WindowInfosListener(JNIEnv* env);
// Namespace for Android Runtime flags applied during boot time.
@@ -1591,7 +1591,6 @@
REG_JNI(register_android_os_SharedMemory),
REG_JNI(register_android_os_incremental_IncrementalManager),
REG_JNI(register_com_android_internal_content_om_OverlayConfig),
- REG_JNI(register_com_android_internal_expresslog_Utils),
REG_JNI(register_com_android_internal_net_NetworkUtilsInternal),
REG_JNI(register_com_android_internal_os_ClassLoaderFactory),
REG_JNI(register_com_android_internal_os_LongArrayMultiStateCounter),
@@ -1601,6 +1600,7 @@
REG_JNI(register_com_android_internal_os_ZygoteInit),
REG_JNI(register_com_android_internal_security_VerityUtils),
REG_JNI(register_com_android_internal_util_VirtualRefBasePtr),
+ REG_JNI(register_com_android_modules_expresslog_Utils),
REG_JNI(register_android_hardware_Camera),
REG_JNI(register_android_hardware_camera2_CameraMetadata),
REG_JNI(register_android_hardware_camera2_DngCreator),
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index 1e7a93c..84b050c 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -102,6 +102,3 @@
# PM
per-file com_android_internal_content_* = file:/PACKAGE_MANAGER_OWNERS
-
-# Stats/expresslog
-per-file *expresslog* = file:/services/core/java/com/android/server/stats/OWNERS
diff --git a/core/jni/com_android_internal_expresslog_Utils.cpp b/core/jni/com_android_internal_expresslog_Utils.cpp
deleted file mode 100644
index d33a7bd..0000000
--- a/core/jni/com_android_internal_expresslog_Utils.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- */
-
-#include <nativehelper/JNIHelp.h>
-#include <utils/hash/farmhash.h>
-
-#include "core_jni_helpers.h"
-
-// ----------------------------------------------------------------------------
-// JNI Glue
-// ----------------------------------------------------------------------------
-
-static jclass g_stringClass = nullptr;
-
-/**
- * Class: com_android_internal_expresslog_Utils
- * Method: hashString
- * Signature: (Ljava/lang/String;)J
- */
-static jlong hashString(JNIEnv* env, jclass /*class*/, jstring metricNameObj) {
- ScopedUtfChars name(env, metricNameObj);
- if (name.c_str() == nullptr) {
- return 0;
- }
-
- return static_cast<jlong>(farmhash::Fingerprint64(name.c_str(), name.size()));
-}
-
-static const JNINativeMethod g_methods[] = {
- {"hashString", "(Ljava/lang/String;)J", (void*)hashString},
-};
-
-static const char* const kUtilsPathName = "com/android/internal/expresslog/Utils";
-
-namespace android {
-
-int register_com_android_internal_expresslog_Utils(JNIEnv* env) {
- jclass stringClass = FindClassOrDie(env, "java/lang/String");
- g_stringClass = MakeGlobalRefOrDie(env, stringClass);
-
- return RegisterMethodsOrDie(env, kUtilsPathName, g_methods, NELEM(g_methods));
-}
-
-} // namespace android
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 48c9df0..035eaee 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -84,8 +84,8 @@
":BstatsTestApp",
":BinderDeathRecipientHelperApp1",
":BinderDeathRecipientHelperApp2",
+ ":com.android.cts.helpers.aosp",
],
- required: ["com.android.cts.helpers.aosp"],
}
// Rules to copy all the test apks to the intermediate raw resource directory
diff --git a/core/tests/expresslog/Android.bp b/core/tests/expresslog/Android.bp
deleted file mode 100644
index cab49a7..0000000
--- a/core/tests/expresslog/Android.bp
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2023 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 {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-android_test {
- name: "ExpressLogTests",
-
- srcs: [
- "src/**/*.java",
- ],
-
- static_libs: [
- "androidx.test.rules",
- "modules-utils-build",
- ],
-
- libs: [
- "android.test.base",
- "android.test.runner",
- ],
-
- platform_apis: true,
- test_suites: [
- "general-tests",
- ],
-
- certificate: "platform",
-}
diff --git a/core/tests/expresslog/AndroidManifest.xml b/core/tests/expresslog/AndroidManifest.xml
deleted file mode 100644
index 94a39e0..0000000
--- a/core/tests/expresslog/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2023 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- android:installLocation="internalOnly"
- package="com.android.internal.expresslog" >
-
- <application >
- <uses-library android:name="android.test.runner" />
- </application>
-
- <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.internal.expresslog"
- android:label="Telemetry Express Logging Helper Tests" />
-
-</manifest>
diff --git a/core/tests/expresslog/OWNERS b/core/tests/expresslog/OWNERS
deleted file mode 100644
index 3dc958b..0000000
--- a/core/tests/expresslog/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# Bug component: 719316
-# Stats/expresslog
-file:/services/core/java/com/android/server/stats/OWNERS
diff --git a/core/tests/expresslog/TEST_MAPPING b/core/tests/expresslog/TEST_MAPPING
deleted file mode 100644
index c9b0cf8..0000000
--- a/core/tests/expresslog/TEST_MAPPING
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "presubmit": [
- {
- "name": "ExpressLogTests",
- "options": [
- {
- "exclude-annotation": "org.junit.Ignore"
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/core/tests/expresslog/src/com/android/internal/expresslog/ScaledRangeOptionsTest.java b/core/tests/expresslog/src/com/android/internal/expresslog/ScaledRangeOptionsTest.java
deleted file mode 100644
index ee62d75..0000000
--- a/core/tests/expresslog/src/com/android/internal/expresslog/ScaledRangeOptionsTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2023 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 com.android.internal.expresslog;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-@SmallTest
-public class ScaledRangeOptionsTest {
- private static final String TAG = ScaledRangeOptionsTest.class.getSimpleName();
-
- @Test
- public void testGetBinsCount() {
- Histogram.ScaledRangeOptions options1 = new Histogram.ScaledRangeOptions(1, 100, 100, 2);
- assertEquals(3, options1.getBinsCount());
-
- Histogram.ScaledRangeOptions options10 = new Histogram.ScaledRangeOptions(10, 100, 100, 2);
- assertEquals(12, options10.getBinsCount());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructZeroBinsCount() {
- new Histogram.ScaledRangeOptions(0, 100, 100, 2);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructNegativeBinsCount() {
- new Histogram.ScaledRangeOptions(-1, 100, 100, 2);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructNegativeFirstBinWidth() {
- new Histogram.ScaledRangeOptions(10, 100, -100, 2);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructTooSmallFirstBinWidth() {
- new Histogram.ScaledRangeOptions(10, 100, 0.5f, 2);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructNegativeScaleFactor() {
- new Histogram.ScaledRangeOptions(10, 100, 100, -2);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructTooSmallScaleFactor() {
- new Histogram.ScaledRangeOptions(10, 100, 100, 0.5f);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructTooBigScaleFactor() {
- new Histogram.ScaledRangeOptions(10, 100, 100, 500.f);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructTooBigBinRange() {
- new Histogram.ScaledRangeOptions(100, 100, 100, 10.f);
- }
-
- @Test
- public void testBinIndexForRangeEqual1() {
- Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(10, 1, 1, 1);
- assertEquals(12, options.getBinsCount());
-
- assertEquals(11, options.getBinForSample(11));
-
- for (int i = 0, bins = options.getBinsCount(); i < bins; i++) {
- assertEquals(i, options.getBinForSample(i));
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual2() {
- // this should produce bin otpions similar to linear histogram with bin width 2
- Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(10, 1, 2, 1);
- assertEquals(12, options.getBinsCount());
-
- for (int i = 0, bins = options.getBinsCount(); i < bins; i++) {
- assertEquals(i, options.getBinForSample(i * 2));
- assertEquals(i, options.getBinForSample(i * 2 - 1));
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual5() {
- Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(2, 0, 5, 1);
- assertEquals(4, options.getBinsCount());
- for (int i = 0; i < 2; i++) {
- for (int sample = 0; sample < 5; sample++) {
- assertEquals(i + 1, options.getBinForSample(i * 5 + sample));
- }
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual10() {
- Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(10, 1, 10, 1);
- assertEquals(0, options.getBinForSample(0));
- assertEquals(options.getBinsCount() - 2, options.getBinForSample(100));
- assertEquals(options.getBinsCount() - 1, options.getBinForSample(101));
-
- final float binSize = (101 - 1) / 10f;
- for (int i = 1, bins = options.getBinsCount() - 1; i < bins; i++) {
- assertEquals(i, options.getBinForSample(i * binSize));
- }
- }
-
- @Test
- public void testBinIndexForScaleFactor2() {
- final int binsCount = 10;
- final int minValue = 10;
- final int firstBinWidth = 5;
- final int scaledFactor = 2;
-
- Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(
- binsCount, minValue, firstBinWidth, scaledFactor);
- assertEquals(binsCount + 2, options.getBinsCount());
- long[] binCounts = new long[10];
-
- // precalculate max valid value - start value for the overflow bin
- int lastBinStartValue = minValue; //firstBinMin value
- int lastBinWidth = firstBinWidth;
- for (int binIdx = 2; binIdx <= binsCount + 1; binIdx++) {
- lastBinStartValue = lastBinStartValue + lastBinWidth;
- lastBinWidth *= scaledFactor;
- }
-
- // underflow bin
- for (int i = 1; i < minValue; i++) {
- assertEquals(0, options.getBinForSample(i));
- }
-
- for (int i = 10; i < lastBinStartValue; i++) {
- assertTrue(options.getBinForSample(i) > 0);
- assertTrue(options.getBinForSample(i) <= binsCount);
- binCounts[options.getBinForSample(i) - 1]++;
- }
-
- // overflow bin
- assertEquals(binsCount + 1, options.getBinForSample(lastBinStartValue));
-
- for (int i = 1; i < binsCount; i++) {
- assertEquals(binCounts[i], binCounts[i - 1] * 2L);
- }
- }
-}
diff --git a/core/tests/expresslog/src/com/android/internal/expresslog/UniformOptionsTest.java b/core/tests/expresslog/src/com/android/internal/expresslog/UniformOptionsTest.java
deleted file mode 100644
index 037dbb3..0000000
--- a/core/tests/expresslog/src/com/android/internal/expresslog/UniformOptionsTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2023 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 com.android.internal.expresslog;
-
-import androidx.test.filters.SmallTest;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-@SmallTest
-public class UniformOptionsTest {
- private static final String TAG = UniformOptionsTest.class.getSimpleName();
-
- @Test
- public void testGetBinsCount() {
- Histogram.UniformOptions options1 = new Histogram.UniformOptions(1, 100, 1000);
- assertEquals(3, options1.getBinsCount());
-
- Histogram.UniformOptions options10 = new Histogram.UniformOptions(10, 100, 1000);
- assertEquals(12, options10.getBinsCount());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructZeroBinsCount() {
- new Histogram.UniformOptions(0, 100, 1000);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructNegativeBinsCount() {
- new Histogram.UniformOptions(-1, 100, 1000);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testConstructMaxValueLessThanMinValue() {
- new Histogram.UniformOptions(10, 1000, 100);
- }
-
- @Test
- public void testBinIndexForRangeEqual1() {
- Histogram.UniformOptions options = new Histogram.UniformOptions(10, 1, 11);
- for (int i = 0, bins = options.getBinsCount(); i < bins; i++) {
- assertEquals(i, options.getBinForSample(i));
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual2() {
- Histogram.UniformOptions options = new Histogram.UniformOptions(10, 1, 21);
- for (int i = 0, bins = options.getBinsCount(); i < bins; i++) {
- assertEquals(i, options.getBinForSample(i * 2));
- assertEquals(i, options.getBinForSample(i * 2 - 1));
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual5() {
- Histogram.UniformOptions options = new Histogram.UniformOptions(2, 0, 10);
- assertEquals(4, options.getBinsCount());
- for (int i = 0; i < 2; i++) {
- for (int sample = 0; sample < 5; sample++) {
- assertEquals(i + 1, options.getBinForSample(i * 5 + sample));
- }
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual10() {
- Histogram.UniformOptions options = new Histogram.UniformOptions(10, 1, 101);
- assertEquals(0, options.getBinForSample(0));
- assertEquals(options.getBinsCount() - 2, options.getBinForSample(100));
- assertEquals(options.getBinsCount() - 1, options.getBinForSample(101));
-
- final float binSize = (101 - 1) / 10f;
- for (int i = 1, bins = options.getBinsCount() - 1; i < bins; i++) {
- assertEquals(i, options.getBinForSample(i * binSize));
- }
- }
-
- @Test
- public void testBinIndexForRangeEqual90() {
- final int binCount = 10;
- final int minValue = 100;
- final int maxValue = 100000;
-
- Histogram.UniformOptions options = new Histogram.UniformOptions(binCount, minValue,
- maxValue);
-
- // logging underflow sample
- assertEquals(0, options.getBinForSample(minValue - 1));
-
- // logging overflow sample
- assertEquals(binCount + 1, options.getBinForSample(maxValue));
- assertEquals(binCount + 1, options.getBinForSample(maxValue + 1));
-
- // logging min edge sample
- assertEquals(1, options.getBinForSample(minValue));
-
- // logging max edge sample
- assertEquals(binCount, options.getBinForSample(maxValue - 1));
-
- // logging single valid sample per bin
- final int binSize = (maxValue - minValue) / binCount;
-
- for (int i = 0; i < binCount; i++) {
- assertEquals(i + 1, options.getBinForSample(minValue + binSize * i));
- }
- }
-}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 6a14dea..d885cd1 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -155,6 +155,7 @@
"android.hardware.health-V2-java", // AIDL
"android.hardware.health-translate-java",
"android.hardware.light-V1-java",
+ "android.hardware.security.rkp-V3-java",
"android.hardware.tv.cec-V1.1-java",
"android.hardware.tv.hdmi.cec-V1-java",
"android.hardware.tv.hdmi.connection-V1-java",
@@ -171,6 +172,7 @@
"android.hardware.power-V3-java",
"android.hidl.manager-V1.2-java",
"capture_state_listener-aidl-java",
+ "cbor-java",
"icu4j_calendar_astronomer",
"netd-client",
"overlayable_policy_aidl-java",
diff --git a/services/core/java/com/android/server/biometrics/OWNERS b/services/core/java/com/android/server/biometrics/OWNERS
index cd281e0..1bf2aef 100644
--- a/services/core/java/com/android/server/biometrics/OWNERS
+++ b/services/core/java/com/android/server/biometrics/OWNERS
@@ -6,6 +6,10 @@
jbolinger@google.com
jeffpu@google.com
joshmccloskey@google.com
+diyab@google.com
+austindelgado@google.com
+spdonghao@google.com
+wenhuiy@google.com
firewall@google.com
jasonsfchang@google.com
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 54189bf7..237485b 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -1670,9 +1670,11 @@
// TODO(b/216365040): The decision to prevent HBM for HDR in low power mode should be
// done in HighBrightnessModeController.
if (mHbmController.getHighBrightnessMode() == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR
- && (mBrightnessReason.modifier & BrightnessReason.MODIFIER_DIMMED) == 0
- && (mBrightnessReason.modifier & BrightnessReason.MODIFIER_LOW_POWER) == 0) {
- // We want to scale HDR brightness level with the SDR level
+ && (mBrightnessReasonTemp.modifier & BrightnessReason.MODIFIER_DIMMED) == 0
+ && (mBrightnessReasonTemp.modifier & BrightnessReason.MODIFIER_LOW_POWER)
+ == 0) {
+ // We want to scale HDR brightness level with the SDR level, we also need to restore
+ // SDR brightness immediately when entering dim or low power mode.
animateValue = mHbmController.getHdrBrightnessValue();
}
diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java
index cd1a968..97e4636 100644
--- a/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java
+++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java
@@ -19,14 +19,18 @@
import android.content.Context;
import android.os.Binder;
import android.os.OutcomeReceiver;
+import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.security.rkp.IGetRegistrationCallback;
import android.security.rkp.IRemoteProvisioning;
import android.security.rkp.service.RegistrationProxy;
import android.util.Log;
+import com.android.internal.util.DumpUtils;
import com.android.server.SystemService;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.time.Duration;
import java.util.concurrent.Executor;
@@ -97,5 +101,18 @@
Binder.restoreCallingIdentity(callingIdentity);
}
}
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return;
+ new RemoteProvisioningShellCommand().dump(pw);
+ }
+
+ @Override
+ public int handleShellCommand(ParcelFileDescriptor in, ParcelFileDescriptor out,
+ ParcelFileDescriptor err, String[] args) {
+ return new RemoteProvisioningShellCommand().exec(this, in.getFileDescriptor(),
+ out.getFileDescriptor(), err.getFileDescriptor(), args);
+ }
}
}
diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java
new file mode 100644
index 0000000..bc39084
--- /dev/null
+++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2023 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 com.android.server.security.rkp;
+
+import android.hardware.security.keymint.DeviceInfo;
+import android.hardware.security.keymint.IRemotelyProvisionedComponent;
+import android.hardware.security.keymint.MacedPublicKey;
+import android.hardware.security.keymint.ProtectedData;
+import android.hardware.security.keymint.RpcHardwareInfo;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.ShellCommand;
+import android.util.IndentingPrintWriter;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.util.Base64;
+
+import co.nstant.in.cbor.CborDecoder;
+import co.nstant.in.cbor.CborEncoder;
+import co.nstant.in.cbor.CborException;
+import co.nstant.in.cbor.model.Array;
+import co.nstant.in.cbor.model.ByteString;
+import co.nstant.in.cbor.model.DataItem;
+import co.nstant.in.cbor.model.Map;
+import co.nstant.in.cbor.model.SimpleValue;
+import co.nstant.in.cbor.model.UnsignedInteger;
+
+class RemoteProvisioningShellCommand extends ShellCommand {
+ private static final String USAGE = "usage: cmd remote_provisioning SUBCOMMAND [ARGS]\n"
+ + "help\n"
+ + " Show this message.\n"
+ + "dump\n"
+ + " Dump service diagnostics.\n"
+ + "list [--min-version MIN_VERSION]\n"
+ + " List the names of the IRemotelyProvisionedComponent instances.\n"
+ + "csr [--challenge CHALLENGE] NAME\n"
+ + " Generate and print a base64-encoded CSR from the named\n"
+ + " IRemotelyProvisionedComponent. A base64-encoded challenge can be provided,\n"
+ + " or else it defaults to an empty challenge.\n";
+
+ @VisibleForTesting
+ static final String EEK_ED25519_BASE64 = "goRDoQEnoFgqpAEBAycgBiFYIJm57t1e5FL2hcZMYtw+YatXSH11N"
+ + "ymtdoAy0rPLY1jZWEAeIghLpLekyNdOAw7+uK8UTKc7b6XN3Np5xitk/pk5r3bngPpmAIUNB5gqrJFcpyUUS"
+ + "QY0dcqKJ3rZ41pJ6wIDhEOhASegWE6lAQECWCDQrsEVyirPc65rzMvRlh1l6LHd10oaN7lDOpfVmd+YCAM4G"
+ + "CAEIVggvoXnRsSjQlpA2TY6phXQLFh+PdwzAjLS/F4ehyVfcmBYQJvPkOIuS6vRGLEOjl0gJ0uEWP78MpB+c"
+ + "gWDvNeCvvpkeC1UEEvAMb9r6B414vAtzmwvT/L1T6XUg62WovGHWAQ=";
+
+ @VisibleForTesting
+ static final String EEK_P256_BASE64 = "goRDoQEmoFhNpQECAyYgASFYIPcUituX9MxT79JkEcTjdR9mH6RxDGzP"
+ + "+glGgHSHVPKtIlggXn9b9uzk9hnM/xM3/Q+hyJPbGAZ2xF3m12p3hsMtr49YQC+XjkL7vgctlUeFR5NAsB/U"
+ + "m0ekxESp8qEHhxDHn8sR9L+f6Dvg5zRMFfx7w34zBfTRNDztAgRgehXgedOK/ySEQ6EBJqBYcaYBAgJYIDVz"
+ + "tz+gioCJsSZn6ct8daGvAmH8bmUDkTvTS30UlD5GAzgYIAEhWCDgQc8vDzQPHDMsQbDP1wwwVTXSHmpHE0su"
+ + "0UiWfiScaCJYIB/ORcX7YbqBIfnlBZubOQ52hoZHuB4vRfHOr9o/gGjbWECMs7p+ID4ysGjfYNEdffCsOI5R"
+ + "vP9s4Wc7Snm8Vnizmdh8igfY2rW1f3H02GvfMyc0e2XRKuuGmZirOrSAqr1Q";
+
+ private static final int ERROR = -1;
+ private static final int SUCCESS = 0;
+
+ private final Injector mInjector;
+
+ RemoteProvisioningShellCommand() {
+ this(new Injector());
+ }
+
+ @VisibleForTesting
+ RemoteProvisioningShellCommand(Injector injector) {
+ mInjector = injector;
+ }
+
+ @Override
+ public void onHelp() {
+ getOutPrintWriter().print(USAGE);
+ }
+
+ @Override
+ @SuppressWarnings("CatchAndPrintStackTrace")
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+ try {
+ switch (cmd) {
+ case "list":
+ return list();
+ case "csr":
+ return csr();
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ } catch (Exception e) {
+ e.printStackTrace(getErrPrintWriter());
+ return ERROR;
+ }
+ }
+
+ @SuppressWarnings("CatchAndPrintStackTrace")
+ void dump(PrintWriter pw) {
+ try {
+ IndentingPrintWriter ipw = new IndentingPrintWriter(pw);
+ for (String name : mInjector.getIrpcNames()) {
+ ipw.println(name + ":");
+ ipw.increaseIndent();
+ dumpRpcInstance(ipw, name);
+ ipw.decreaseIndent();
+ }
+ } catch (Exception e) {
+ e.printStackTrace(pw);
+ }
+ }
+
+ private void dumpRpcInstance(PrintWriter pw, String name) throws RemoteException {
+ RpcHardwareInfo info = mInjector.getIrpcBinder(name).getHardwareInfo();
+ pw.println("hwVersion=" + info.versionNumber);
+ pw.println("rpcAuthorName=" + info.rpcAuthorName);
+ if (info.versionNumber < 3) {
+ pw.println("supportedEekCurve=" + info.supportedEekCurve);
+ }
+ pw.println("uniqueId=" + info.uniqueId);
+ if (info.versionNumber >= 3) {
+ pw.println("supportedNumKeysInCsr=" + info.supportedNumKeysInCsr);
+ }
+ }
+
+ private int list() throws RemoteException {
+ for (String name : mInjector.getIrpcNames()) {
+ getOutPrintWriter().println(name);
+ }
+ return SUCCESS;
+ }
+
+ private int csr() throws RemoteException, CborException {
+ byte[] challenge = {};
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "--challenge":
+ challenge = Base64.getDecoder().decode(getNextArgRequired());
+ break;
+ default:
+ getErrPrintWriter().println("error: unknown option " + opt);
+ return ERROR;
+ }
+ }
+ String name = getNextArgRequired();
+
+ IRemotelyProvisionedComponent binder = mInjector.getIrpcBinder(name);
+ RpcHardwareInfo info = binder.getHardwareInfo();
+ MacedPublicKey[] emptyKeys = new MacedPublicKey[] {};
+ byte[] csrBytes;
+ switch (info.versionNumber) {
+ case 1:
+ case 2:
+ DeviceInfo deviceInfo = new DeviceInfo();
+ ProtectedData protectedData = new ProtectedData();
+ byte[] eek = getEekChain(info.supportedEekCurve);
+ byte[] keysToSignMac = binder.generateCertificateRequest(
+ /*testMode=*/false, emptyKeys, eek, challenge, deviceInfo, protectedData);
+ csrBytes = composeCertificateRequestV1(
+ deviceInfo, challenge, protectedData, keysToSignMac);
+ break;
+ case 3:
+ csrBytes = binder.generateCertificateRequestV2(emptyKeys, challenge);
+ break;
+ default:
+ getErrPrintWriter().println("error: unsupported hwVersion: " + info.versionNumber);
+ return ERROR;
+ }
+ getOutPrintWriter().println(Base64.getEncoder().encodeToString(csrBytes));
+ return SUCCESS;
+ }
+
+ private byte[] getEekChain(int supportedEekCurve) {
+ switch (supportedEekCurve) {
+ case RpcHardwareInfo.CURVE_25519:
+ return Base64.getDecoder().decode(EEK_ED25519_BASE64);
+ case RpcHardwareInfo.CURVE_P256:
+ return Base64.getDecoder().decode(EEK_P256_BASE64);
+ default:
+ throw new IllegalArgumentException("unsupported EEK curve: " + supportedEekCurve);
+ }
+ }
+
+ private byte[] composeCertificateRequestV1(DeviceInfo deviceInfo, byte[] challenge,
+ ProtectedData protectedData, byte[] keysToSignMac) throws CborException {
+ Array info = new Array()
+ .add(decode(deviceInfo.deviceInfo))
+ .add(new Map());
+
+ // COSE_Signature with the hmac-sha256 algorithm and without a payload.
+ Array mac = new Array()
+ .add(new ByteString(encode(
+ new Map().put(new UnsignedInteger(1), new UnsignedInteger(5)))))
+ .add(new Map())
+ .add(SimpleValue.NULL)
+ .add(new ByteString(keysToSignMac));
+
+ Array csr = new Array()
+ .add(info)
+ .add(new ByteString(challenge))
+ .add(decode(protectedData.protectedData))
+ .add(mac);
+
+ return encode(csr);
+ }
+
+ private byte[] encode(DataItem item) throws CborException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ new CborEncoder(baos).encode(item);
+ return baos.toByteArray();
+ }
+
+ private DataItem decode(byte[] data) throws CborException {
+ ByteArrayInputStream bais = new ByteArrayInputStream(data);
+ return new CborDecoder(bais).decodeNext();
+ }
+
+ @VisibleForTesting
+ static class Injector {
+ String[] getIrpcNames() {
+ return ServiceManager.getDeclaredInstances(IRemotelyProvisionedComponent.DESCRIPTOR);
+ }
+
+ IRemotelyProvisionedComponent getIrpcBinder(String name) {
+ String irpc = IRemotelyProvisionedComponent.DESCRIPTOR + "/" + name;
+ IRemotelyProvisionedComponent binder =
+ IRemotelyProvisionedComponent.Stub.asInterface(
+ ServiceManager.waitForDeclaredService(irpc));
+ if (binder == null) {
+ throw new IllegalArgumentException("failed to find " + irpc);
+ }
+ return binder;
+ }
+ }
+}
diff --git a/services/core/jni/OWNERS b/services/core/jni/OWNERS
index 2584b86..d9acf41 100644
--- a/services/core/jni/OWNERS
+++ b/services/core/jni/OWNERS
@@ -27,3 +27,4 @@
per-file com_android_server_tv_* = file:/media/java/android/media/tv/OWNERS
per-file com_android_server_vibrator_* = file:/services/core/java/com/android/server/vibrator/OWNERS
per-file com_android_server_am_CachedAppOptimizer.cpp = timmurray@google.com, edgararriaga@google.com, dualli@google.com, carmenjackson@google.com, philipcuadra@google.com
+per-file com_android_server_companion_virtual_InputController.cpp = file:/services/companion/java/com/android/server/companion/virtual/OWNERS
diff --git a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java
new file mode 100644
index 0000000..77c3396
--- /dev/null
+++ b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2023 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 com.android.server.security.rkp;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.security.keymint.DeviceInfo;
+import android.hardware.security.keymint.IRemotelyProvisionedComponent;
+import android.hardware.security.keymint.MacedPublicKey;
+import android.hardware.security.keymint.ProtectedData;
+import android.hardware.security.keymint.RpcHardwareInfo;
+import android.os.Binder;
+import android.os.FileUtils;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Map;
+
+@RunWith(AndroidJUnit4.class)
+public class RemoteProvisioningShellCommandTest {
+
+ private static class Injector extends RemoteProvisioningShellCommand.Injector {
+
+ private final Map<String, IRemotelyProvisionedComponent> mIrpcs;
+
+ Injector(Map irpcs) {
+ mIrpcs = irpcs;
+ }
+
+ @Override
+ String[] getIrpcNames() {
+ return mIrpcs.keySet().toArray(new String[0]);
+ }
+
+ @Override
+ IRemotelyProvisionedComponent getIrpcBinder(String name) {
+ IRemotelyProvisionedComponent irpc = mIrpcs.get(name);
+ if (irpc == null) {
+ throw new IllegalArgumentException("failed to find " + irpc);
+ }
+ return irpc;
+ }
+ }
+
+ private static class CommandResult {
+ private int mCode;
+ private String mOut;
+ private String mErr;
+
+ CommandResult(int code, String out, String err) {
+ mCode = code;
+ mOut = out;
+ mErr = err;
+ }
+
+ int getCode() {
+ return mCode;
+ }
+
+ String getOut() {
+ return mOut;
+ }
+
+ String getErr() {
+ return mErr;
+ }
+ }
+
+ private static CommandResult exec(
+ RemoteProvisioningShellCommand cmd, String[] args) throws Exception {
+ File in = File.createTempFile("rpsct_in_", null);
+ File out = File.createTempFile("rpsct_out_", null);
+ File err = File.createTempFile("rpsct_err_", null);
+ int code = cmd.exec(
+ new Binder(),
+ new FileInputStream(in).getFD(),
+ new FileOutputStream(out).getFD(),
+ new FileOutputStream(err).getFD(),
+ args);
+ return new CommandResult(
+ code, FileUtils.readTextFile(out, 0, null), FileUtils.readTextFile(err, 0, null));
+ }
+
+ @Test
+ public void list_zeroInstances() throws Exception {
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of()));
+ CommandResult res = exec(cmd, new String[] {"list"});
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ assertThat(res.getOut()).isEmpty();
+ }
+
+ @Test
+ public void list_oneInstances() throws Exception {
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of("default", mock(IRemotelyProvisionedComponent.class))));
+ CommandResult res = exec(cmd, new String[] {"list"});
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ assertThat(Arrays.asList(res.getOut().split("\n"))).containsExactly("default");
+ }
+
+ @Test
+ public void list_twoInstances() throws Exception {
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of(
+ "default", mock(IRemotelyProvisionedComponent.class),
+ "strongbox", mock(IRemotelyProvisionedComponent.class))));
+ CommandResult res = exec(cmd, new String[] {"list"});
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ assertThat(Arrays.asList(res.getOut().split("\n"))).containsExactly("default", "strongbox");
+ }
+
+ @Test
+ public void csr_hwVersion1_withChallenge() throws Exception {
+ IRemotelyProvisionedComponent defaultMock = mock(IRemotelyProvisionedComponent.class);
+ RpcHardwareInfo defaultInfo = new RpcHardwareInfo();
+ defaultInfo.versionNumber = 1;
+ defaultInfo.supportedEekCurve = RpcHardwareInfo.CURVE_25519;
+ when(defaultMock.getHardwareInfo()).thenReturn(defaultInfo);
+ doAnswer(invocation -> {
+ ((DeviceInfo) invocation.getArgument(4)).deviceInfo = new byte[] {0x00};
+ ((ProtectedData) invocation.getArgument(5)).protectedData = new byte[] {0x00};
+ return new byte[] {0x77, 0x77, 0x77, 0x77};
+ }).when(defaultMock).generateCertificateRequest(
+ anyBoolean(), any(), any(), any(), any(), any());
+
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of("default", defaultMock)));
+ CommandResult res = exec(cmd, new String[] {
+ "csr", "--challenge", "dGVzdHRlc3R0ZXN0dGVzdA==", "default"});
+ verify(defaultMock).generateCertificateRequest(
+ /*test_mode=*/eq(false),
+ eq(new MacedPublicKey[0]),
+ eq(Base64.getDecoder().decode(RemoteProvisioningShellCommand.EEK_ED25519_BASE64)),
+ eq(new byte[] {
+ 0x74, 0x65, 0x73, 0x74, 0x74, 0x65, 0x73, 0x74,
+ 0x74, 0x65, 0x73, 0x74, 0x74, 0x65, 0x73, 0x74}),
+ any(DeviceInfo.class),
+ any(ProtectedData.class));
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ }
+
+ @Test
+ public void csr_hwVersion2_withChallenge() throws Exception {
+ IRemotelyProvisionedComponent defaultMock = mock(IRemotelyProvisionedComponent.class);
+ RpcHardwareInfo defaultInfo = new RpcHardwareInfo();
+ defaultInfo.versionNumber = 2;
+ defaultInfo.supportedEekCurve = RpcHardwareInfo.CURVE_P256;
+ when(defaultMock.getHardwareInfo()).thenReturn(defaultInfo);
+ doAnswer(invocation -> {
+ ((DeviceInfo) invocation.getArgument(4)).deviceInfo = new byte[] {0x00};
+ ((ProtectedData) invocation.getArgument(5)).protectedData = new byte[] {0x00};
+ return new byte[] {0x77, 0x77, 0x77, 0x77};
+ }).when(defaultMock).generateCertificateRequest(
+ anyBoolean(), any(), any(), any(), any(), any());
+
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of("default", defaultMock)));
+ CommandResult res = exec(cmd, new String[] {
+ "csr", "--challenge", "dGVzdHRlc3R0ZXN0dGVzdA==", "default"});
+ verify(defaultMock).generateCertificateRequest(
+ /*test_mode=*/eq(false),
+ eq(new MacedPublicKey[0]),
+ eq(Base64.getDecoder().decode(RemoteProvisioningShellCommand.EEK_P256_BASE64)),
+ eq(new byte[] {
+ 0x74, 0x65, 0x73, 0x74, 0x74, 0x65, 0x73, 0x74,
+ 0x74, 0x65, 0x73, 0x74, 0x74, 0x65, 0x73, 0x74}),
+ any(DeviceInfo.class),
+ any(ProtectedData.class));
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ }
+
+ @Test
+ public void csr_hwVersion3_withoutChallenge() throws Exception {
+ IRemotelyProvisionedComponent defaultMock = mock(IRemotelyProvisionedComponent.class);
+ RpcHardwareInfo defaultInfo = new RpcHardwareInfo();
+ defaultInfo.versionNumber = 3;
+ when(defaultMock.getHardwareInfo()).thenReturn(defaultInfo);
+ when(defaultMock.generateCertificateRequestV2(any(), any()))
+ .thenReturn(new byte[] {0x68, 0x65, 0x6c, 0x6c, 0x6f});
+
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of("default", defaultMock)));
+ CommandResult res = exec(cmd, new String[] {"csr", "default"});
+ verify(defaultMock).generateCertificateRequestV2(new MacedPublicKey[0], new byte[0]);
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ assertThat(res.getOut()).isEqualTo("aGVsbG8=\n");
+ }
+
+ @Test
+ public void csr_hwVersion3_withChallenge() throws Exception {
+ IRemotelyProvisionedComponent defaultMock = mock(IRemotelyProvisionedComponent.class);
+ RpcHardwareInfo defaultInfo = new RpcHardwareInfo();
+ defaultInfo.versionNumber = 3;
+ when(defaultMock.getHardwareInfo()).thenReturn(defaultInfo);
+ when(defaultMock.generateCertificateRequestV2(any(), any()))
+ .thenReturn(new byte[] {0x68, 0x69});
+
+ RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand(
+ new Injector(Map.of("default", defaultMock)));
+ CommandResult res = exec(cmd, new String[] {"csr", "--challenge", "dHJpYWw=", "default"});
+ verify(defaultMock).generateCertificateRequestV2(
+ new MacedPublicKey[0], new byte[] {0x74, 0x72, 0x69, 0x61, 0x6c});
+ assertThat(res.getErr()).isEmpty();
+ assertThat(res.getCode()).isEqualTo(0);
+ assertThat(res.getOut()).isEqualTo("aGk=\n");
+ }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/rollback/OWNERS b/services/tests/mockingservicestests/src/com/android/server/rollback/OWNERS
new file mode 100644
index 0000000..daa0211
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/rollback/OWNERS
@@ -0,0 +1,3 @@
+ancr@google.com
+harshitmahajan@google.com
+robertogil@google.com
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index d622a80..40d9948 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -103,6 +103,9 @@
data: [
":JobTestApp",
":StubTestApp",
+ ":SimpleServiceTestApp1",
+ ":SimpleServiceTestApp2",
+ ":SimpleServiceTestApp3",
],
java_resources: [
diff --git a/telephony/java/android/telephony/TelephonyScanManager.java b/telephony/java/android/telephony/TelephonyScanManager.java
index 19f2a9b..b761709 100644
--- a/telephony/java/android/telephony/TelephonyScanManager.java
+++ b/telephony/java/android/telephony/TelephonyScanManager.java
@@ -153,8 +153,9 @@
nsi = mScanInfo.get(message.arg2);
}
if (nsi == null) {
- throw new RuntimeException(
- "Failed to find NetworkScanInfo with id " + message.arg2);
+ Rlog.e(TAG, "Unexpceted message " + message.what
+ + " as there is no NetworkScanInfo with id " + message.arg2);
+ return;
}
final NetworkScanCallback callback = nsi.mCallback;
diff --git a/tests/ActivityManagerPerfTests/utils/Android.bp b/tests/ActivityManagerPerfTests/utils/Android.bp
index 99c43c8..5902c1c 100644
--- a/tests/ActivityManagerPerfTests/utils/Android.bp
+++ b/tests/ActivityManagerPerfTests/utils/Android.bp
@@ -32,6 +32,6 @@
static_libs: [
"androidx.test.rules",
"junit",
- "ub-uiautomator",
+ "androidx.test.uiautomator_uiautomator",
],
}
diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
index fc787ba..9bd94f2 100644
--- a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
+++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
@@ -19,10 +19,10 @@
import android.content.Intent;
import android.os.RemoteException;
import android.os.ResultReceiver;
-import android.support.test.uiautomator.UiDevice;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
+import androidx.test.uiautomator.UiDevice;
import java.io.IOException;