summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2014-08-23 00:23:34 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-08-23 00:23:41 +0000
commitd7761be23d30b5e9ca9c07998af27e704d2a7ae2 (patch)
tree9c42e5792ae39f20eda4ed0a20d38af6da5a2f17
parentde25dc0708bcc949f6e8b5ffdca0d95a76546935 (diff)
parent0a571123544058578b4ef1558c276a4050519652 (diff)
downloadframeworks_base-d7761be23d30b5e9ca9c07998af27e704d2a7ae2.zip
frameworks_base-d7761be23d30b5e9ca9c07998af27e704d2a7ae2.tar.gz
frameworks_base-d7761be23d30b5e9ca9c07998af27e704d2a7ae2.tar.bz2
Merge "Poke interactive hint from userActivity and add @SystemApi." into lmp-dev
-rw-r--r--core/java/android/os/PowerManager.java54
-rw-r--r--core/res/AndroidManifest.xml7
-rw-r--r--core/res/res/values/strings.xml5
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java34
4 files changed, 88 insertions, 12 deletions
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 67ec563..4b206e3 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -17,6 +17,7 @@
package android.os;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.content.Context;
import android.util.Log;
@@ -274,28 +275,44 @@ public final class PowerManager {
* User activity event type: Unspecified event type.
* @hide
*/
+ @SystemApi
public static final int USER_ACTIVITY_EVENT_OTHER = 0;
/**
* User activity event type: Button or key pressed or released.
* @hide
*/
+ @SystemApi
public static final int USER_ACTIVITY_EVENT_BUTTON = 1;
/**
* User activity event type: Touch down, move or up.
* @hide
*/
+ @SystemApi
public static final int USER_ACTIVITY_EVENT_TOUCH = 2;
/**
- * User activity flag: Do not restart the user activity timeout or brighten
- * the display in response to user activity if it is already dimmed.
+ * User activity flag: If already dimmed, extend the dim timeout
+ * but do not brighten. This flag is useful for keeping the screen on
+ * a little longer without causing a visible change such as when
+ * the power key is pressed.
* @hide
*/
+ @SystemApi
public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
/**
+ * User activity flag: Note the user activity as usual but do not
+ * reset the user activity timeout. This flag is useful for applying
+ * user activity power hints when interacting with the device indirectly
+ * on a secondary screen while allowing the primary screen to go to sleep.
+ * @hide
+ */
+ @SystemApi
+ public static final int USER_ACTIVITY_FLAG_INDIRECT = 1 << 1;
+
+ /**
* Go to sleep reason code: Going to sleep due by application request.
* @hide
*/
@@ -506,9 +523,38 @@ public final class PowerManager {
* @see #goToSleep
*/
public void userActivity(long when, boolean noChangeLights) {
+ userActivity(when, USER_ACTIVITY_EVENT_OTHER,
+ noChangeLights ? USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0);
+ }
+
+ /**
+ * Notifies the power manager that user activity happened.
+ * <p>
+ * Resets the auto-off timer and brightens the screen if the device
+ * is not asleep. This is what happens normally when a key or the touch
+ * screen is pressed or when some other user activity occurs.
+ * This method does not wake up the device if it has been put to sleep.
+ * </p><p>
+ * Requires the {@link android.Manifest.permission#DEVICE_POWER} or
+ * {@link android.Manifest.permission#USER_ACTIVITY} permission.
+ * </p>
+ *
+ * @param when The time of the user activity, in the {@link SystemClock#uptimeMillis()}
+ * time base. This timestamp is used to correctly order the user activity request with
+ * other power management functions. It should be set
+ * to the timestamp of the input event that caused the user activity.
+ * @param event The user activity event.
+ * @param flags Optional user activity flags.
+ *
+ * @see #wakeUp
+ * @see #goToSleep
+ *
+ * @hide Requires signature or system permission.
+ */
+ @SystemApi
+ public void userActivity(long when, int event, int flags) {
try {
- mService.userActivity(when, USER_ACTIVITY_EVENT_OTHER,
- noChangeLights ? USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0);
+ mService.userActivity(when, event, flags);
} catch (RemoteException e) {
}
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 0a395e1..672ad84 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2408,6 +2408,13 @@
android:description="@string/permdesc_devicePower"
android:protectionLevel="signature" />
+ <!-- Allows access to the PowerManager.userActivity function.
+ <p>Not for use by third-party applications. @hide @SystemApi -->
+ <permission android:name="android.permission.USER_ACTIVITY"
+ android:label="@string/permlab_userActivity"
+ android:description="@string/permdesc_userActivity"
+ android:protectionLevel="signature|system" />
+
<!-- @hide Allows low-level access to tun tap driver -->
<permission android:name="android.permission.NET_TUNNELING"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a7f147f..b167c0a 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1815,6 +1815,11 @@
<string name="permdesc_devicePower" product="default">Allows the app to turn the phone on or off.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_userActivity">reset display timeout</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_userActivity">Allows the app to reset the display timeout.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_factoryTest">run in factory test mode</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_factoryTest" product="tablet">Run as a low-level manufacturer test,
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index a10136b..f47a07c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -160,9 +160,9 @@ public final class PowerManagerService extends com.android.server.SystemService
// Poll interval in milliseconds for watching boot animation finished.
private static final int BOOT_ANIMATION_POLL_INTERVAL = 200;
- // Used to send the hint to the PowerHAL indicating transitions
- // from and to the low power mode.
- private static final int POWER_HINT_LOW_POWER_MODE = 5;
+ // Power hints defined in hardware/libhardware/include/hardware/power.h.
+ private static final int POWER_HINT_INTERACTION = 2;
+ private static final int POWER_HINT_LOW_POWER = 5;
private final Context mContext;
private final ServiceThread mHandlerThread;
@@ -223,6 +223,9 @@ public final class PowerManagerService extends com.android.server.SystemService
private long mLastUserActivityTime;
private long mLastUserActivityTimeNoChangeLights;
+ // Timestamp of last interactive power hint.
+ private long mLastInteractivePowerHintTime;
+
// A bitfield that summarizes the effect of the user activity timer.
// A zero value indicates that the user activity timer has expired.
private int mUserActivitySummary;
@@ -707,7 +710,7 @@ public final class PowerManagerService extends com.android.server.SystemService
final boolean lowPowerModeEnabled = mLowPowerModeSetting;
if (mLowPowerModeEnabled != lowPowerModeEnabled) {
mLowPowerModeEnabled = lowPowerModeEnabled;
- powerHintInternal(POWER_HINT_LOW_POWER_MODE, lowPowerModeEnabled ? 1 : 0);
+ powerHintInternal(POWER_HINT_LOW_POWER, lowPowerModeEnabled ? 1 : 0);
mLowPowerModeEnabled = lowPowerModeEnabled;
BackgroundThread.getHandler().post(new Runnable() {
@Override
@@ -969,15 +972,25 @@ public final class PowerManagerService extends com.android.server.SystemService
}
if (eventTime < mLastSleepTime || eventTime < mLastWakeTime
- || mWakefulness == WAKEFULNESS_ASLEEP || mWakefulness == WAKEFULNESS_DOZING
|| !mBootCompleted || !mSystemReady) {
return false;
}
Trace.traceBegin(Trace.TRACE_TAG_POWER, "userActivity");
try {
+ if (eventTime > mLastInteractivePowerHintTime) {
+ powerHintInternal(POWER_HINT_INTERACTION, 0);
+ mLastInteractivePowerHintTime = eventTime;
+ }
+
mNotifier.onUserActivity(event, uid);
+ if (mWakefulness == WAKEFULNESS_ASLEEP
+ || mWakefulness == WAKEFULNESS_DOZING
+ || (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) {
+ return false;
+ }
+
if ((flags & PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) != 0) {
if (eventTime > mLastUserActivityTimeNoChangeLights
&& eventTime > mLastUserActivityTime) {
@@ -2319,6 +2332,8 @@ public final class PowerManagerService extends com.android.server.SystemService
pw.println(" mLastUserActivityTime=" + TimeUtils.formatUptime(mLastUserActivityTime));
pw.println(" mLastUserActivityTimeNoChangeLights="
+ TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights));
+ pw.println(" mLastInteractivePowerHintTime="
+ + TimeUtils.formatUptime(mLastInteractivePowerHintTime));
pw.println(" mDisplayReady=" + mDisplayReady);
pw.println(" mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker);
pw.println(" mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker);
@@ -2863,7 +2878,10 @@ public final class PowerManagerService extends com.android.server.SystemService
public void userActivity(long eventTime, int event, int flags) {
final long now = SystemClock.uptimeMillis();
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER)
- != PackageManager.PERMISSION_GRANTED) {
+ != PackageManager.PERMISSION_GRANTED
+ && mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.USER_ACTIVITY)
+ != PackageManager.PERMISSION_GRANTED) {
// Once upon a time applications could call userActivity().
// Now we require the DEVICE_POWER permission. Log a warning and ignore the
// request instead of throwing a SecurityException so we don't break old apps.
@@ -2871,8 +2889,8 @@ public final class PowerManagerService extends com.android.server.SystemService
if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) {
mLastWarningAboutUserActivityPermission = now;
Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the "
- + "caller does not have DEVICE_POWER permission. "
- + "Please fix your app! "
+ + "caller does not have DEVICE_POWER or USER_ACTIVITY "
+ + "permission. Please fix your app! "
+ " pid=" + Binder.getCallingPid()
+ " uid=" + Binder.getCallingUid());
}