summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/devicestate/DeviceStateManagerService.java3
-rw-r--r--services/core/java/com/android/server/devicestate/DeviceStatePolicy.java3
-rw-r--r--services/core/java/com/android/server/devicestate/DeviceStateProvider.java3
-rw-r--r--services/core/java/com/android/server/policy/DeviceStatePolicyImpl.java8
-rw-r--r--services/core/java/com/android/server/policy/DeviceStateProviderImpl.java31
-rw-r--r--services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleClosedStatePredicate.java32
-rw-r--r--services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java6
-rw-r--r--services/foldables/devicestateprovider/src/com/android/server/policy/BookStylePreferredScreenCalculator.java36
-rw-r--r--services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java45
-rw-r--r--services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java10
10 files changed, 162 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
index 77cb08bc02bd..cb15abcc65fc 100644
--- a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
+++ b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java
@@ -914,6 +914,9 @@ public final class DeviceStateManagerService extends SystemService {
}
mOverrideRequestController.dumpInternal(pw);
+ pw.println();
+
+ mDeviceStatePolicy.dump(pw, /* args= */ null);
}
}
diff --git a/services/core/java/com/android/server/devicestate/DeviceStatePolicy.java b/services/core/java/com/android/server/devicestate/DeviceStatePolicy.java
index 5c4e2f3426ee..65e508557d06 100644
--- a/services/core/java/com/android/server/devicestate/DeviceStatePolicy.java
+++ b/services/core/java/com/android/server/devicestate/DeviceStatePolicy.java
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.content.Context;
import android.content.res.Resources;
import android.text.TextUtils;
+import android.util.Dumpable;
import com.android.server.policy.DeviceStatePolicyImpl;
@@ -29,7 +30,7 @@ import com.android.server.policy.DeviceStatePolicyImpl;
*
* @see DeviceStateManagerService
*/
-public abstract class DeviceStatePolicy {
+public abstract class DeviceStatePolicy implements Dumpable {
protected final Context mContext;
protected DeviceStatePolicy(@NonNull Context context) {
diff --git a/services/core/java/com/android/server/devicestate/DeviceStateProvider.java b/services/core/java/com/android/server/devicestate/DeviceStateProvider.java
index 50ab3f8b8b6c..d5945f4e8b52 100644
--- a/services/core/java/com/android/server/devicestate/DeviceStateProvider.java
+++ b/services/core/java/com/android/server/devicestate/DeviceStateProvider.java
@@ -21,6 +21,7 @@ import static android.hardware.devicestate.DeviceStateManager.MINIMUM_DEVICE_STA
import android.annotation.IntDef;
import android.annotation.IntRange;
+import android.util.Dumpable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -31,7 +32,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @see DeviceStatePolicy
*/
-public interface DeviceStateProvider {
+public interface DeviceStateProvider extends Dumpable {
int SUPPORTED_DEVICE_STATES_CHANGED_DEFAULT = 0;
/**
diff --git a/services/core/java/com/android/server/policy/DeviceStatePolicyImpl.java b/services/core/java/com/android/server/policy/DeviceStatePolicyImpl.java
index 7754944c008c..07cc7753b4f3 100644
--- a/services/core/java/com/android/server/policy/DeviceStatePolicyImpl.java
+++ b/services/core/java/com/android/server/policy/DeviceStatePolicyImpl.java
@@ -17,11 +17,14 @@
package com.android.server.policy;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import com.android.server.devicestate.DeviceStatePolicy;
import com.android.server.devicestate.DeviceStateProvider;
+import java.io.PrintWriter;
+
/**
* Default empty implementation of {@link DeviceStatePolicy}.
*
@@ -43,4 +46,9 @@ public final class DeviceStatePolicyImpl extends DeviceStatePolicy {
public void configureDeviceForState(int state, @NonNull Runnable onComplete) {
onComplete.run();
}
+
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ mProvider.dump(writer, args);
+ }
}
diff --git a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
index 3644054e3b78..afcf5a094bd4 100644
--- a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
+++ b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java
@@ -58,6 +58,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
@@ -503,6 +504,24 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
// Do nothing.
}
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ writer.println("DeviceStateProviderImpl");
+
+ synchronized (mLock) {
+ writer.println(" mLastReportedState = " + mLastReportedState);
+ writer.println(" mPowerSaveModeEnabled = " + mPowerSaveModeEnabled);
+ writer.println(" mThermalStatus = " + mThermalStatus);
+ writer.println(" mIsLidOpen = " + mIsLidOpen);
+ writer.println(" Sensor values:");
+
+ for (Sensor sensor : mLatestSensorEvent.keySet()) {
+ SensorEvent sensorEvent = mLatestSensorEvent.get(sensor);
+ writer.println(" - " + toSensorValueString(sensor, sensorEvent));
+ }
+ }
+ }
+
/**
* Implementation of {@link BooleanSupplier} that returns {@code true} if the expected lid
* switch open state matches {@link #mIsLidOpen}.
@@ -669,14 +688,16 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider,
Slog.i(TAG, "Sensor values:");
for (Sensor sensor : mLatestSensorEvent.keySet()) {
SensorEvent sensorEvent = mLatestSensorEvent.get(sensor);
- if (sensorEvent != null) {
- Slog.i(TAG, sensor.getName() + ": " + Arrays.toString(sensorEvent.values));
- } else {
- Slog.i(TAG, sensor.getName() + ": null");
- }
+ Slog.i(TAG, toSensorValueString(sensor, sensorEvent));
}
}
+ private String toSensorValueString(Sensor sensor, @Nullable SensorEvent event) {
+ String sensorString = sensor == null ? "null" : sensor.getName();
+ String eventValues = event == null ? "null" : Arrays.toString(event.values);
+ return sensorString + " : " + eventValues;
+ }
+
/**
* Tries to parse the provided file into a {@link DeviceStateConfig} object. Returns
* {@code null} if the file could not be successfully parsed.
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleClosedStatePredicate.java b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleClosedStatePredicate.java
index d5a3cffd71dd..82d5247ebed8 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleClosedStatePredicate.java
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleClosedStatePredicate.java
@@ -35,6 +35,7 @@ import android.hardware.SensorManager;
import android.hardware.display.DisplayManager;
import android.os.Handler;
import android.util.ArraySet;
+import android.util.Dumpable;
import android.view.Display;
import android.view.Surface;
@@ -43,7 +44,9 @@ import com.android.server.policy.BookStylePreferredScreenCalculator.HingeAngle;
import com.android.server.policy.BookStylePreferredScreenCalculator.StateTransition;
import com.android.server.policy.BookStyleClosedStatePredicate.ConditionSensorListener.SensorSubscription;
+import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
@@ -56,7 +59,7 @@ import java.util.function.Supplier;
* See {@link BookStyleStateTransitions} for detailed description of the default behavior.
*/
public class BookStyleClosedStatePredicate implements Predicate<FoldableDeviceStateProvider>,
- DisplayManager.DisplayListener {
+ DisplayManager.DisplayListener, Dumpable {
private final BookStylePreferredScreenCalculator mClosedStateCalculator;
private final Handler mHandler = new Handler();
@@ -154,6 +157,14 @@ public class BookStyleClosedStatePredicate implements Predicate<FoldableDeviceSt
}
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ writer.println(" " + getDumpableName());
+
+ mPostureEstimator.dump(writer, args);
+ mClosedStateCalculator.dump(writer, args);
+ }
+
public interface ClosedStateUpdatesListener {
void onClosedStateUpdated();
}
@@ -161,7 +172,7 @@ public class BookStyleClosedStatePredicate implements Predicate<FoldableDeviceSt
/**
* Estimates if the device is going to enter wedge/tent mode based on the sensor data
*/
- private static class PostureEstimator implements SensorEventListener {
+ private static class PostureEstimator implements SensorEventListener, Dumpable {
private static final int FLAT_INCLINATION_THRESHOLD_DEGREES = 8;
@@ -356,6 +367,23 @@ public class BookStyleClosedStatePredicate implements Predicate<FoldableDeviceSt
mDeviceClosed = deviceClosed;
mConditionedSensorListener.updateListeningState();
}
+
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ writer.println(" " + getDumpableName());
+ writer.println(" isLikelyTentOrWedgeMode = " + isLikelyTentOrWedgeMode());
+ writer.println(" mScreenTurnedOn = " + mScreenTurnedOn);
+ writer.println(" mLastScreenRotation = " + mLastScreenRotation);
+ writer.println(" mDeviceClosed = " + mDeviceClosed);
+ writer.println(" mLeftGravityVector = " + Arrays.toString(mLeftGravityVector));
+ writer.println(" mRightGravityVector = " + Arrays.toString(mRightGravityVector));
+ }
+
+ @NonNull
+ @Override
+ public String getDumpableName() {
+ return "PostureEstimator";
+ }
}
/**
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java
index ad938aff396a..8b22718786e5 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStyleDeviceStatePolicy.java
@@ -38,6 +38,7 @@ import com.android.server.policy.FoldableDeviceStateProvider.DeviceStateConfigur
import com.android.server.policy.feature.flags.FeatureFlags;
import com.android.server.policy.feature.flags.FeatureFlagsImpl;
+import java.io.PrintWriter;
import java.util.function.Predicate;
/**
@@ -182,4 +183,9 @@ public class BookStyleDeviceStatePolicy extends DeviceStatePolicy implements
public void configureDeviceForState(int state, @NonNull Runnable onComplete) {
onComplete.run();
}
+
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ mProvider.dump(writer, args);
+ }
}
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStylePreferredScreenCalculator.java b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStylePreferredScreenCalculator.java
index 8977422a90a8..69d793e5f989 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/BookStylePreferredScreenCalculator.java
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/BookStylePreferredScreenCalculator.java
@@ -16,8 +16,14 @@
package com.android.server.policy;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Build;
+import android.util.Dumpable;
+import android.util.Slog;
+
+import java.io.PrintWriter;
import java.util.List;
import java.util.Objects;
@@ -31,7 +37,12 @@ import java.util.Objects;
*
* See {@link BookStyleStateTransitions} for detailed description of the default behavior.
*/
-public class BookStylePreferredScreenCalculator {
+public class BookStylePreferredScreenCalculator implements Dumpable {
+
+ private static final String TAG = "BookStylePreferredScreenCalculator";
+
+ // TODO(b/322137477): disable by default on all builds after flag clean-up
+ private static final boolean DEBUG = Build.IS_USERDEBUG || Build.IS_ENG;
/**
* When calculating the new state we will re-calculate it until it settles down. We re-calculate
@@ -77,6 +88,9 @@ public class BookStylePreferredScreenCalculator {
*/
public PreferredScreen calculatePreferredScreen(HingeAngle angle, boolean likelyTentOrWedge,
boolean likelyReverseWedge) {
+
+ final State oldState = mState;
+
int attempts = 0;
State newState = calculateNewState(mState, angle, likelyTentOrWedge, likelyReverseWedge);
while (attempts < MAX_STATE_CHANGES && !Objects.equals(mState, newState)) {
@@ -92,7 +106,6 @@ public class BookStylePreferredScreenCalculator {
+ ", likelyReverseWedge = " + likelyReverseWedge);
}
- final State oldState = mState;
mState = newState;
if (mState.mPreferredScreen == PreferredScreen.INVALID) {
@@ -103,6 +116,13 @@ public class BookStylePreferredScreenCalculator {
+ oldState);
}
+ if (DEBUG && !Objects.equals(oldState, newState)) {
+ Slog.d(TAG, "Moving to state " + mState
+ + " (hingeAngle = " + angle
+ + ", likelyTentOrWedge = " + likelyTentOrWedge
+ + ", likelyReverseWedge = " + likelyReverseWedge + ")");
+ }
+
return mState.mPreferredScreen;
}
@@ -129,6 +149,18 @@ public class BookStylePreferredScreenCalculator {
+ likelyReverseWedge);
}
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ writer.println(" " + getDumpableName());
+ writer.println(" mState = " + mState);
+ }
+
+ @NonNull
+ @Override
+ public String getDumpableName() {
+ return TAG;
+ }
+
/**
* The angle between two halves of the foldable device in degrees. The angle is '0' when
* the device is fully closed and '180' when the device is fully open and flat.
diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java b/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java
index ba7297790dc9..021a667113e7 100644
--- a/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java
+++ b/services/foldables/devicestateprovider/src/com/android/server/policy/FoldableDeviceStateProvider.java
@@ -39,6 +39,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.Trace;
+import android.util.Dumpable;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -52,6 +53,7 @@ import com.android.server.devicestate.DeviceStateProvider;
import com.android.server.policy.feature.flags.FeatureFlags;
import com.android.server.policy.feature.flags.FeatureFlagsImpl;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
@@ -87,6 +89,8 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider,
// the conditions needed for availability.
private final SparseArray<BooleanSupplier> mStateAvailabilityConditions = new SparseArray<>();
+ private final DeviceStateConfiguration[] mConfigurations;
+
@GuardedBy("mLock")
private final SparseBooleanArray mExternalDisplaysConnected = new SparseBooleanArray();
@@ -142,6 +146,7 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider,
mHingeAngleSensor = hingeAngleSensor;
mHallSensor = hallSensor;
mDisplayManager = displayManager;
+ mConfigurations = deviceStateConfigurations;
mIsDualDisplayBlockingEnabled = featureFlags.enableDualDisplayBlocking();
sensorManager.registerListener(this, mHingeAngleSensor, SENSOR_DELAY_FASTEST);
@@ -350,16 +355,20 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider,
@GuardedBy("mLock")
private void dumpSensorValues() {
Slog.i(TAG, "Sensor values:");
- dumpSensorValues("Hall Sensor", mHallSensor, mLastHallSensorEvent);
- dumpSensorValues("Hinge Angle Sensor", mHingeAngleSensor, mLastHingeAngleSensorEvent);
+ dumpSensorValues(mHallSensor, mLastHallSensorEvent);
+ dumpSensorValues(mHingeAngleSensor, mLastHingeAngleSensorEvent);
Slog.i(TAG, "isScreenOn: " + isScreenOn());
}
@GuardedBy("mLock")
- private void dumpSensorValues(String sensorType, Sensor sensor, @Nullable SensorEvent event) {
+ private void dumpSensorValues(Sensor sensor, @Nullable SensorEvent event) {
+ Slog.i(TAG, toSensorValueString(sensor, event));
+ }
+
+ private String toSensorValueString(Sensor sensor, @Nullable SensorEvent event) {
String sensorString = sensor == null ? "null" : sensor.getName();
String eventValues = event == null ? "null" : Arrays.toString(event.values);
- Slog.i(TAG, sensorType + " : " + sensorString + " : " + eventValues);
+ return sensorString + " : " + eventValues;
}
@Override
@@ -414,6 +423,34 @@ public final class FoldableDeviceStateProvider implements DeviceStateProvider,
}
}
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ writer.println("FoldableDeviceStateProvider");
+
+ synchronized (mLock) {
+ writer.println(" mLastReportedState = " + mLastReportedState);
+ writer.println(" mPowerSaveModeEnabled = " + mPowerSaveModeEnabled);
+ writer.println(" mThermalStatus = " + mThermalStatus);
+ writer.println(" mLastHingeAngleSensorEvent = " +
+ toSensorValueString(mHingeAngleSensor, mLastHingeAngleSensorEvent));
+ writer.println(" mLastHallSensorEvent = " +
+ toSensorValueString(mHallSensor, mLastHallSensorEvent));
+ }
+
+ writer.println();
+ writer.println(" Predicates:");
+
+ for (int i = 0; i < mConfigurations.length; i++) {
+ final DeviceStateConfiguration configuration = mConfigurations[i];
+ final Predicate<FoldableDeviceStateProvider> predicate =
+ configuration.mActiveStatePredicate;
+
+ if (predicate instanceof Dumpable dumpable) {
+ dumpable.dump(writer, /* args= */ null);
+ }
+ }
+ }
+
/**
* Configuration for a single device state, contains information about the state like
* identifier, name, flags and a predicate that should return true if the state should
diff --git a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java
index 7dcfc88e998c..fa3936443f31 100644
--- a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java
@@ -30,6 +30,7 @@ import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertThrows;
+import android.annotation.NonNull;
import android.hardware.devicestate.DeviceStateInfo;
import android.hardware.devicestate.DeviceStateRequest;
import android.hardware.devicestate.IDeviceStateManagerCallback;
@@ -52,6 +53,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Optional;
@@ -959,6 +961,10 @@ public final class DeviceStateManagerServiceTest {
}
onComplete.run();
}
+
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ }
}
private static final class TestDeviceStateProvider implements DeviceStateProvider {
@@ -1001,6 +1007,10 @@ public final class DeviceStateManagerServiceTest {
public void setState(int identifier) {
mListener.onStateChanged(identifier);
}
+
+ @Override
+ public void dump(@NonNull PrintWriter writer, @Nullable String[] args) {
+ }
}
private static final class TestDeviceStateManagerCallback extends