diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index d2fc1d3be40cc..ce6c0ffbc10ba 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -32,7 +32,6 @@ interface IPowerManager @UnsupportedAppUsage void releaseWakeLock(IBinder lock, int flags); void updateWakeLockUids(IBinder lock, in int[] uids); - oneway void powerHint(int hintId, int data); oneway void setPowerBoost(int boost, int durationMs); oneway void setPowerMode(int mode, boolean enabled); diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java index 653a5594f4951..e30a409649927 100644 --- a/core/java/android/os/PowerManagerInternal.java +++ b/core/java/android/os/PowerManagerInternal.java @@ -195,12 +195,6 @@ public abstract class PowerManagerInternal { public abstract void uidIdle(int uid); - /** - * The hintId sent through this method should be in-line with the - * PowerHint defined in android/hardware/power//IPower.h - */ - public abstract void powerHint(int hintId, int data); - /** * Boost: It is sent when user interacting with the device, for example, * touchscreen events are incoming. diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 7b0675939a33e..4c4680b173726 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -44,8 +44,8 @@ import android.hardware.SystemSensorManager; import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; +import android.hardware.power.Boost; import android.hardware.power.Mode; -import android.hardware.power.V1_0.PowerHint; import android.net.Uri; import android.os.BatteryManager; import android.os.BatteryManagerInternal; @@ -203,9 +203,6 @@ public final class PowerManagerService extends SystemService // How long a partial wake lock must be held until we consider it a long wake lock. static final long MIN_LONG_WAKE_CHECK_INTERVAL = 60*1000; - // Power features defined in hardware/libhardware/include/hardware/power.h. - private static final int POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 1; - // Default setting for double tap to wake. private static final int DEFAULT_DOUBLE_TAP_TO_WAKE = 0; @@ -325,7 +322,7 @@ public final class PowerManagerService extends SystemService private long mLastUserActivityTime; private long mLastUserActivityTimeNoChangeLights; - // Timestamp of last interactive power hint. + // Timestamp of last time power boost interaction was sent. private long mLastInteractivePowerHintTime; // Timestamp of the last screen brightness boost. @@ -719,21 +716,11 @@ public final class PowerManagerService extends SystemService PowerManagerService.nativeReleaseSuspendBlocker(name); } - /** Wrapper for PowerManager.nativeSetInteractive */ - public void nativeSetInteractive(boolean enable) { - PowerManagerService.nativeSetInteractive(enable); - } - /** Wrapper for PowerManager.nativeSetAutoSuspend */ public void nativeSetAutoSuspend(boolean enable) { PowerManagerService.nativeSetAutoSuspend(enable); } - /** Wrapper for PowerManager.nativeSendPowerHint */ - public void nativeSendPowerHint(int hintId, int data) { - PowerManagerService.nativeSendPowerHint(hintId, data); - } - /** Wrapper for PowerManager.nativeSetPowerBoost */ public void nativeSetPowerBoost(int boost, int durationMs) { PowerManagerService.nativeSetPowerBoost(boost, durationMs); @@ -744,11 +731,6 @@ public final class PowerManagerService extends SystemService return PowerManagerService.nativeSetPowerMode(mode, enabled); } - /** Wrapper for PowerManager.nativeSetFeature */ - public void nativeSetFeature(int featureId, int data) { - PowerManagerService.nativeSetFeature(featureId, data); - } - /** Wrapper for PowerManager.nativeForceSuspend */ public boolean nativeForceSuspend() { return PowerManagerService.nativeForceSuspend(); @@ -851,12 +833,9 @@ public final class PowerManagerService extends SystemService private native void nativeInit(); private static native void nativeAcquireSuspendBlocker(String name); private static native void nativeReleaseSuspendBlocker(String name); - private static native void nativeSetInteractive(boolean enable); private static native void nativeSetAutoSuspend(boolean enable); - private static native void nativeSendPowerHint(int hintId, int data); private static native void nativeSetPowerBoost(int boost, int durationMs); private static native boolean nativeSetPowerMode(int mode, boolean enabled); - private static native void nativeSetFeature(int featureId, int data); private static native boolean nativeForceSuspend(); public PowerManagerService(Context context) { @@ -1000,8 +979,8 @@ public final class PowerManagerService extends SystemService mNativeWrapper.nativeInit(this); mNativeWrapper.nativeSetAutoSuspend(false); - mNativeWrapper.nativeSetInteractive(true); - mNativeWrapper.nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0); + mNativeWrapper.nativeSetPowerMode(Mode.INTERACTIVE, true); + mNativeWrapper.nativeSetPowerMode(Mode.DOUBLE_TAP_TO_WAKE, false); mInjector.invalidateIsInteractiveCaches(); } } @@ -1252,8 +1231,7 @@ public final class PowerManagerService extends SystemService UserHandle.USER_CURRENT) != 0; if (doubleTapWakeEnabled != mDoubleTapWakeEnabled) { mDoubleTapWakeEnabled = doubleTapWakeEnabled; - mNativeWrapper.nativeSetFeature( - POWER_FEATURE_DOUBLE_TAP_TO_WAKE, mDoubleTapWakeEnabled ? 1 : 0); + mNativeWrapper.nativeSetPowerMode(Mode.DOUBLE_TAP_TO_WAKE, mDoubleTapWakeEnabled); } } @@ -1612,7 +1590,7 @@ public final class PowerManagerService extends SystemService Trace.traceBegin(Trace.TRACE_TAG_POWER, "userActivity"); try { if (eventTime > mLastInteractivePowerHintTime) { - powerHintInternal(PowerHint.INTERACTION, 0); + setPowerBoostInternal(Boost.INTERACTION, 0); mLastInteractivePowerHintTime = eventTime; } @@ -3171,7 +3149,7 @@ public final class PowerManagerService extends SystemService mHalInteractiveModeEnabled = enable; Trace.traceBegin(Trace.TRACE_TAG_POWER, "setHalInteractive(" + enable + ")"); try { - mNativeWrapper.nativeSetInteractive(enable); + mNativeWrapper.nativeSetPowerMode(Mode.INTERACTIVE, enable); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } @@ -3645,19 +3623,6 @@ public final class PowerManagerService extends SystemService mIsVrModeEnabled = enabled; } - private void powerHintInternal(int hintId, int data) { - // Maybe filter the event. - switch (hintId) { - case PowerHint.LAUNCH: // 1: activate launch boost 0: deactivate. - if (data == 1 && mBatterySaverController.isLaunchBoostDisabled()) { - return; - } - break; - } - - mNativeWrapper.nativeSendPowerHint(hintId, data); - } - private void setPowerBoostInternal(int boost, int durationMs) { // Maybe filter the event. mNativeWrapper.nativeSetPowerBoost(boost, durationMs); @@ -4404,7 +4369,7 @@ public final class PowerManagerService extends SystemService private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { @Override public void onVrStateChanged(boolean enabled) { - powerHintInternal(PowerHint.VR_MODE, enabled ? 1 : 0); + setPowerModeInternal(Mode.VR, enabled); synchronized (mLock) { if (mIsVrModeEnabled != enabled) { @@ -4714,16 +4679,6 @@ public final class PowerManagerService extends SystemService acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid), null); } - @Override // Binder call - public void powerHint(int hintId, int data) { - if (!mSystemReady) { - // Service not ready yet, so who the heck cares about power hints, bah. - return; - } - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - powerHintInternal(hintId, data); - } - @Override // Binder call public void setPowerBoost(int boost, int durationMs) { if (!mSystemReady) { @@ -5558,11 +5513,6 @@ public final class PowerManagerService extends SystemService uidIdleInternal(uid); } - @Override - public void powerHint(int hintId, int data) { - powerHintInternal(hintId, data); - } - @Override public void setPowerBoost(int boost, int durationMs) { setPowerBoostInternal(boost, durationMs); diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java index 4a2dfdcaac7af..dd287ca6ed001 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java @@ -23,7 +23,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManagerInternal; -import android.hardware.power.V1_0.PowerHint; +import android.hardware.power.Mode; import android.os.BatteryManager; import android.os.BatterySaverPolicyConfig; import android.os.Handler; @@ -475,7 +475,7 @@ public class BatterySaverController implements BatterySaverPolicyListener { final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class); if (pmi != null) { - pmi.powerHint(PowerHint.LOW_POWER, isEnabled() ? 1 : 0); + pmi.setPowerMode(Mode.LOW_POWER, isEnabled()); } updateBatterySavingStats(); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 53f16a7241fc3..0e24fc8bd3073 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -144,7 +144,7 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Region; import android.hardware.input.InputManager; -import android.hardware.power.V1_0.PowerHint; +import android.hardware.power.Boost; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -567,8 +567,8 @@ public class DisplayPolicy { @Override public void onFling(int duration) { if (mService.mPowerManagerInternal != null) { - mService.mPowerManagerInternal.powerHint( - PowerHint.INTERACTION, duration); + mService.mPowerManagerInternal.setPowerBoost( + Boost.INTERACTION, duration); } } diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 0747e243e2764..c63128c15e8d0 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -42,7 +42,7 @@ import android.content.pm.ActivityInfo.ScreenOrientation; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; -import android.hardware.power.V1_0.PowerHint; +import android.hardware.power.Boost; import android.net.Uri; import android.os.Handler; import android.os.RemoteException; @@ -1473,7 +1473,7 @@ public class DisplayRotation { @Override public void run() { // Send interaction power boost to improve redraw performance. - mService.mPowerManagerInternal.powerHint(PowerHint.INTERACTION, 0); + mService.mPowerManagerInternal.setPowerBoost(Boost.INTERACTION, 0); if (isRotationChoicePossible(mCurrentAppOrientation)) { final boolean isValid = isValidRotationChoice(mRotation); sendProposedRotationChangeToStatusBarInternal(mRotation, isValid); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index b7ee27e1609eb..06dec7c8023d9 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -112,7 +112,7 @@ import android.content.res.Resources; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; -import android.hardware.power.V1_0.PowerHint; +import android.hardware.power.Mode; import android.net.Uri; import android.os.Binder; import android.os.Debug; @@ -955,9 +955,9 @@ class RootWindowContainer extends WindowContainer if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) { mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent; - mWmService.mPowerManagerInternal.powerHint( - PowerHint.SUSTAINED_PERFORMANCE, - mSustainedPerformanceModeEnabled ? 1 : 0); + mWmService.mPowerManagerInternal.setPowerMode( + Mode.SUSTAINED_PERFORMANCE, + mSustainedPerformanceModeEnabled); } if (mUpdateRotation) { @@ -3528,7 +3528,7 @@ class RootWindowContainer extends WindowContainer } if (sendPowerModeLaunch && mService.mPowerManagerInternal != null) { - mService.mPowerManagerInternal.powerHint(PowerHint.LAUNCH, 1); + mService.mPowerManagerInternal.setPowerMode(Mode.LAUNCH, true); mPowerModeLaunchStarted = true; } } @@ -3536,7 +3536,7 @@ class RootWindowContainer extends WindowContainer void endPowerModeLaunchIfNeeded() { // Trigger launch power mode off if activity is launched if (mPowerModeLaunchStarted && mService.mPowerManagerInternal != null) { - mService.mPowerManagerInternal.powerHint(PowerHint.LAUNCH, 0); + mService.mPowerManagerInternal.setPowerMode(Mode.LAUNCH, false); mPowerModeLaunchStarted = false; } } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java index 837f1b523b687..34d084a3f9f8d 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java @@ -26,7 +26,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.annotation.Nullable; -import android.hardware.power.V1_0.PowerHint; +import android.hardware.power.Boost; import android.os.Handler; import android.os.PowerManagerInternal; import android.util.ArrayMap; @@ -246,7 +246,7 @@ class SurfaceAnimationRunner { synchronized (mLock) { startPendingAnimationsLocked(); } - mPowerManagerInternal.powerHint(PowerHint.INTERACTION, 0); + mPowerManagerInternal.setPowerBoost(Boost.INTERACTION, 0); } private void scheduleApplyTransaction() { diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp index 6140531538a69..91f70729d5b61 100644 --- a/services/core/jni/com_android_server_power_PowerManagerService.cpp +++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp @@ -29,7 +29,6 @@ #include #include -#include #include @@ -49,12 +48,8 @@ #include "com_android_server_power_PowerManagerService.h" using android::String8; -using android::hardware::Return; -using android::hardware::Void; using android::hardware::power::Boost; using android::hardware::power::Mode; -using android::hardware::power::V1_0::Feature; -using android::hardware::power::V1_0::PowerHint; using android::system::suspend::ISuspendControlService; using android::system::suspend::V1_0::ISystemSuspend; using android::system::suspend::V1_0::IWakeLock; @@ -74,18 +69,7 @@ static struct { // ---------------------------------------------------------------------------- static jobject gPowerManagerServiceObj; -static sp gPowerHalHidlV1_0_ = nullptr; -static sp gPowerHalHidlV1_1_ = nullptr; -static sp gPowerHalAidl_ = nullptr; -static std::mutex gPowerHalMutex; - -enum class HalVersion { - NONE, - HIDL_1_0, - HIDL_1_1, - AIDL, -}; - +static power::PowerHalController gPowerHalController; static nsecs_t gLastEventTime[USER_ACTIVITY_EVENT_LAST + 1]; // Throttling interval for user activity calls. @@ -103,208 +87,19 @@ static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa return false; } -// Check validity of current handle to the power HAL service, and connect to it if necessary. -// The caller must be holding gPowerHalMutex. -static HalVersion connectPowerHalLocked() { - static bool gPowerHalHidlExists = true; - static bool gPowerHalAidlExists = true; - if (!gPowerHalHidlExists && !gPowerHalAidlExists) { - return HalVersion::NONE; - } - if (gPowerHalAidlExists) { - if (!gPowerHalAidl_) { - gPowerHalAidl_ = waitForVintfService(); - } - if (gPowerHalAidl_) { - ALOGV("Successfully connected to Power HAL AIDL service."); - return HalVersion::AIDL; - } else { - gPowerHalAidlExists = false; - } - } - if (gPowerHalHidlExists && gPowerHalHidlV1_0_ == nullptr) { - gPowerHalHidlV1_0_ = IPowerV1_0::getService(); - if (gPowerHalHidlV1_0_) { - ALOGV("Successfully connected to Power HAL HIDL 1.0 service."); - // Try cast to powerHAL HIDL V1_1 - gPowerHalHidlV1_1_ = IPowerV1_1::castFrom(gPowerHalHidlV1_0_); - if (gPowerHalHidlV1_1_) { - ALOGV("Successfully connected to Power HAL HIDL 1.1 service."); - } - } else { - ALOGV("Couldn't load power HAL HIDL service"); - gPowerHalHidlExists = false; - return HalVersion::NONE; - } - } - if (gPowerHalHidlV1_1_) { - return HalVersion::HIDL_1_1; - } else if (gPowerHalHidlV1_0_) { - return HalVersion::HIDL_1_0; - } - return HalVersion::NONE; -} - -// Check if a call to a power HAL function failed; if so, log the failure and invalidate the -// current handle to the power HAL service. -bool processPowerHalReturn(bool isOk, const char* functionName) { - if (!isOk) { - ALOGE("%s() failed: power HAL service not available.", functionName); - gPowerHalMutex.lock(); - gPowerHalHidlV1_0_ = nullptr; - gPowerHalHidlV1_1_ = nullptr; - gPowerHalAidl_ = nullptr; - gPowerHalMutex.unlock(); - } - return isOk; -} - -enum class HalSupport { - UNKNOWN = 0, - ON, - OFF, -}; - -static void setPowerBoostWithHandle(sp handle, Boost boost, int32_t durationMs) { - // Android framework only sends boost upto DISPLAY_UPDATE_IMMINENT. - // Need to increase the array size if more boost supported. - static std::array, - static_cast(Boost::DISPLAY_UPDATE_IMMINENT) + 1> - boostSupportedArray = {HalSupport::UNKNOWN}; - - // Quick return if boost is not supported by HAL - if (boost > Boost::DISPLAY_UPDATE_IMMINENT || - boostSupportedArray[static_cast(boost)] == HalSupport::OFF) { - ALOGV("Skipped setPowerBoost %s because HAL doesn't support it", toString(boost).c_str()); - return; - } - - if (boostSupportedArray[static_cast(boost)] == HalSupport::UNKNOWN) { - bool isSupported = false; - handle->isBoostSupported(boost, &isSupported); - boostSupportedArray[static_cast(boost)] = - isSupported ? HalSupport::ON : HalSupport::OFF; - if (!isSupported) { - ALOGV("Skipped setPowerBoost %s because HAL doesn't support it", - toString(boost).c_str()); - return; - } - } - - auto ret = handle->setBoost(boost, durationMs); - processPowerHalReturn(ret.isOk(), "setPowerBoost"); -} - static void setPowerBoost(Boost boost, int32_t durationMs) { - std::unique_lock lock(gPowerHalMutex); - if (connectPowerHalLocked() != HalVersion::AIDL) { - ALOGV("Power HAL AIDL not available"); - return; - } - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerBoostWithHandle(handle, boost, durationMs); -} - -static bool setPowerModeWithHandle(sp handle, Mode mode, bool enabled) { - // Android framework only sends mode upto DISPLAY_INACTIVE. - // Need to increase the array if more mode supported. - static std::array, static_cast(Mode::DISPLAY_INACTIVE) + 1> - modeSupportedArray = {HalSupport::UNKNOWN}; - - // Quick return if mode is not supported by HAL - if (mode > Mode::DISPLAY_INACTIVE || - modeSupportedArray[static_cast(mode)] == HalSupport::OFF) { - ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str()); - return false; - } - - if (modeSupportedArray[static_cast(mode)] == HalSupport::UNKNOWN) { - bool isSupported = false; - handle->isModeSupported(mode, &isSupported); - modeSupportedArray[static_cast(mode)] = - isSupported ? HalSupport::ON : HalSupport::OFF; - if (!isSupported) { - ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str()); - return false; - } - } - - auto ret = handle->setMode(mode, enabled); - processPowerHalReturn(ret.isOk(), "setPowerMode"); - return ret.isOk(); + gPowerHalController.setBoost(boost, durationMs); + SurfaceComposerClient::notifyPowerBoost(static_cast(boost)); } static bool setPowerMode(Mode mode, bool enabled) { - std::unique_lock lock(gPowerHalMutex); - if (connectPowerHalLocked() != HalVersion::AIDL) { - ALOGV("Power HAL AIDL not available"); - return false; - } - sp handle = gPowerHalAidl_; - lock.unlock(); - return setPowerModeWithHandle(handle, mode, enabled); -} - -static void sendPowerHint(PowerHint hintId, uint32_t data) { - std::unique_lock lock(gPowerHalMutex); - switch (connectPowerHalLocked()) { - case HalVersion::NONE: - return; - case HalVersion::HIDL_1_0: { - sp handle = gPowerHalHidlV1_0_; - lock.unlock(); - auto ret = handle->powerHint(hintId, data); - processPowerHalReturn(ret.isOk(), "powerHint"); - break; - } - case HalVersion::HIDL_1_1: { - sp handle = gPowerHalHidlV1_1_; - lock.unlock(); - auto ret = handle->powerHintAsync(hintId, data); - processPowerHalReturn(ret.isOk(), "powerHintAsync"); - break; - } - case HalVersion::AIDL: { - if (hintId == PowerHint::INTERACTION) { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerBoostWithHandle(handle, Boost::INTERACTION, data); - break; - } else if (hintId == PowerHint::LAUNCH) { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerModeWithHandle(handle, Mode::LAUNCH, static_cast(data)); - break; - } else if (hintId == PowerHint::LOW_POWER) { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerModeWithHandle(handle, Mode::LOW_POWER, static_cast(data)); - break; - } else if (hintId == PowerHint::SUSTAINED_PERFORMANCE) { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerModeWithHandle(handle, Mode::SUSTAINED_PERFORMANCE, - static_cast(data)); - break; - } else if (hintId == PowerHint::VR_MODE) { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerModeWithHandle(handle, Mode::VR, static_cast(data)); - break; - } else { - ALOGE("Unsupported power hint: %s.", toString(hintId).c_str()); - return; - } - } - default: { - ALOGE("Unknown power HAL state"); - return; - } - } - if (hintId == PowerHint::INTERACTION) { - SurfaceComposerClient::notifyPowerBoost(static_cast(Boost::INTERACTION)); + android::base::Timer t; + auto result = gPowerHalController.setMode(mode, enabled); + if (mode == Mode::INTERACTIVE && t.duration() > 20ms) { + ALOGD("Excessive delay in setting interactive mode to %s while turning screen %s", + enabled ? "true" : "false", enabled ? "on" : "off"); } + return result == power::HalResult::SUCCESSFUL; } void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) { @@ -324,7 +119,7 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t gLastEventTime[eventType] = eventTime; // Tell the power HAL when user activity occurs. - sendPowerHint(PowerHint::INTERACTION, 0); + setPowerBoost(Boost::INTERACTION, 0); } JNIEnv* env = AndroidRuntime::getJNIEnv(); @@ -391,10 +186,7 @@ void disableAutoSuspend() { static void nativeInit(JNIEnv* env, jobject obj) { gPowerManagerServiceObj = env->NewGlobalRef(obj); - - gPowerHalMutex.lock(); - connectPowerHalLocked(); - gPowerHalMutex.unlock(); + gPowerHalController.init(); } static void nativeAcquireSuspendBlocker(JNIEnv *env, jclass /* clazz */, jstring nameStr) { @@ -407,38 +199,6 @@ static void nativeReleaseSuspendBlocker(JNIEnv *env, jclass /* clazz */, jstring release_wake_lock(name.c_str()); } -static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) { - std::unique_lock lock(gPowerHalMutex); - switch (connectPowerHalLocked()) { - case HalVersion::NONE: - return; - case HalVersion::HIDL_1_0: - FALLTHROUGH_INTENDED; - case HalVersion::HIDL_1_1: { - android::base::Timer t; - sp handle = gPowerHalHidlV1_0_; - lock.unlock(); - auto ret = handle->setInteractive(enable); - processPowerHalReturn(ret.isOk(), "setInteractive"); - if (t.duration() > 20ms) { - ALOGD("Excessive delay in setInteractive(%s) while turning screen %s", - enable ? "true" : "false", enable ? "on" : "off"); - } - return; - } - case HalVersion::AIDL: { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerModeWithHandle(handle, Mode::INTERACTIVE, enable); - return; - } - default: { - ALOGE("Unknown power HAL state"); - return; - } - } -} - static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) { if (enable) { android::base::Timer t; @@ -455,10 +215,6 @@ static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean } } -static void nativeSendPowerHint(JNIEnv* /* env */, jclass /* clazz */, jint hintId, jint data) { - sendPowerHint(static_cast(hintId), data); -} - static void nativeSetPowerBoost(JNIEnv* /* env */, jclass /* clazz */, jint boost, jint durationMs) { setPowerBoost(static_cast(boost), durationMs); @@ -469,33 +225,6 @@ static jboolean nativeSetPowerMode(JNIEnv* /* env */, jclass /* clazz */, jint m return setPowerMode(static_cast(mode), enabled); } -static void nativeSetFeature(JNIEnv* /* env */, jclass /* clazz */, jint featureId, jint data) { - std::unique_lock lock(gPowerHalMutex); - switch (connectPowerHalLocked()) { - case HalVersion::NONE: - return; - case HalVersion::HIDL_1_0: - FALLTHROUGH_INTENDED; - case HalVersion::HIDL_1_1: { - sp handle = gPowerHalHidlV1_0_; - lock.unlock(); - auto ret = handle->setFeature(static_cast(featureId), static_cast(data)); - processPowerHalReturn(ret.isOk(), "setFeature"); - return; - } - case HalVersion::AIDL: { - sp handle = gPowerHalAidl_; - lock.unlock(); - setPowerModeWithHandle(handle, Mode::DOUBLE_TAP_TO_WAKE, static_cast(data)); - return; - } - default: { - ALOGE("Unknown power HAL state"); - return; - } - } -} - static bool nativeForceSuspend(JNIEnv* /* env */, jclass /* clazz */) { bool retval = false; getSuspendControl()->forceSuspend(&retval); @@ -512,12 +241,9 @@ static const JNINativeMethod gPowerManagerServiceMethods[] = { {"nativeForceSuspend", "()Z", (void*)nativeForceSuspend}, {"nativeReleaseSuspendBlocker", "(Ljava/lang/String;)V", (void*)nativeReleaseSuspendBlocker}, - {"nativeSetInteractive", "(Z)V", (void*)nativeSetInteractive}, {"nativeSetAutoSuspend", "(Z)V", (void*)nativeSetAutoSuspend}, - {"nativeSendPowerHint", "(II)V", (void*)nativeSendPowerHint}, {"nativeSetPowerBoost", "(II)V", (void*)nativeSetPowerBoost}, {"nativeSetPowerMode", "(IZ)Z", (void*)nativeSetPowerMode}, - {"nativeSetFeature", "(II)V", (void*)nativeSetFeature}, }; #define FIND_CLASS(var, className) \ diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 96690100fc03a..419fb14df3407 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -369,9 +369,11 @@ public class PowerManagerServiceTest { } @Test - public void testCreateService_initializesNativeService() { + public void testCreateService_initializesNativeServiceAndSetsPowerModes() { PowerManagerService service = createService(); verify(mNativeWrapperMock).nativeInit(same(service)); + verify(mNativeWrapperMock).nativeSetPowerMode(eq(Mode.INTERACTIVE), eq(true)); + verify(mNativeWrapperMock).nativeSetPowerMode(eq(Mode.DOUBLE_TAP_TO_WAKE), eq(false)); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java index 2233b2234c688..ff753f21d01b5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java @@ -26,7 +26,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyInt; import static java.util.concurrent.TimeUnit.SECONDS; @@ -34,6 +33,7 @@ import android.animation.AnimationHandler.AnimationFrameCallbackProvider; import android.animation.ValueAnimator; import android.graphics.Matrix; import android.graphics.Point; +import android.hardware.power.Boost; import android.os.Handler; import android.os.PowerManagerInternal; import android.platform.test.annotations.Presubmit; @@ -202,7 +202,7 @@ public class SurfaceAnimationRunnerTest { mMockTransaction, this::finishedCallback); waitUntilNextFrame(); - verify(mMockPowerManager).powerHint(anyInt(), eq(0)); + verify(mMockPowerManager).setPowerBoost(eq(Boost.INTERACTION), eq(0)); } private void waitUntilNextFrame() throws Exception {