From e250d326b9bf0101b1d041ed889886d0d8a84eef Mon Sep 17 00:00:00 2001 From: Ahmed Hassan Date: Thu, 15 Oct 2020 13:16:05 +0100 Subject: [PATCH] Add ADB commands to control ambient display Adds the following ADB commands 'adb shell cmd power suppress-ambient-display true|false' Controls suppressing ambient display through PowerManager#suppressAmbientDisplay() 'adb shell cmd power list-ambient-display-suppression-tokens' Prints the tokens suppressing ambient display through the suppress-ambient-display command Bug: 151138820 Test: Invoking the ADB commands, FrameworksServicesTests:PowerManagerServiceTest Change-Id: I49686ae60d83a40311ceb0c92732ddb298f0374b --- .../AmbientDisplaySuppressionController.java | 20 ++++++++ .../server/power/PowerManagerService.java | 16 ++++++ .../power/PowerManagerShellCommand.java | 49 ++++++++++++++++--- .../server/power/PowerManagerServiceTest.java | 29 +++++++++++ 4 files changed, 107 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/power/AmbientDisplaySuppressionController.java b/services/core/java/com/android/server/power/AmbientDisplaySuppressionController.java index 3bb90ce38a733..aad7b1457b3c2 100644 --- a/services/core/java/com/android/server/power/AmbientDisplaySuppressionController.java +++ b/services/core/java/com/android/server/power/AmbientDisplaySuppressionController.java @@ -29,7 +29,9 @@ import android.util.Slog; import com.android.internal.statusbar.IStatusBarService; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Set; /** @@ -72,6 +74,24 @@ public class AmbientDisplaySuppressionController { } } + /** + * Returns the tokens used to suppress ambient display through + * {@link #suppress(String, int, boolean)}. + * + * @param callingUid The uid of the calling application. + */ + List getSuppressionTokens(int callingUid) { + List result = new ArrayList<>(); + synchronized (mSuppressionTokens) { + for (Pair token : mSuppressionTokens) { + if (token.second == callingUid) { + result.add(token.first); + } + } + } + return result; + } + /** * Returns whether ambient display is suppressed for the given token. * diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 60da8e5c7b706..ccd659dcf5a46 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -5500,6 +5500,22 @@ public final class PowerManagerService extends SystemService Binder.restoreCallingIdentity(ident); } } + + /** + * Returns the tokens used to suppress ambient display by the calling app. + * + *

The calling app suppressed ambient display by calling + * {@link #suppressAmbientDisplay(String, boolean)}. + */ + public List getAmbientDisplaySuppressionTokens() { + final int uid = Binder.getCallingUid(); + final long ident = Binder.clearCallingIdentity(); + try { + return mAmbientDisplaySuppressionController.getSuppressionTokens(uid); + } finally { + Binder.restoreCallingIdentity(ident); + } + } } @VisibleForTesting diff --git a/services/core/java/com/android/server/power/PowerManagerShellCommand.java b/services/core/java/com/android/server/power/PowerManagerShellCommand.java index ec5dcfab7f401..a9b33ed58ef73 100644 --- a/services/core/java/com/android/server/power/PowerManagerShellCommand.java +++ b/services/core/java/com/android/server/power/PowerManagerShellCommand.java @@ -17,20 +17,20 @@ package com.android.server.power; import android.content.Intent; -import android.os.IPowerManager; import android.os.PowerManagerInternal; import android.os.RemoteException; import android.os.ShellCommand; import java.io.PrintWriter; +import java.util.List; class PowerManagerShellCommand extends ShellCommand { private static final int LOW_POWER_MODE_ON = 1; - final IPowerManager mInterface; + final PowerManagerService.BinderService mService; - PowerManagerShellCommand(IPowerManager service) { - mInterface = service; + PowerManagerShellCommand(PowerManagerService.BinderService service) { + mService = service; } @Override @@ -48,6 +48,10 @@ class PowerManagerShellCommand extends ShellCommand { return runSetMode(); case "set-fixed-performance-mode-enabled": return runSetFixedPerformanceModeEnabled(); + case "suppress-ambient-display": + return runSuppressAmbientDisplay(); + case "list-ambient-display-suppression-tokens": + return runListAmbientDisplaySuppressionTokens(); default: return handleDefaultCommands(cmd); } @@ -58,7 +62,7 @@ class PowerManagerShellCommand extends ShellCommand { } private int runSetAdaptiveEnabled() throws RemoteException { - mInterface.setAdaptivePowerSaveEnabled(Boolean.parseBoolean(getNextArgRequired())); + mService.setAdaptivePowerSaveEnabled(Boolean.parseBoolean(getNextArgRequired())); return 0; } @@ -71,12 +75,12 @@ class PowerManagerShellCommand extends ShellCommand { pw.println("Error: " + ex.toString()); return -1; } - mInterface.setPowerSaveModeEnabled(mode == LOW_POWER_MODE_ON); + mService.setPowerSaveModeEnabled(mode == LOW_POWER_MODE_ON); return 0; } private int runSetFixedPerformanceModeEnabled() throws RemoteException { - boolean success = mInterface.setPowerModeChecked( + boolean success = mService.setPowerModeChecked( PowerManagerInternal.MODE_FIXED_PERFORMANCE, Boolean.parseBoolean(getNextArgRequired())); if (!success) { @@ -87,6 +91,32 @@ class PowerManagerShellCommand extends ShellCommand { return success ? 0 : -1; } + private int runSuppressAmbientDisplay() throws RemoteException { + final PrintWriter pw = getOutPrintWriter(); + + try { + String token = getNextArgRequired(); + boolean enabled = Boolean.parseBoolean(getNextArgRequired()); + mService.suppressAmbientDisplay(token, enabled); + } catch (RuntimeException ex) { + pw.println("Error: " + ex.toString()); + return -1; + } + + return 0; + } + + private int runListAmbientDisplaySuppressionTokens() throws RemoteException { + final PrintWriter pw = getOutPrintWriter(); + List tokens = mService.getAmbientDisplaySuppressionTokens(); + if (tokens.isEmpty()) { + pw.println("none"); + } else { + pw.println(String.format("[%s]", String.join(", ", tokens))); + } + + return 0; + } @Override public void onHelp() { final PrintWriter pw = getOutPrintWriter(); @@ -103,6 +133,11 @@ class PowerManagerShellCommand extends ShellCommand { 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(" suppress-ambient-display [true|false]"); + pw.println(" suppresses the current ambient display configuration and disables"); + pw.println(" ambient display"); + pw.println(" list-ambient-display-suppression-tokens"); + pw.println(" prints the tokens used to suppress ambient display"); pw.println(); Intent.printIntentArgsHelp(pw , ""); } 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 6febae00f0fbc..7f35511236f7d 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -1052,6 +1052,35 @@ public class PowerManagerServiceTest { .isFalse(); } + @Test + public void testGetAmbientDisplaySuppressionTokens_default() { + createService(); + BinderService service = mService.getBinderServiceInstance(); + + assertThat(service.getAmbientDisplaySuppressionTokens()).isEmpty(); + } + + @Test + public void testGetAmbientDisplaySuppressionTokens_singleToken() { + createService(); + BinderService service = mService.getBinderServiceInstance(); + service.suppressAmbientDisplay("test1", true); + service.suppressAmbientDisplay("test2", false); + + assertThat(service.getAmbientDisplaySuppressionTokens()).containsExactly("test1"); + } + + @Test + public void testGetAmbientDisplaySuppressionTokens_multipleTokens() { + createService(); + BinderService service = mService.getBinderServiceInstance(); + service.suppressAmbientDisplay("test1", true); + service.suppressAmbientDisplay("test2", true); + + assertThat(service.getAmbientDisplaySuppressionTokens()) + .containsExactly("test1", "test2"); + } + @Test public void testSetPowerBoost_redirectsCallToNativeWrapper() { createService();