diff options
15 files changed, 571 insertions, 86 deletions
diff --git a/apct-tests/perftests/core/src/android/libcore/XmlSerializerPerfTest.java b/apct-tests/perftests/core/src/android/libcore/XmlSerializerPerfTest.java new file mode 100644 index 000000000000..412cb5acbf8b --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/XmlSerializerPerfTest.java @@ -0,0 +1,106 @@ +/* + * 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.libcore; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; +import android.util.Xml; + +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.XmlObjectFactory; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlSerializer; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; + +/** + * Compares various kinds of method invocation. + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class XmlSerializerPerfTest { + + @Rule + public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Test + public void timeFastSerializer_nonIndent_depth100() throws IOException { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + XmlSerializer serializer = Xml.newFastSerializer(); + runTest(serializer, 100); + } + } + + @Test + public void timeFastSerializer_indent_depth100() throws IOException { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + XmlSerializer serializer = Xml.newFastSerializer(); + serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + runTest(serializer, 100); + } + } + + @Test + public void timeKXmlSerializer_nonIndent_depth100() throws IOException { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + XmlSerializer serializer = XmlObjectFactory.newXmlSerializer(); + runTest(serializer, 100); + } + } + + @Test + public void timeKXmlSerializer_indent_depth100() throws IOException { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + XmlSerializer serializer = XmlObjectFactory.newXmlSerializer(); + serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + runTest(serializer, 100); + } + } + + private void runTest(XmlSerializer serializer, int depth) throws IOException { + File file = File.createTempFile(XmlSerializerPerfTest.class.getSimpleName(), "tmp"); + try (OutputStream out = new FileOutputStream(file)) { + serializer.setOutput(out, StandardCharsets.UTF_8.name()); + serializer.startDocument(null, true); + writeContent(serializer, depth); + serializer.endDocument(); + } + } + + private void writeContent(XmlSerializer serializer, int depth) throws IOException { + serializer.startTag(null, "tag"); + serializer.attribute(null, "attribute", "value1"); + if (depth > 0) { + writeContent(serializer, depth - 1); + } + serializer.endTag(null, "tag"); + } + +} diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index 2da00c7a8e2c..50a77f371b6e 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -517,7 +517,6 @@ public class InternalResourceService extends SystemService { removedPkgs.add(pkgInfo.packageName); mUidToPackageCache.remove(pkgInfo.applicationInfo.uid); mPkgCache.remove(i); - break; } } mAgent.onUserRemovedLocked(userId, removedPkgs); diff --git a/core/java/com/android/internal/backup/OWNERS b/core/java/com/android/internal/backup/OWNERS new file mode 100644 index 000000000000..53b6c78b3895 --- /dev/null +++ b/core/java/com/android/internal/backup/OWNERS @@ -0,0 +1 @@ +include /services/backup/OWNERS
\ No newline at end of file diff --git a/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java b/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java index a03bac45d14f..90ad34d6924f 100644 --- a/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java +++ b/core/java/com/android/internal/os/SystemServerClassLoaderFactory.java @@ -87,6 +87,10 @@ public final class SystemServerClassLoaderFactory { if (isTestOnly) { return true; } + // If system server is being profiled, it's OK to create class loaders anytime. + if (ZygoteInit.shouldProfileSystemServer()) { + return true; + } return false; } diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 73fb7fe0be49..076e4e118e66 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -238,6 +238,21 @@ public class ZygoteInit { Trace.traceEnd(Trace.TRACE_TAG_DALVIK); } + private static boolean isExperimentEnabled(String experiment) { + boolean defaultValue = SystemProperties.getBoolean( + "dalvik.vm." + experiment, + /*def=*/false); + // Can't use device_config since we are the zygote, and it's not initialized at this point. + return SystemProperties.getBoolean( + "persist.device_config." + DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT + + "." + experiment, + defaultValue); + } + + /* package-private */ static boolean shouldProfileSystemServer() { + return isExperimentEnabled("profilesystemserver"); + } + /** * Performs Zygote process initialization. Loads and initializes commonly used classes. * @@ -341,14 +356,7 @@ public class ZygoteInit { // If we are profiling the boot image, reset the Jit counters after preloading the // classes. We want to preload for performance, and we can use method counters to // infer what clases are used after calling resetJitCounters, for profile purposes. - // Can't use device_config since we are the zygote. - String prop = SystemProperties.get( - "persist.device_config.runtime_native_boot.profilebootclasspath", ""); - // Might be empty if the property is unset since the default is "". - if (prop.length() == 0) { - prop = SystemProperties.get("dalvik.vm.profilebootclasspath", ""); - } - if ("true".equals(prop)) { + if (isExperimentEnabled("profilebootclasspath")) { Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "ResetJitCounters"); VMRuntime.resetJitCounters(); Trace.traceEnd(Trace.TRACE_TAG_DALVIK); @@ -489,16 +497,6 @@ public class ZygoteInit { ZygoteHooks.gcAndFinalize(); } - private static boolean shouldProfileSystemServer() { - boolean defaultValue = SystemProperties.getBoolean("dalvik.vm.profilesystemserver", - /*default=*/ false); - // Can't use DeviceConfig since it's not initialized at this point. - return SystemProperties.getBoolean( - "persist.device_config." + DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT - + ".profilesystemserver", - defaultValue); - } - /** * Finish remaining work for the newly forked system server process. */ @@ -585,6 +583,13 @@ public class ZygoteInit { * in the forked system server process in the zygote SELinux domain. */ private static void prefetchStandaloneSystemServerJars() { + if (shouldProfileSystemServer()) { + // We don't prefetch AOT artifacts if we are profiling system server, as we are going to + // JIT it. + // This method only gets called from native and should already be skipped if we profile + // system server. Still, be robust and check it again. + return; + } String envStr = Os.getenv("STANDALONE_SYSTEMSERVER_JARS"); if (TextUtils.isEmpty(envStr)) { return; diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index cbc34629e8c4..312b692e08ab 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -343,6 +343,7 @@ enum MountExternalKind { // Must match values in com.android.internal.os.Zygote. enum RuntimeFlags : uint32_t { DEBUG_ENABLE_JDWP = 1, + PROFILE_SYSTEM_SERVER = 1 << 14, PROFILE_FROM_SHELL = 1 << 15, MEMORY_TAG_LEVEL_MASK = (1 << 19) | (1 << 20), MEMORY_TAG_LEVEL_TBI = 1 << 19, @@ -1634,9 +1635,11 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, instruction_set.value().c_str()); } - if (is_system_server) { + if (is_system_server && !(runtime_flags & RuntimeFlags::PROFILE_SYSTEM_SERVER)) { // Prefetch the classloader for the system server. This is done early to // allow a tie-down of the proper system server selinux domain. + // We don't prefetch when the system server is being profiled to avoid + // loading AOT code. env->CallStaticObjectMethod(gZygoteInitClass, gGetOrCreateSystemServerClassLoader); if (env->ExceptionCheck()) { // Be robust here. The Java code will attempt to create the classloader diff --git a/media/java/android/media/MediaCrypto.java b/media/java/android/media/MediaCrypto.java index 889a5f7efbb2..1930262ea253 100644 --- a/media/java/android/media/MediaCrypto.java +++ b/media/java/android/media/MediaCrypto.java @@ -75,14 +75,17 @@ public final class MediaCrypto { public final native boolean requiresSecureDecoderComponent(@NonNull String mime); /** - * Associate a MediaDrm session with this MediaCrypto instance. The - * MediaDrm session is used to securely load decryption keys for a - * crypto scheme. The crypto keys loaded through the MediaDrm session + * Associate a new MediaDrm session with this MediaCrypto instance. + * + * <p>The MediaDrm session is used to securely load decryption keys for a + * crypto scheme. The crypto keys loaded through the MediaDrm session * may be selected for use during the decryption operation performed * by {@link android.media.MediaCodec#queueSecureInputBuffer} by specifying - * their key ids in the {@link android.media.MediaCodec.CryptoInfo#key} field. - * @param sessionId the MediaDrm sessionId to associate with this - * MediaCrypto instance + * their key IDs in the {@link android.media.MediaCodec.CryptoInfo#key} field. + * + * @param sessionId The MediaDrm sessionId to associate with this MediaCrypto + * instance. The session's scheme must match the scheme UUID used when + * constructing this MediaCrypto instance. * @throws MediaCryptoException on failure to set the sessionId */ public final native void setMediaDrmSession(@NonNull byte[] sessionId) diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS index 9ef772ec95ec..3c02b880a871 100644 --- a/packages/SystemUI/OWNERS +++ b/packages/SystemUI/OWNERS @@ -5,16 +5,21 @@ set noparent dsandler@android.com aaliomer@google.com +aaronjli@google.com adamcohen@google.com alexflo@google.com asc@google.com awickham@google.com +ayepin@google.com +bbade@google.com beverlyt@google.com -brockman@google.com -brzezinski@google.com +bhnm@google.com brycelee@google.com +brzezinski@google.com caitlinshk@google.com +chandruis@google.com chrisgollner@google.com +cinek@google.com dupin@google.com ethibodeau@google.com evanlaird@google.com @@ -35,11 +40,16 @@ joshtrask@google.com juliacr@google.com juliatuttle@google.com justinkoh@google.com +justinweir@google.com kozynski@google.com kprevas@google.com +lusilva@google.com lynhan@google.com madym@google.com mankoff@google.com +mateuszc@google.com +michaelmikhil@google.com +michschn@google.com mkephart@google.com mpietal@google.com mrcasey@google.com @@ -47,6 +57,7 @@ mrenouf@google.com nickchameyev@google.com nicomazz@google.com ogunwale@google.com +patmanning@google.com peanutbutter@google.com peskal@google.com pinyaoting@google.com @@ -54,14 +65,14 @@ pixel@google.com pomini@google.com rahulbanerjee@google.com roosa@google.com +saff@google.com santie@google.com shanh@google.com snoeberger@google.com steell@google.com -sfufa@google.com stwu@google.com +syeonlee@google.com sunnygoyal@google.com -susikp@google.com thiruram@google.com tracyzhou@google.com tsuji@google.com @@ -70,10 +81,14 @@ vadimt@google.com victortulias@google.com winsonc@google.com wleshner@google.com +xilei@google.com xuqiu@google.com +yeinj@google.com yuandizhou@google.com yurilin@google.com zakcohen@google.com +zoepage@google.com #Android TV rgl@google.com + diff --git a/services/backup/OWNERS b/services/backup/OWNERS index 852c689ae020..79709a3319c8 100644 --- a/services/backup/OWNERS +++ b/services/backup/OWNERS @@ -1,10 +1,13 @@ -# Bug component: 656484 +# Bug component: 1193469 + +set noparent bryanmawhinney@google.com jstemmer@google.com +martinoh@google.com millmore@google.com -nathch@google.com -niagra@google.com niamhfw@google.com +piee@google.com philippov@google.com rthakohov@google.com +sarpm@google.com diff --git a/services/core/Android.bp b/services/core/Android.bp index b00d72b16372..d35c07f1962a 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -153,6 +153,8 @@ java_library_static { "android.hardware.health-translate-java", "android.hardware.light-V1-java", "android.hardware.tv.cec-V1.1-java", + "android.hardware.tv.cec-V1-java", + "android.hardware.tv.hdmi-V1-java", "android.hardware.weaver-V1.0-java", "android.hardware.biometrics.face-V1.0-java", "android.hardware.biometrics.fingerprint-V2.3-java", diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java index 1a568c30c899..bf0052d31826 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecController.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java @@ -19,20 +19,25 @@ package com.android.server.hdmi; import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.hdmi.HdmiPortInfo; -import android.hardware.tv.cec.V1_0.CecMessage; +import android.hardware.tv.cec.CecMessage; +import android.hardware.tv.cec.IHdmiCec; +import android.hardware.tv.cec.IHdmiCecCallback; import android.hardware.tv.cec.V1_0.HotplugEvent; -import android.hardware.tv.cec.V1_0.IHdmiCec; import android.hardware.tv.cec.V1_0.IHdmiCec.getPhysicalAddressCallback; -import android.hardware.tv.cec.V1_0.IHdmiCecCallback; +import android.hardware.tv.cec.V1_0.OptionKey; import android.hardware.tv.cec.V1_0.Result; import android.hardware.tv.cec.V1_0.SendMessageResult; +import android.hardware.tv.hdmi.IHdmi; +import android.hardware.tv.hdmi.IHdmiCallback; import android.icu.util.IllformedLocaleException; import android.icu.util.ULocale; import android.os.Binder; import android.os.Handler; +import android.os.IBinder; import android.os.IHwBinder; import android.os.Looper; import android.os.RemoteException; +import android.os.ServiceManager; import android.stats.hdmi.HdmiStatsEnums; import android.util.Slog; @@ -168,8 +173,14 @@ final class HdmiCecController { * returns {@code null}. */ static HdmiCecController create(HdmiControlService service, HdmiCecAtomWriter atomWriter) { - HdmiCecController controller = createWithNativeWrapper(service, new NativeWrapperImpl11(), - atomWriter); + HdmiCecController controller = + createWithNativeWrapper(service, new NativeWrapperImplAidl(), atomWriter); + if (controller != null) { + return controller; + } + HdmiLogger.warning("Unable to use CEC and HDMI AIDL HALs"); + + controller = createWithNativeWrapper(service, new NativeWrapperImpl11(), atomWriter); if (controller != null) { return controller; } @@ -360,16 +371,43 @@ final class HdmiCecController { } /** - * Set an option to CEC HAL. + * Configures the TV panel device wakeup behaviour in standby mode when it receives an OTP + * (One Touch Play) from a source device. + * + * @param value If true, the TV device will wake up when OTP is received and if false, the TV + * device will not wake up for an OTP. + */ + @ServiceThreadOnly + void enableWakeupByOtp(boolean enabled) { + assertRunOnServiceThread(); + HdmiLogger.debug("enableWakeupByOtp: %b", enabled); + mNativeWrapperImpl.enableWakeupByOtp(enabled); + } + + /** + * Switch to enable or disable CEC on the device. + * + * @param value If true, the device will have all CEC functionalities and if false, the device + * will not perform any CEC functions. + */ + @ServiceThreadOnly + void enableCec(boolean enabled) { + assertRunOnServiceThread(); + HdmiLogger.debug("enableCec: %b", enabled); + mNativeWrapperImpl.enableCec(enabled); + } + + /** + * Configures the module that processes CEC messages - the Android framework or the HAL. * - * @param flag key of option - * @param enabled whether to enable/disable the given option. + * @param value If true, the Android framework will actively process CEC messages and if false, + * only the HAL will process the CEC messages. */ @ServiceThreadOnly - void setOption(int flag, boolean enabled) { + void enableSystemCecControl(boolean enabled) { assertRunOnServiceThread(); - HdmiLogger.debug("setOption: [flag:%d, enabled:%b]", flag, enabled); - mNativeWrapperImpl.nativeSetOption(flag, enabled); + HdmiLogger.debug("enableSystemCecControl: %b", enabled); + mNativeWrapperImpl.enableSystemCecControl(enabled); } /** @@ -819,12 +857,233 @@ final class HdmiCecController { int nativeGetVersion(); int nativeGetVendorId(); HdmiPortInfo[] nativeGetPortInfos(); - void nativeSetOption(int flag, boolean enabled); + + void enableWakeupByOtp(boolean enabled); + + void enableCec(boolean enabled); + + void enableSystemCecControl(boolean enabled); + void nativeSetLanguage(String language); void nativeEnableAudioReturnChannel(int port, boolean flag); boolean nativeIsConnected(int port); } + private static final class NativeWrapperImplAidl + implements NativeWrapper, IBinder.DeathRecipient { + private IHdmiCec mHdmiCec; + private IHdmi mHdmi; + @Nullable private HdmiCecCallback mCallback; + + private final Object mLock = new Object(); + + @Override + public String nativeInit() { + return connectToHal() ? mHdmiCec.toString() + " " + mHdmi.toString() : null; + } + + boolean connectToHal() { + mHdmiCec = + IHdmiCec.Stub.asInterface( + ServiceManager.getService(IHdmiCec.DESCRIPTOR + "/default")); + if (mHdmiCec == null) { + HdmiLogger.error("Could not initialize HDMI CEC AIDL HAL"); + return false; + } + try { + mHdmiCec.asBinder().linkToDeath(this, 0); + } catch (RemoteException e) { + HdmiLogger.error("Couldn't link to death : ", e); + } + + mHdmi = + IHdmi.Stub.asInterface( + ServiceManager.getService(IHdmi.DESCRIPTOR + "/default")); + if (mHdmi == null) { + HdmiLogger.error("Could not initialize HDMI AIDL HAL"); + return false; + } + try { + mHdmi.asBinder().linkToDeath(this, 0); + } catch (RemoteException e) { + HdmiLogger.error("Couldn't link to death : ", e); + } + return true; + } + + @Override + public void binderDied() { + // One of the services died, try to reconnect to both. + mHdmiCec.asBinder().unlinkToDeath(this, 0); + mHdmi.asBinder().unlinkToDeath(this, 0); + HdmiLogger.error("HDMI or CEC service died, reconnecting"); + connectToHal(); + // Reconnect the callback + if (mCallback != null) { + setCallback(mCallback); + } + } + + @Override + public void setCallback(HdmiCecCallback callback) { + mCallback = callback; + try { + // Create an AIDL callback that can callback onCecMessage + mHdmiCec.setCallback(new HdmiCecCallbackAidl(callback)); + } catch (RemoteException e) { + HdmiLogger.error("Couldn't initialise tv.cec callback : ", e); + } + try { + // Create an AIDL callback that can callback onHotplugEvent + mHdmi.setCallback(new HdmiCallbackAidl(callback)); + } catch (RemoteException e) { + HdmiLogger.error("Couldn't initialise tv.hdmi callback : ", e); + } + } + + @Override + public int nativeSendCecCommand(int srcAddress, int dstAddress, byte[] body) { + CecMessage message = new CecMessage(); + message.initiator = (byte) (srcAddress & 0xF); + message.destination = (byte) (dstAddress & 0xF); + message.body = body; + try { + return mHdmiCec.sendMessage(message); + } catch (RemoteException e) { + HdmiLogger.error("Failed to send CEC message : ", e); + return SendMessageResult.FAIL; + } + } + + @Override + public int nativeAddLogicalAddress(int logicalAddress) { + try { + return mHdmiCec.addLogicalAddress((byte) logicalAddress); + } catch (RemoteException e) { + HdmiLogger.error("Failed to add a logical address : ", e); + return Result.FAILURE_INVALID_ARGS; + } + } + + @Override + public void nativeClearLogicalAddress() { + try { + mHdmiCec.clearLogicalAddress(); + } catch (RemoteException e) { + HdmiLogger.error("Failed to clear logical address : ", e); + } + } + + @Override + public int nativeGetPhysicalAddress() { + try { + return mHdmiCec.getPhysicalAddress(); + } catch (RemoteException e) { + HdmiLogger.error("Failed to get physical address : ", e); + return INVALID_PHYSICAL_ADDRESS; + } + } + + @Override + public int nativeGetVersion() { + try { + return mHdmiCec.getCecVersion(); + } catch (RemoteException e) { + HdmiLogger.error("Failed to get cec version : ", e); + return Result.FAILURE_UNKNOWN; + } + } + + @Override + public int nativeGetVendorId() { + try { + return mHdmiCec.getVendorId(); + } catch (RemoteException e) { + HdmiLogger.error("Failed to get vendor id : ", e); + return Result.FAILURE_UNKNOWN; + } + } + + @Override + public void enableWakeupByOtp(boolean enabled) { + try { + mHdmiCec.enableWakeupByOtp(enabled); + } catch (RemoteException e) { + HdmiLogger.error("Failed call to enableWakeupByOtp : ", e); + } + } + + @Override + public void enableCec(boolean enabled) { + try { + mHdmiCec.enableCec(enabled); + } catch (RemoteException e) { + HdmiLogger.error("Failed call to enableCec : ", e); + } + } + + @Override + public void enableSystemCecControl(boolean enabled) { + try { + mHdmiCec.enableSystemCecControl(enabled); + } catch (RemoteException e) { + HdmiLogger.error("Failed call to enableSystemCecControl : ", e); + } + } + + @Override + public void nativeSetLanguage(String language) { + try { + mHdmiCec.setLanguage(language); + } catch (RemoteException e) { + HdmiLogger.error("Failed to set language : ", e); + } + } + + @Override + public void nativeEnableAudioReturnChannel(int port, boolean flag) { + try { + mHdmiCec.enableAudioReturnChannel(port, flag); + } catch (RemoteException e) { + HdmiLogger.error("Failed to enable/disable ARC : ", e); + } + } + + @Override + public HdmiPortInfo[] nativeGetPortInfos() { + try { + android.hardware.tv.hdmi.HdmiPortInfo[] hdmiPortInfos = mHdmi.getPortInfo(); + HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[hdmiPortInfos.length]; + int i = 0; + for (android.hardware.tv.hdmi.HdmiPortInfo portInfo : hdmiPortInfos) { + hdmiPortInfo[i] = + new HdmiPortInfo( + portInfo.portId, + portInfo.type, + portInfo.physicalAddress, + portInfo.cecSupported, + false, + portInfo.arcSupported); + i++; + } + return hdmiPortInfo; + } catch (RemoteException e) { + HdmiLogger.error("Failed to get port information : ", e); + return null; + } + } + + @Override + public boolean nativeIsConnected(int port) { + try { + return mHdmi.isConnected(port); + } catch (RemoteException e) { + HdmiLogger.error("Failed to get connection info : ", e); + return false; + } + } + } + private static final class NativeWrapperImpl11 implements NativeWrapper, IHwBinder.DeathRecipient, getPhysicalAddressCallback { private android.hardware.tv.cec.V1_1.IHdmiCec mHdmiCec; @@ -975,8 +1234,7 @@ final class HdmiCecController { } } - @Override - public void nativeSetOption(int flag, boolean enabled) { + private void nativeSetOption(int flag, boolean enabled) { try { mHdmiCec.setOption(flag, enabled); } catch (RemoteException e) { @@ -985,6 +1243,21 @@ final class HdmiCecController { } @Override + public void enableWakeupByOtp(boolean enabled) { + nativeSetOption(OptionKey.WAKEUP, enabled); + } + + @Override + public void enableCec(boolean enabled) { + nativeSetOption(OptionKey.ENABLE_CEC, enabled); + } + + @Override + public void enableSystemCecControl(boolean enabled) { + nativeSetOption(OptionKey.SYSTEM_CEC_CONTROL, enabled); + } + + @Override public void nativeSetLanguage(String language) { try { mHdmiCec.setLanguage(language); @@ -1028,7 +1301,7 @@ final class HdmiCecController { boolean connectToHal() { try { - mHdmiCec = IHdmiCec.getService(true); + mHdmiCec = android.hardware.tv.cec.V1_0.IHdmiCec.getService(true); try { mHdmiCec.linkToDeath(this, HDMI_CEC_HAL_DEATH_COOKIE); } catch (RemoteException e) { @@ -1053,7 +1326,8 @@ final class HdmiCecController { @Override public int nativeSendCecCommand(int srcAddress, int dstAddress, byte[] body) { - CecMessage message = new CecMessage(); + android.hardware.tv.cec.V1_0.CecMessage message = + new android.hardware.tv.cec.V1_0.CecMessage(); message.initiator = srcAddress; message.destination = dstAddress; message.body = new ArrayList<>(body.length); @@ -1141,8 +1415,7 @@ final class HdmiCecController { } } - @Override - public void nativeSetOption(int flag, boolean enabled) { + private void nativeSetOption(int flag, boolean enabled) { try { mHdmiCec.setOption(flag, enabled); } catch (RemoteException e) { @@ -1151,6 +1424,21 @@ final class HdmiCecController { } @Override + public void enableWakeupByOtp(boolean enabled) { + nativeSetOption(OptionKey.WAKEUP, enabled); + } + + @Override + public void enableCec(boolean enabled) { + nativeSetOption(OptionKey.ENABLE_CEC, enabled); + } + + @Override + public void enableSystemCecControl(boolean enabled) { + nativeSetOption(OptionKey.SYSTEM_CEC_CONTROL, enabled); + } + + @Override public void nativeSetLanguage(String language) { try { mHdmiCec.setLanguage(language); @@ -1211,7 +1499,8 @@ final class HdmiCecController { } } - private static final class HdmiCecCallback10 extends IHdmiCecCallback.Stub { + private static final class HdmiCecCallback10 + extends android.hardware.tv.cec.V1_0.IHdmiCecCallback.Stub { private final HdmiCecCallback mHdmiCecCallback; HdmiCecCallback10(HdmiCecCallback hdmiCecCallback) { @@ -1219,7 +1508,8 @@ final class HdmiCecController { } @Override - public void onCecMessage(CecMessage message) throws RemoteException { + public void onCecMessage(android.hardware.tv.cec.V1_0.CecMessage message) + throws RemoteException { byte[] body = new byte[message.body.size()]; for (int i = 0; i < message.body.size(); i++) { body[i] = message.body.get(i); @@ -1252,7 +1542,8 @@ final class HdmiCecController { } @Override - public void onCecMessage(CecMessage message) throws RemoteException { + public void onCecMessage(android.hardware.tv.cec.V1_0.CecMessage message) + throws RemoteException { byte[] body = new byte[message.body.size()]; for (int i = 0; i < message.body.size(); i++) { body[i] = message.body.get(i); @@ -1266,6 +1557,52 @@ final class HdmiCecController { } } + private static final class HdmiCecCallbackAidl extends IHdmiCecCallback.Stub { + private final HdmiCecCallback mHdmiCecCallback; + + HdmiCecCallbackAidl(HdmiCecCallback hdmiCecCallback) { + mHdmiCecCallback = hdmiCecCallback; + } + + @Override + public void onCecMessage(CecMessage message) throws RemoteException { + mHdmiCecCallback.onCecMessage(message.initiator, message.destination, message.body); + } + + @Override + public synchronized String getInterfaceHash() throws android.os.RemoteException { + return IHdmiCecCallback.Stub.HASH; + } + + @Override + public int getInterfaceVersion() throws android.os.RemoteException { + return IHdmiCecCallback.Stub.VERSION; + } + } + + private static final class HdmiCallbackAidl extends IHdmiCallback.Stub { + private final HdmiCecCallback mHdmiCecCallback; + + HdmiCallbackAidl(HdmiCecCallback hdmiCecCallback) { + mHdmiCecCallback = hdmiCecCallback; + } + + @Override + public void onHotplugEvent(boolean connected, int portId) throws RemoteException { + mHdmiCecCallback.onHotplugEvent(portId, connected); + } + + @Override + public synchronized String getInterfaceHash() throws android.os.RemoteException { + return IHdmiCallback.Stub.HASH; + } + + @Override + public int getInterfaceVersion() throws android.os.RemoteException { + return IHdmiCallback.Stub.VERSION; + } + } + public abstract static class Dumpable { protected final long mTime; diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index f8a74f4f3f55..3256b49c0f4f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -56,7 +56,6 @@ import android.hardware.hdmi.IHdmiMhlVendorCommandListener; import android.hardware.hdmi.IHdmiRecordListener; import android.hardware.hdmi.IHdmiSystemAudioModeChangeListener; import android.hardware.hdmi.IHdmiVendorCommandListener; -import android.hardware.tv.cec.V1_0.OptionKey; import android.hardware.tv.cec.V1_0.SendMessageResult; import android.media.AudioAttributes; import android.media.AudioDeviceAttributes; @@ -656,7 +655,7 @@ public class HdmiControlService extends SystemService { if (mHdmiControlEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) { initializeCec(INITIATED_BY_BOOT_UP); } else { - mCecController.setOption(OptionKey.ENABLE_CEC, false); + mCecController.enableCec(false); } mMhlDevices = Collections.emptyList(); @@ -730,10 +729,11 @@ public class HdmiControlService extends SystemService { @Override public void onChange(String setting) { if (isTvDeviceEnabled()) { - setCecOption(OptionKey.WAKEUP, tv().getAutoWakeup()); + mCecController.enableWakeupByOtp(tv().getAutoWakeup()); } } - }, mServiceThreadExecutor); + }, + mServiceThreadExecutor); } /** Returns true if the device screen is off */ @@ -854,7 +854,7 @@ public class HdmiControlService extends SystemService { mWakeUpMessageReceived = false; if (isTvDeviceEnabled()) { - mCecController.setOption(OptionKey.WAKEUP, tv().getAutoWakeup()); + mCecController.enableWakeupByOtp(tv().getAutoWakeup()); } int reason = -1; switch (initiatedBy) { @@ -988,7 +988,7 @@ public class HdmiControlService extends SystemService { mCecVersion = Math.max(HdmiControlManager.HDMI_CEC_VERSION_1_4_B, Math.min(settingsCecVersion, supportedCecVersion)); - mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true); + mCecController.enableSystemCecControl(true); mCecController.setLanguage(mMenuLanguage); initializeLocalDevices(initiatedBy); } @@ -3422,7 +3422,7 @@ public class HdmiControlService extends SystemService { device.onStandby(mStandbyMessageReceived, standbyAction); } if (!isAudioSystemDevice()) { - mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, false); + mCecController.enableSystemCecControl(false); mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, DISABLED); } } @@ -3571,12 +3571,6 @@ public class HdmiControlService extends SystemService { } @ServiceThreadOnly - void setCecOption(int key, boolean value) { - assertRunOnServiceThread(); - mCecController.setOption(key, value); - } - - @ServiceThreadOnly void setControlEnabled(@HdmiControlManager.HdmiCecControl int enabled) { assertRunOnServiceThread(); @@ -3610,8 +3604,8 @@ public class HdmiControlService extends SystemService { @ServiceThreadOnly private void enableHdmiControlService() { - mCecController.setOption(OptionKey.ENABLE_CEC, true); - mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true); + mCecController.enableCec(true); + mCecController.enableSystemCecControl(true); mMhlController.setOption(OPTION_MHL_ENABLE, ENABLED); initializeCec(INITIATED_BY_ENABLE_CEC); @@ -3619,21 +3613,23 @@ public class HdmiControlService extends SystemService { @ServiceThreadOnly private void disableHdmiControlService() { - disableDevices(new PendingActionClearedCallback() { - @Override - public void onCleared(HdmiCecLocalDevice device) { - assertRunOnServiceThread(); - mCecController.flush(new Runnable() { + disableDevices( + new PendingActionClearedCallback() { @Override - public void run() { - mCecController.setOption(OptionKey.ENABLE_CEC, false); - mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, false); - mMhlController.setOption(OPTION_MHL_ENABLE, DISABLED); - clearLocalDevices(); + public void onCleared(HdmiCecLocalDevice device) { + assertRunOnServiceThread(); + mCecController.flush( + new Runnable() { + @Override + public void run() { + mCecController.enableCec(false); + mCecController.enableSystemCecControl(false); + mMhlController.setOption(OPTION_MHL_ENABLE, DISABLED); + clearLocalDevices(); + } + }); } }); - } - }); } @ServiceThreadOnly diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp index bfd80054ffd2..b171a075578c 100644 --- a/services/core/jni/com_android_server_SystemServer.cpp +++ b/services/core/jni/com_android_server_SystemServer.cpp @@ -109,8 +109,13 @@ static void android_server_SystemServer_startHidlServices(JNIEnv* env, jobject / LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Cannot get Java VM"); sp<ISensorManager> sensorService = new SensorManager(vm); - err = sensorService->registerAsService(); - LOG_ALWAYS_FATAL_IF(err != OK, "Cannot register %s: %d", ISensorManager::descriptor, err); + if (IServiceManager::Transport::HWBINDER == + hardware::defaultServiceManager1_2()->getTransport(ISensorManager::descriptor, "default")) { + err = sensorService->registerAsService(); + LOG_ALWAYS_FATAL_IF(err != OK, "Cannot register %s: %d", ISensorManager::descriptor, err); + } else { + ALOGW("%s is deprecated. Skipping registration.", ISensorManager::descriptor); + } sp<ISchedulingPolicyService> schedulingService = new SchedulingPolicyService(); if (IServiceManager::Transport::HWBINDER == diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java index 559a2c0d6a09..29eccd46650e 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeNativeWrapper.java @@ -118,7 +118,13 @@ final class FakeNativeWrapper implements NativeWrapper { } @Override - public void nativeSetOption(int flag, boolean enabled) {} + public void enableWakeupByOtp(boolean enabled) {} + + @Override + public void enableCec(boolean enabled) {} + + @Override + public void enableSystemCecControl(boolean enabled) {} @Override public void nativeSetLanguage(String language) {} diff --git a/tests/RollbackTest/SampleRollbackApp/AndroidManifest.xml b/tests/RollbackTest/SampleRollbackApp/AndroidManifest.xml index 5a135c978343..7fe4bae2a3fe 100644 --- a/tests/RollbackTest/SampleRollbackApp/AndroidManifest.xml +++ b/tests/RollbackTest/SampleRollbackApp/AndroidManifest.xml @@ -16,7 +16,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.sample.rollbackapp" > - <uses-permission android:name="android.permission.TEST_MANAGE_ROLLBACKS" /> + <uses-permission android:name="android.permission.MANAGE_ROLLBACKS" /> <application android:label="@string/title_activity_main"> <activity @@ -28,4 +28,4 @@ </intent-filter> </activity> </application> -</manifest>
\ No newline at end of file +</manifest> |