Merge "PMS: Add shell command to toggle FIXED_PERFORMANCE" into rvc-dev
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index c44a0bd..187fd59 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -41,6 +41,9 @@
     oneway void setPowerBoost(int boost, int durationMs);
     oneway void setPowerMode(int mode, boolean enabled);
 
+    // Functionally identical to setPowerMode, but returns whether the call was successful
+    boolean setPowerModeChecked(int mode, boolean enabled);
+
     void updateWakeLockWorkSource(IBinder lock, in WorkSource ws, String historyTag);
     boolean isWakeLockLevelSupported(int level);
 
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 86ff926..b41bc5c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -742,8 +742,8 @@
         }
 
         /** Wrapper for PowerManager.nativeSetPowerMode */
-        public void nativeSetPowerMode(int mode, boolean enabled) {
-            PowerManagerService.nativeSetPowerMode(mode, enabled);
+        public boolean nativeSetPowerMode(int mode, boolean enabled) {
+            return PowerManagerService.nativeSetPowerMode(mode, enabled);
         }
 
         /** Wrapper for PowerManager.nativeSetFeature */
@@ -857,7 +857,7 @@
     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 void nativeSetPowerMode(int mode, boolean enabled);
+    private static native boolean nativeSetPowerMode(int mode, boolean enabled);
     private static native void nativeSetFeature(int featureId, int data);
     private static native boolean nativeForceSuspend();
 
@@ -3664,9 +3664,9 @@
         mNativeWrapper.nativeSetPowerBoost(boost, durationMs);
     }
 
-    private void setPowerModeInternal(int mode, boolean enabled) {
+    private boolean setPowerModeInternal(int mode, boolean enabled) {
         // Maybe filter the event.
-        mNativeWrapper.nativeSetPowerMode(mode, enabled);
+        return mNativeWrapper.nativeSetPowerMode(mode, enabled);
     }
 
     @VisibleForTesting
@@ -4739,7 +4739,17 @@
                 return;
             }
             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
-            setPowerModeInternal(mode, enabled);
+            setPowerModeInternal(mode, enabled); // Intentionally ignore return value
+        }
+
+        @Override // Binder call
+        public boolean setPowerModeChecked(int mode, boolean enabled) {
+            if (!mSystemReady) {
+                // Service not ready yet, so who the heck cares about power hints, bah.
+                return false;
+            }
+            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
+            return setPowerModeInternal(mode, enabled);
         }
 
         @Override // Binder call
diff --git a/services/core/java/com/android/server/power/PowerManagerShellCommand.java b/services/core/java/com/android/server/power/PowerManagerShellCommand.java
index edaa6d9..ec5dcfa 100644
--- a/services/core/java/com/android/server/power/PowerManagerShellCommand.java
+++ b/services/core/java/com/android/server/power/PowerManagerShellCommand.java
@@ -18,6 +18,7 @@
 
 import android.content.Intent;
 import android.os.IPowerManager;
+import android.os.PowerManagerInternal;
 import android.os.RemoteException;
 import android.os.ShellCommand;
 
@@ -45,6 +46,8 @@
                     return runSetAdaptiveEnabled();
                 case "set-mode":
                     return runSetMode();
+                case "set-fixed-performance-mode-enabled":
+                    return runSetFixedPerformanceModeEnabled();
                 default:
                     return handleDefaultCommands(cmd);
             }
@@ -72,6 +75,18 @@
         return 0;
     }
 
+    private int runSetFixedPerformanceModeEnabled() throws RemoteException {
+        boolean success = mInterface.setPowerModeChecked(
+                PowerManagerInternal.MODE_FIXED_PERFORMANCE,
+                Boolean.parseBoolean(getNextArgRequired()));
+        if (!success) {
+            final PrintWriter ew = getErrPrintWriter();
+            ew.println("Failed to set FIXED_PERFORMANCE mode");
+            ew.println("This is likely because Power HAL AIDL is not implemented on this device");
+        }
+        return success ? 0 : -1;
+    }
+
     @Override
     public void onHelp() {
         final PrintWriter pw = getOutPrintWriter();
@@ -84,6 +99,10 @@
         pw.println("  set-mode MODE");
         pw.println("    sets the power mode of the device to MODE.");
         pw.println("    1 turns low power mode on and 0 turns low power mode off.");
+        pw.println("  set-fixed-performance-mode-enabled [true|false]");
+        pw.println("    enables or disables fixed performance mode");
+        pw.println("    note: this will affect system performance and should only be used");
+        pw.println("          during development");
         pw.println();
         Intent.printIntentArgsHelp(pw , "");
     }
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index fe05d4e..d19398c 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -225,7 +225,7 @@
     setPowerBoostWithHandle(handle, boost, durationMs);
 }
 
-static void setPowerModeWithHandle(sp<IPowerAidl> handle, Mode mode, bool enabled) {
+static bool setPowerModeWithHandle(sp<IPowerAidl> 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<std::atomic<HalSupport>, static_cast<int32_t>(Mode::DISPLAY_INACTIVE) + 1>
@@ -235,7 +235,7 @@
     if (mode > Mode::DISPLAY_INACTIVE ||
         modeSupportedArray[static_cast<int32_t>(mode)] == HalSupport::OFF) {
         ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str());
-        return;
+        return false;
     }
 
     if (modeSupportedArray[static_cast<int32_t>(mode)] == HalSupport::UNKNOWN) {
@@ -245,23 +245,24 @@
             isSupported ? HalSupport::ON : HalSupport::OFF;
         if (!isSupported) {
             ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str());
-            return;
+            return false;
         }
     }
 
     auto ret = handle->setMode(mode, enabled);
     processPowerHalReturn(ret.isOk(), "setPowerMode");
+    return ret.isOk();
 }
 
-static void setPowerMode(Mode mode, bool enabled) {
+static bool setPowerMode(Mode mode, bool enabled) {
     std::unique_lock<std::mutex> lock(gPowerHalMutex);
     if (connectPowerHalLocked() != HalVersion::AIDL) {
         ALOGV("Power HAL AIDL not available");
-        return;
+        return false;
     }
     sp<IPowerAidl> handle = gPowerHalAidl_;
     lock.unlock();
-    setPowerModeWithHandle(handle, mode, enabled);
+    return setPowerModeWithHandle(handle, mode, enabled);
 }
 
 static void sendPowerHint(PowerHint hintId, uint32_t data) {
@@ -480,8 +481,9 @@
     setPowerBoost(static_cast<Boost>(boost), durationMs);
 }
 
-static void nativeSetPowerMode(JNIEnv* /* env */, jclass /* clazz */, jint mode, jboolean enabled) {
-    setPowerMode(static_cast<Mode>(mode), enabled);
+static jboolean nativeSetPowerMode(JNIEnv* /* env */, jclass /* clazz */, jint mode,
+                                   jboolean enabled) {
+    return setPowerMode(static_cast<Mode>(mode), enabled);
 }
 
 static void nativeSetFeature(JNIEnv* /* env */, jclass /* clazz */, jint featureId, jint data) {
@@ -520,27 +522,19 @@
 // ----------------------------------------------------------------------------
 
 static const JNINativeMethod gPowerManagerServiceMethods[] = {
-    /* name, signature, funcPtr */
-    { "nativeInit", "()V",
-            (void*) nativeInit },
-    { "nativeAcquireSuspendBlocker", "(Ljava/lang/String;)V",
-            (void*) nativeAcquireSuspendBlocker },
-    { "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)V",
-            (void*) nativeSetPowerMode },
-    { "nativeSetFeature", "(II)V",
-            (void*) nativeSetFeature },
+        /* name, signature, funcPtr */
+        {"nativeInit", "()V", (void*)nativeInit},
+        {"nativeAcquireSuspendBlocker", "(Ljava/lang/String;)V",
+         (void*)nativeAcquireSuspendBlocker},
+        {"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) \