diff options
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 |