diff options
| author | 2024-03-04 19:59:07 +0000 | |
|---|---|---|
| committer | 2024-03-08 18:17:35 +0000 | |
| commit | aec75f67b2157947e8875d59f95a15a4c302ddf6 (patch) | |
| tree | dc481b0a7bcfba9236aef5c8ecef2435bfe1eb6d | |
| parent | d48642dc45f795006556b3ed4693c30fa3ea2540 (diff) | |
Pass DeviceState objects from DeviceStateManagerService to the client
Returns DeviceState objects from the system server to clients that
are listening to DeviceStateManager
Bug: 293636629
Test: DeviceStateInfoTest
Test: DeviceStateManagerGlobalTest
Change-Id: I4e33a32fd65a9059a2136492179029ee218b26a1
9 files changed, 366 insertions, 281 deletions
diff --git a/core/java/android/hardware/devicestate/DeviceState.java b/core/java/android/hardware/devicestate/DeviceState.java index be129c4362c4..905d911248ca 100644 --- a/core/java/android/hardware/devicestate/DeviceState.java +++ b/core/java/android/hardware/devicestate/DeviceState.java @@ -25,6 +25,9 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.ArraySet; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -35,8 +38,7 @@ import java.util.Objects; import java.util.Set; /** - * A state of the device defined by the {@link DeviceStateProvider} and managed by the - * {@link DeviceStateManagerService}. + * A state of the device managed by {@link DeviceStateManager}. * <p> * Device state is an abstract concept that allows mapping the current state of the device to the * state of the system. This is useful for variable-state devices, like foldable or rollable @@ -298,13 +300,14 @@ public final class DeviceState { public @interface SystemDeviceStateProperties {} @NonNull - private DeviceState.Configuration mDeviceStateConfiguration; + private final DeviceState.Configuration mDeviceStateConfiguration; @DeviceStateFlags private final int mFlags; /** @hide */ public DeviceState(@NonNull DeviceState.Configuration deviceStateConfiguration) { + Objects.requireNonNull(deviceStateConfiguration, "Device StateConfiguration is null"); mDeviceStateConfiguration = deviceStateConfiguration; mFlags = 0; } @@ -408,8 +411,7 @@ public final class DeviceState { */ public boolean hasProperties(@NonNull @DeviceStateProperties int... properties) { for (int i = 0; i < properties.length; i++) { - if (!mDeviceStateConfiguration.mSystemProperties.contains(properties[i]) - || !mDeviceStateConfiguration.mPhysicalProperties.contains(properties[i])) { + if (!hasProperty(properties[i])) { return false; } } @@ -436,7 +438,7 @@ public final class DeviceState { * @see DeviceStateManager * @hide */ - public static class Configuration { + public static final class Configuration implements Parcelable { /** Unique identifier for the device state. */ @IntRange(from = MINIMUM_DEVICE_STATE_IDENTIFIER, to = MAXIMUM_DEVICE_STATE_IDENTIFIER) private final int mIdentifier; @@ -445,21 +447,23 @@ public final class DeviceState { @NonNull private final String mName; - /** {@link Set} of system properties that apply to this state. */ + /** {@link ArraySet} of system properties that apply to this state. */ @NonNull - private final Set<@SystemDeviceStateProperties Integer> mSystemProperties; + private final ArraySet<@SystemDeviceStateProperties Integer> mSystemProperties; - /** {@link Set} of physical device properties that apply to this state. */ + /** {@link ArraySet} of physical device properties that apply to this state. */ @NonNull - private final Set<@PhysicalDeviceStateProperties Integer> mPhysicalProperties; + private final ArraySet<@PhysicalDeviceStateProperties Integer> mPhysicalProperties; private Configuration(int identifier, @NonNull String name, @NonNull Set<@SystemDeviceStateProperties Integer> systemProperties, @NonNull Set<@PhysicalDeviceStateProperties Integer> physicalProperties) { mIdentifier = identifier; mName = name; - mSystemProperties = systemProperties; - mPhysicalProperties = physicalProperties; + mSystemProperties = new ArraySet<@SystemDeviceStateProperties Integer>( + systemProperties); + mPhysicalProperties = new ArraySet<@PhysicalDeviceStateProperties Integer>( + physicalProperties); } /** Returns the unique identifier for the device state. */ @@ -511,6 +515,51 @@ public final class DeviceState { return Objects.hash(mIdentifier, mName, mSystemProperties, mPhysicalProperties); } + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(mIdentifier); + dest.writeString8(mName); + + dest.writeInt(mSystemProperties.size()); + for (int i = 0; i < mSystemProperties.size(); i++) { + dest.writeInt(mSystemProperties.valueAt(i)); + } + + dest.writeInt(mPhysicalProperties.size()); + for (int i = 0; i < mPhysicalProperties.size(); i++) { + dest.writeInt(mPhysicalProperties.valueAt(i)); + } + } + + @NonNull + public static final Creator<DeviceState.Configuration> CREATOR = new Creator<>() { + @Override + public DeviceState.Configuration createFromParcel(Parcel source) { + int identifier = source.readInt(); + String name = source.readString8(); + ArraySet<@DeviceStateProperties Integer> systemProperties = new ArraySet<>(); + for (int i = 0; i < source.readInt(); i++) { + systemProperties.add(source.readInt()); + } + ArraySet<@DeviceStateProperties Integer> physicalProperties = new ArraySet<>(); + for (int j = 0; j < source.readInt(); j++) { + physicalProperties.add(source.readInt()); + } + return new DeviceState.Configuration(identifier, name, systemProperties, + physicalProperties); + } + + @Override + public DeviceState.Configuration[] newArray(int size) { + return new DeviceState.Configuration[size]; + } + }; + /** @hide */ public static class Builder { private final int mIdentifier; diff --git a/core/java/android/hardware/devicestate/DeviceStateInfo.java b/core/java/android/hardware/devicestate/DeviceStateInfo.java index bc6af37afc45..c319c893aaab 100644 --- a/core/java/android/hardware/devicestate/DeviceStateInfo.java +++ b/core/java/android/hardware/devicestate/DeviceStateInfo.java @@ -24,7 +24,8 @@ import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; @@ -56,19 +57,19 @@ public final class DeviceStateInfo implements Parcelable { * The list of states supported by the device. */ @NonNull - public final int[] supportedStates; + public final ArrayList<DeviceState> supportedStates; /** * The base (non-override) state of the device. The base state is the state of the device * ignoring any override requests made through a call to {@link DeviceStateManager#requestState( * DeviceStateRequest, Executor, DeviceStateRequest.Callback)}. */ - public final int baseState; + public final DeviceState baseState; /** * The state of the device. */ - public final int currentState; + public final DeviceState currentState; /** * Creates a new instance of {@link DeviceStateInfo}. @@ -76,8 +77,9 @@ public final class DeviceStateInfo implements Parcelable { * NOTE: Unlike {@link #DeviceStateInfo(DeviceStateInfo)}, this constructor does not copy the * supplied parameters. */ - public DeviceStateInfo(@NonNull int[] supportedStates, int baseState, int state) { - this.supportedStates = supportedStates; + public DeviceStateInfo(@NonNull List<DeviceState> supportedStates, DeviceState baseState, + DeviceState state) { + this.supportedStates = new ArrayList<>(supportedStates); this.baseState = baseState; this.currentState = state; } @@ -87,8 +89,7 @@ public final class DeviceStateInfo implements Parcelable { * the fields of the returned instance. */ public DeviceStateInfo(@NonNull DeviceStateInfo info) { - this(Arrays.copyOf(info.supportedStates, info.supportedStates.length), - info.baseState, info.currentState); + this(List.copyOf(info.supportedStates), info.baseState, info.currentState); } @Override @@ -96,15 +97,15 @@ public final class DeviceStateInfo implements Parcelable { if (this == other) return true; if (other == null || getClass() != other.getClass()) return false; DeviceStateInfo that = (DeviceStateInfo) other; - return baseState == that.baseState - && currentState == that.currentState - && Arrays.equals(supportedStates, that.supportedStates); + return baseState.equals(that.baseState) + && currentState.equals(that.currentState) + && Objects.equals(supportedStates, that.supportedStates); } @Override public int hashCode() { int result = Objects.hash(baseState, currentState); - result = 31 * result + Arrays.hashCode(supportedStates); + result = 31 * result + supportedStates.hashCode(); return result; } @@ -112,13 +113,13 @@ public final class DeviceStateInfo implements Parcelable { @ChangeFlags public int diff(@NonNull DeviceStateInfo other) { int diff = 0; - if (!Arrays.equals(supportedStates, other.supportedStates)) { + if (!supportedStates.equals(other.supportedStates)) { diff |= CHANGED_SUPPORTED_STATES; } - if (baseState != other.baseState) { + if (!baseState.equals(other.baseState)) { diff |= CHANGED_BASE_STATE; } - if (currentState != other.currentState) { + if (!currentState.equals(other.currentState)) { diff |= CHANGED_CURRENT_STATE; } return diff; @@ -126,13 +127,13 @@ public final class DeviceStateInfo implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(supportedStates.length); - for (int i = 0; i < supportedStates.length; i++) { - dest.writeInt(supportedStates[i]); + dest.writeInt(supportedStates.size()); + for (int i = 0; i < supportedStates.size(); i++) { + dest.writeTypedObject(supportedStates.get(i).getConfiguration(), flags); } - dest.writeInt(baseState); - dest.writeInt(currentState); + dest.writeTypedObject(baseState.getConfiguration(), flags); + dest.writeTypedObject(currentState.getConfiguration(), flags); } @Override @@ -140,16 +141,21 @@ public final class DeviceStateInfo implements Parcelable { return 0; } - public static final @NonNull Creator<DeviceStateInfo> CREATOR = new Creator<DeviceStateInfo>() { + public static final @NonNull Creator<DeviceStateInfo> CREATOR = new Creator<>() { @Override public DeviceStateInfo createFromParcel(Parcel source) { final int numberOfSupportedStates = source.readInt(); - final int[] supportedStates = new int[numberOfSupportedStates]; + final ArrayList<DeviceState> supportedStates = new ArrayList<>(numberOfSupportedStates); for (int i = 0; i < numberOfSupportedStates; i++) { - supportedStates[i] = source.readInt(); + DeviceState.Configuration configuration = source.readTypedObject( + DeviceState.Configuration.CREATOR); + supportedStates.add(i, new DeviceState(configuration)); } - final int baseState = source.readInt(); - final int currentState = source.readInt(); + + final DeviceState baseState = new DeviceState( + source.readTypedObject(DeviceState.Configuration.CREATOR)); + final DeviceState currentState = new DeviceState( + source.readTypedObject(DeviceState.Configuration.CREATOR)); return new DeviceStateInfo(supportedStates, baseState, currentState); } diff --git a/core/java/android/hardware/devicestate/DeviceStateManagerGlobal.java b/core/java/android/hardware/devicestate/DeviceStateManagerGlobal.java index 6db5aee106a8..d6cc00d45ec4 100644 --- a/core/java/android/hardware/devicestate/DeviceStateManagerGlobal.java +++ b/core/java/android/hardware/devicestate/DeviceStateManagerGlobal.java @@ -19,7 +19,6 @@ package android.hardware.devicestate; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; -import android.app.ActivityThread; import android.content.Context; import android.hardware.devicestate.DeviceStateManager.DeviceStateCallback; import android.os.Binder; @@ -33,13 +32,9 @@ import android.util.ArrayMap; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.ArrayUtils; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.Executor; /** @@ -55,18 +50,12 @@ public final class DeviceStateManagerGlobal { private static final String TAG = "DeviceStateManagerGlobal"; private static final boolean DEBUG = Build.IS_DEBUGGABLE; - // TODO(b/325124054): Remove when system server refactor is completed - private static int[] sFoldedDeviceStates = new int[0]; - /** * Returns an instance of {@link DeviceStateManagerGlobal}. May return {@code null} if a * connection with the device state service couldn't be established. */ @Nullable public static DeviceStateManagerGlobal getInstance() { - // TODO(b/325124054): Remove when system server refactor is completed - instantiateFoldedStateArray(); - synchronized (DeviceStateManagerGlobal.class) { if (sInstance == null) { IBinder b = ServiceManager.getService(Context.DEVICE_STATE_SERVICE); @@ -79,16 +68,6 @@ public final class DeviceStateManagerGlobal { } } - // TODO(b/325124054): Remove when system server refactor is completed - // TODO(b/325330654): Investigate if we need a Context passed in to DSMGlobal - private static void instantiateFoldedStateArray() { - Context context = ActivityThread.currentApplication(); - if (context != null) { - sFoldedDeviceStates = context.getResources().getIntArray( - com.android.internal.R.array.config_foldedDeviceStates); - } - } - private final Object mLock = new Object(); @NonNull private final IDeviceStateManager mDeviceStateManager; @@ -115,6 +94,7 @@ public final class DeviceStateManagerGlobal { * * @see DeviceStateManager#getSupportedStates() */ + // TODO(b/325124054): Remove unused methods when clients are migrated. public int[] getSupportedStates() { synchronized (mLock) { final DeviceStateInfo currentInfo; @@ -132,12 +112,12 @@ public final class DeviceStateManagerGlobal { } } - return Arrays.copyOf(currentInfo.supportedStates, currentInfo.supportedStates.length); + return getSupportedStateIdentifiersLocked(currentInfo.supportedStates); } } /** - * Returns the {@link List} of supported device states. + * Returns {@link List} of supported {@link DeviceState}s. * * @see DeviceStateManager#getSupportedDeviceStates() */ @@ -158,7 +138,7 @@ public final class DeviceStateManagerGlobal { } } - return createDeviceStateList(currentInfo.supportedStates); + return List.copyOf(currentInfo.supportedStates); } } @@ -285,13 +265,14 @@ public final class DeviceStateManagerGlobal { if (mLastReceivedInfo != null) { // Copy the array to prevent the callback from modifying the internal state. - final int[] supportedStates = Arrays.copyOf(mLastReceivedInfo.supportedStates, - mLastReceivedInfo.supportedStates.length); + final int[] supportedStates = getSupportedStateIdentifiersLocked( + mLastReceivedInfo.supportedStates); wrapper.notifySupportedStatesChanged(supportedStates); - wrapper.notifySupportedDeviceStatesChanged(createDeviceStateList(supportedStates)); - wrapper.notifyBaseStateChanged(mLastReceivedInfo.baseState); - wrapper.notifyStateChanged(mLastReceivedInfo.currentState); - wrapper.notifyDeviceStateChanged(createDeviceState(mLastReceivedInfo.currentState)); + wrapper.notifySupportedDeviceStatesChanged( + List.copyOf(mLastReceivedInfo.supportedStates)); + wrapper.notifyBaseStateChanged(mLastReceivedInfo.baseState.getIdentifier()); + wrapper.notifyStateChanged(mLastReceivedInfo.currentState.getIdentifier()); + wrapper.notifyDeviceStateChanged(mLastReceivedInfo.currentState); } } } @@ -349,6 +330,15 @@ public final class DeviceStateManagerGlobal { return -1; } + @GuardedBy("mLock") + private int[] getSupportedStateIdentifiersLocked(List<DeviceState> states) { + int[] identifiers = new int[states.size()]; + for (int i = 0; i < states.size(); i++) { + identifiers[i] = states.get(i).getIdentifier(); + } + return identifiers; + } + @Nullable private IBinder findRequestTokenLocked(@NonNull DeviceStateRequest request) { for (int i = 0; i < mRequests.size(); i++) { @@ -363,32 +353,31 @@ public final class DeviceStateManagerGlobal { private void handleDeviceStateInfoChanged(@NonNull DeviceStateInfo info) { ArrayList<DeviceStateCallbackWrapper> callbacks; DeviceStateInfo oldInfo; + int[] supportedStateIdentifiers; synchronized (mLock) { oldInfo = mLastReceivedInfo; mLastReceivedInfo = info; callbacks = new ArrayList<>(mCallbacks); + supportedStateIdentifiers = getSupportedStateIdentifiersLocked(info.supportedStates); } final int diff = oldInfo == null ? ~0 : info.diff(oldInfo); if ((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0) { for (int i = 0; i < callbacks.size(); i++) { - // Copy the array to prevent callbacks from modifying the internal state. - final int[] supportedStates = Arrays.copyOf(info.supportedStates, - info.supportedStates.length); - callbacks.get(i).notifySupportedStatesChanged(supportedStates); callbacks.get(i).notifySupportedDeviceStatesChanged( - createDeviceStateList(supportedStates)); + List.copyOf(info.supportedStates)); + callbacks.get(i).notifySupportedStatesChanged(supportedStateIdentifiers); } } if ((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0) { for (int i = 0; i < callbacks.size(); i++) { - callbacks.get(i).notifyBaseStateChanged(info.baseState); + callbacks.get(i).notifyBaseStateChanged(info.baseState.getIdentifier()); } } if ((diff & DeviceStateInfo.CHANGED_CURRENT_STATE) > 0) { for (int i = 0; i < callbacks.size(); i++) { - callbacks.get(i).notifyStateChanged(info.currentState); - callbacks.get(i).notifyDeviceStateChanged(createDeviceState(info.currentState)); + callbacks.get(i).notifyDeviceStateChanged(info.currentState); + callbacks.get(i).notifyStateChanged(info.currentState.getIdentifier()); } } } @@ -421,36 +410,6 @@ public final class DeviceStateManagerGlobal { } } - /** - * Creates a {@link DeviceState} object from a device state identifier, with the - * {@link DeviceState} property that corresponds to what display is primary. - * - */ - // TODO(b/325124054): Remove when system server refactor is completed - @NonNull - private DeviceState createDeviceState(int stateIdentifier) { - final Set<@DeviceState.DeviceStateProperties Integer> properties = new HashSet<>(); - if (ArrayUtils.contains(sFoldedDeviceStates, stateIdentifier)) { - properties.add(DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY); - } else { - properties.add(DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_INNER_PRIMARY); - } - return new DeviceState(stateIdentifier, "" /* name */, properties); - } - - /** - * Creates a list of {@link DeviceState} objects from an array of state identifiers. - */ - // TODO(b/325124054): Remove when system server refactor is completed - @NonNull - private List<DeviceState> createDeviceStateList(int[] supportedStates) { - List<DeviceState> deviceStateList = new ArrayList<>(); - for (int i = 0; i < supportedStates.length; i++) { - deviceStateList.add(createDeviceState(supportedStates[i])); - } - return deviceStateList; - } - private final class DeviceStateManagerCallback extends IDeviceStateManagerCallback.Stub { @Override public void onDeviceStateInfoChanged(DeviceStateInfo info) { diff --git a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java index dcef0a7c316d..76772b7a528b 100644 --- a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java +++ b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateInfoTest.java @@ -20,16 +20,20 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import android.os.Parcel; import androidx.test.filters.SmallTest; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import java.util.List; + /** * Unit tests for {@link DeviceStateInfo}. * <p/> @@ -38,11 +42,20 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) @SmallTest public final class DeviceStateInfoTest { + + private static final DeviceState DEVICE_STATE_0 = new DeviceState( + new DeviceState.Configuration.Builder(0, "STATE_0").build()); + private static final DeviceState DEVICE_STATE_1 = new DeviceState( + new DeviceState.Configuration.Builder(1, "STATE_1").build()); + private static final DeviceState DEVICE_STATE_2 = new DeviceState( + new DeviceState.Configuration.Builder(2, "STATE_2").build()); + @Test public void create() { - final int[] supportedStates = new int[] { 0, 1, 2 }; - final int baseState = 0; - final int currentState = 2; + final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1, + DEVICE_STATE_2); + final DeviceState baseState = DEVICE_STATE_0; + final DeviceState currentState = DEVICE_STATE_2; final DeviceStateInfo info = new DeviceStateInfo(supportedStates, baseState, currentState); assertNotNull(info.supportedStates); @@ -53,27 +66,30 @@ public final class DeviceStateInfoTest { @Test public void equals() { - final int[] supportedStates = new int[] { 0, 1, 2 }; - final int baseState = 0; - final int currentState = 2; + final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1, + DEVICE_STATE_2); + final DeviceState baseState = DEVICE_STATE_0; + final DeviceState currentState = DEVICE_STATE_2; final DeviceStateInfo info = new DeviceStateInfo(supportedStates, baseState, currentState); - assertTrue(info.equals(info)); + Assert.assertEquals(info, info); final DeviceStateInfo sameInfo = new DeviceStateInfo(supportedStates, baseState, currentState); - assertTrue(info.equals(sameInfo)); + Assert.assertEquals(info, sameInfo); - final DeviceStateInfo differentInfo = new DeviceStateInfo(new int[]{ 0, 2}, baseState, + final DeviceStateInfo differentInfo = new DeviceStateInfo( + List.of(DEVICE_STATE_0, DEVICE_STATE_2), baseState, currentState); - assertFalse(info.equals(differentInfo)); + assertNotEquals(info, differentInfo); } @Test public void diff_sameObject() { - final int[] supportedStates = new int[] { 0, 1, 2 }; - final int baseState = 0; - final int currentState = 2; + final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1, + DEVICE_STATE_2); + final DeviceState baseState = DEVICE_STATE_0; + final DeviceState currentState = DEVICE_STATE_2; final DeviceStateInfo info = new DeviceStateInfo(supportedStates, baseState, currentState); assertEquals(0, info.diff(info)); @@ -81,8 +97,10 @@ public final class DeviceStateInfoTest { @Test public void diff_differentSupportedStates() { - final DeviceStateInfo info = new DeviceStateInfo(new int[] { 1 }, 0, 0); - final DeviceStateInfo otherInfo = new DeviceStateInfo(new int[] { 2 }, 0, 0); + final DeviceStateInfo info = new DeviceStateInfo(List.of(DEVICE_STATE_1), DEVICE_STATE_0, + DEVICE_STATE_0); + final DeviceStateInfo otherInfo = new DeviceStateInfo(List.of(DEVICE_STATE_2), + DEVICE_STATE_0, DEVICE_STATE_0); final int diff = info.diff(otherInfo); assertTrue((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0); assertFalse((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0); @@ -91,8 +109,10 @@ public final class DeviceStateInfoTest { @Test public void diff_differentNonOverrideState() { - final DeviceStateInfo info = new DeviceStateInfo(new int[] { 1 }, 1, 0); - final DeviceStateInfo otherInfo = new DeviceStateInfo(new int[] { 1 }, 2, 0); + final DeviceStateInfo info = new DeviceStateInfo(List.of(DEVICE_STATE_1), DEVICE_STATE_1, + DEVICE_STATE_0); + final DeviceStateInfo otherInfo = new DeviceStateInfo(List.of(DEVICE_STATE_1), + DEVICE_STATE_2, DEVICE_STATE_0); final int diff = info.diff(otherInfo); assertFalse((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0); assertTrue((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0); @@ -101,8 +121,10 @@ public final class DeviceStateInfoTest { @Test public void diff_differentState() { - final DeviceStateInfo info = new DeviceStateInfo(new int[] { 1 }, 0, 1); - final DeviceStateInfo otherInfo = new DeviceStateInfo(new int[] { 1 }, 0, 2); + final DeviceStateInfo info = new DeviceStateInfo(List.of(DEVICE_STATE_1), DEVICE_STATE_0, + DEVICE_STATE_1); + final DeviceStateInfo otherInfo = new DeviceStateInfo(List.of(DEVICE_STATE_1), + DEVICE_STATE_0, DEVICE_STATE_2); final int diff = info.diff(otherInfo); assertFalse((diff & DeviceStateInfo.CHANGED_SUPPORTED_STATES) > 0); assertFalse((diff & DeviceStateInfo.CHANGED_BASE_STATE) > 0); @@ -111,9 +133,10 @@ public final class DeviceStateInfoTest { @Test public void writeToParcel() { - final int[] supportedStates = new int[] { 0, 1, 2 }; - final int nonOverrideState = 0; - final int state = 2; + final List<DeviceState> supportedStates = List.of(DEVICE_STATE_0, DEVICE_STATE_1, + DEVICE_STATE_2); + final DeviceState nonOverrideState = DEVICE_STATE_0; + final DeviceState state = DEVICE_STATE_2; final DeviceStateInfo originalInfo = new DeviceStateInfo(supportedStates, nonOverrideState, state); diff --git a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java index 03c38cc137ad..ee238c0a5533 100644 --- a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java +++ b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateManagerGlobalTest.java @@ -41,6 +41,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -51,8 +52,10 @@ import java.util.Set; @RunWith(JUnit4.class) @SmallTest public final class DeviceStateManagerGlobalTest { - private static final int DEFAULT_DEVICE_STATE = 0; - private static final int OTHER_DEVICE_STATE = 1; + private static final DeviceState DEFAULT_DEVICE_STATE = new DeviceState( + new DeviceState.Configuration.Builder(0 /* identifier */, "" /* name */).build()); + private static final DeviceState OTHER_DEVICE_STATE = new DeviceState( + new DeviceState.Configuration.Builder(1 /* identifier */, "" /* name */).build()); private TestDeviceStateManagerService mService; private DeviceStateManagerGlobal mDeviceStateManagerGlobal; @@ -76,41 +79,37 @@ public final class DeviceStateManagerGlobalTest { ConcurrentUtils.DIRECT_EXECUTOR); // Verify initial callbacks - verify(callback1).onSupportedStatesChanged(eq(mService.getSupportedStates())); - verify(callback1).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback1).onStateChanged(eq(mService.getMergedState())); - verify(callback2).onSupportedStatesChanged(eq(mService.getSupportedStates())); - verify(callback2).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback2).onStateChanged(eq(mService.getMergedState())); + verify(callback1).onSupportedStatesChanged(eq(mService.getSupportedDeviceStates())); + verify(callback1).onDeviceStateChanged(eq(mService.getMergedState())); + verify(callback2).onDeviceStateChanged(eq(mService.getMergedState())); reset(callback1); reset(callback2); // Change the supported states and verify callback - mService.setSupportedStates(new int[]{ DEFAULT_DEVICE_STATE }); - verify(callback1).onSupportedStatesChanged(eq(mService.getSupportedStates())); - verify(callback2).onSupportedStatesChanged(eq(mService.getSupportedStates())); - mService.setSupportedStates(new int[]{ DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE }); + mService.setSupportedStates(List.of(DEFAULT_DEVICE_STATE)); + verify(callback1).onSupportedStatesChanged(eq(mService.getSupportedDeviceStates())); + verify(callback2).onSupportedStatesChanged(eq(mService.getSupportedDeviceStates())); + mService.setSupportedStates(List.of(DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE)); reset(callback1); reset(callback2); // Change the base state and verify callback mService.setBaseState(OTHER_DEVICE_STATE); - verify(callback1).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback1).onStateChanged(eq(mService.getMergedState())); - verify(callback2).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback2).onStateChanged(eq(mService.getMergedState())); + verify(callback1).onDeviceStateChanged(eq(mService.getMergedState())); + verify(callback2).onDeviceStateChanged(eq(mService.getMergedState())); reset(callback1); reset(callback2); // Change the requested state and verify callback - DeviceStateRequest request = DeviceStateRequest.newBuilder(DEFAULT_DEVICE_STATE).build(); + DeviceStateRequest request = DeviceStateRequest.newBuilder( + DEFAULT_DEVICE_STATE.getIdentifier()).build(); mDeviceStateManagerGlobal.requestState(request, null /* executor */, null /* callback */); - verify(callback1).onStateChanged(eq(mService.getMergedState())); - verify(callback2).onStateChanged(eq(mService.getMergedState())); + verify(callback1).onDeviceStateChanged(eq(mService.getMergedState())); + verify(callback2).onDeviceStateChanged(eq(mService.getMergedState())); } @Test @@ -121,14 +120,13 @@ public final class DeviceStateManagerGlobalTest { ConcurrentUtils.DIRECT_EXECUTOR); // Verify initial callbacks - verify(callback).onSupportedStatesChanged(eq(mService.getSupportedStates())); - verify(callback).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback).onStateChanged(eq(mService.getMergedState())); + verify(callback).onSupportedStatesChanged(eq(mService.getSupportedDeviceStates())); + verify(callback).onDeviceStateChanged(eq(mService.getMergedState())); reset(callback); mDeviceStateManagerGlobal.unregisterDeviceStateCallback(callback); - mService.setSupportedStates(new int[]{OTHER_DEVICE_STATE}); + mService.setSupportedStates(List.of(OTHER_DEVICE_STATE)); mService.setBaseState(OTHER_DEVICE_STATE); verifyZeroInteractions(callback); } @@ -139,18 +137,19 @@ public final class DeviceStateManagerGlobalTest { mDeviceStateManagerGlobal.registerDeviceStateCallback(callback, ConcurrentUtils.DIRECT_EXECUTOR); - verify(callback).onStateChanged(eq(mService.getBaseState())); + verify(callback).onDeviceStateChanged(eq(mService.getBaseState())); reset(callback); - DeviceStateRequest request = DeviceStateRequest.newBuilder(OTHER_DEVICE_STATE).build(); + DeviceStateRequest request = DeviceStateRequest.newBuilder( + OTHER_DEVICE_STATE.getIdentifier()).build(); mDeviceStateManagerGlobal.requestState(request, null /* executor */, null /* callback */); - verify(callback).onStateChanged(eq(OTHER_DEVICE_STATE)); + verify(callback).onDeviceStateChanged(eq(OTHER_DEVICE_STATE)); reset(callback); mDeviceStateManagerGlobal.cancelStateRequest(); - verify(callback).onStateChanged(eq(mService.getBaseState())); + verify(callback).onDeviceStateChanged(eq(mService.getBaseState())); } @Test @@ -159,22 +158,20 @@ public final class DeviceStateManagerGlobalTest { mDeviceStateManagerGlobal.registerDeviceStateCallback(callback, ConcurrentUtils.DIRECT_EXECUTOR); - verify(callback).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback).onStateChanged(eq(mService.getBaseState())); + verify(callback).onDeviceStateChanged(eq(mService.getBaseState())); reset(callback); - DeviceStateRequest request = DeviceStateRequest.newBuilder(OTHER_DEVICE_STATE).build(); + DeviceStateRequest request = DeviceStateRequest.newBuilder( + OTHER_DEVICE_STATE.getIdentifier()).build(); mDeviceStateManagerGlobal.requestBaseStateOverride(request, null /* executor */, null /* callback */); - verify(callback).onBaseStateChanged(eq(OTHER_DEVICE_STATE)); - verify(callback).onStateChanged(eq(OTHER_DEVICE_STATE)); + verify(callback).onDeviceStateChanged(eq(OTHER_DEVICE_STATE)); reset(callback); mDeviceStateManagerGlobal.cancelBaseStateOverride(); - verify(callback).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback).onStateChanged(eq(mService.getBaseState())); + verify(callback).onDeviceStateChanged(eq(mService.getBaseState())); } @Test @@ -183,44 +180,43 @@ public final class DeviceStateManagerGlobalTest { mDeviceStateManagerGlobal.registerDeviceStateCallback(callback, ConcurrentUtils.DIRECT_EXECUTOR); - verify(callback).onBaseStateChanged(eq(mService.getBaseState())); - verify(callback).onStateChanged(eq(mService.getBaseState())); + verify(callback).onDeviceStateChanged(eq(mService.getBaseState())); reset(callback); - DeviceStateRequest request = DeviceStateRequest.newBuilder(OTHER_DEVICE_STATE).build(); + DeviceStateRequest request = DeviceStateRequest.newBuilder( + OTHER_DEVICE_STATE.getIdentifier()).build(); mDeviceStateManagerGlobal.requestBaseStateOverride(request, null /* executor */, null /* callback */); - verify(callback).onBaseStateChanged(eq(OTHER_DEVICE_STATE)); - verify(callback).onStateChanged(eq(OTHER_DEVICE_STATE)); + verify(callback).onDeviceStateChanged(eq(OTHER_DEVICE_STATE)); assertEquals(OTHER_DEVICE_STATE, mService.getBaseState()); reset(callback); DeviceStateRequest secondRequest = DeviceStateRequest.newBuilder( - DEFAULT_DEVICE_STATE).build(); + DEFAULT_DEVICE_STATE.getIdentifier()).build(); mDeviceStateManagerGlobal.requestState(secondRequest, null, null); assertEquals(OTHER_DEVICE_STATE, mService.getBaseState()); - verify(callback).onStateChanged(eq(DEFAULT_DEVICE_STATE)); + verify(callback).onDeviceStateChanged(eq(DEFAULT_DEVICE_STATE)); reset(callback); mDeviceStateManagerGlobal.cancelStateRequest(); - verify(callback).onStateChanged(OTHER_DEVICE_STATE); + verify(callback).onDeviceStateChanged(OTHER_DEVICE_STATE); reset(callback); mDeviceStateManagerGlobal.cancelBaseStateOverride(); - verify(callback).onBaseStateChanged(DEFAULT_DEVICE_STATE); - verify(callback).onStateChanged(DEFAULT_DEVICE_STATE); + verify(callback).onDeviceStateChanged(DEFAULT_DEVICE_STATE); } @Test public void verifyDeviceStateRequestCallbacksCalled() { DeviceStateRequest.Callback callback = mock(TestDeviceStateRequestCallback.class); - DeviceStateRequest request = DeviceStateRequest.newBuilder(OTHER_DEVICE_STATE).build(); + DeviceStateRequest request = DeviceStateRequest.newBuilder( + OTHER_DEVICE_STATE.getIdentifier()).build(); mDeviceStateManagerGlobal.requestState(request, ConcurrentUtils.DIRECT_EXECUTOR /* executor */, callback /* callback */); @@ -257,12 +253,14 @@ public final class DeviceStateManagerGlobalTest { } } - private int[] mSupportedStates = new int[] { DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE }; - private int mBaseState = DEFAULT_DEVICE_STATE; + private List<DeviceState> mSupportedDeviceStates = List.of(DEFAULT_DEVICE_STATE, + OTHER_DEVICE_STATE); + + private DeviceState mBaseState = DEFAULT_DEVICE_STATE; private Request mRequest; private Request mBaseStateRequest; - private Set<IDeviceStateManagerCallback> mCallbacks = new HashSet<>(); + private final Set<IDeviceStateManagerCallback> mCallbacks = new HashSet<>(); TestDeviceStateManagerService(FakePermissionEnforcer enforcer) { super(enforcer); @@ -270,10 +268,15 @@ public final class DeviceStateManagerGlobalTest { private DeviceStateInfo getInfo() { final int mergedBaseState = mBaseStateRequest == null - ? mBaseState : mBaseStateRequest.state; + ? mBaseState.getIdentifier() : mBaseStateRequest.state; final int mergedState = mRequest == null ? mergedBaseState : mRequest.state; - return new DeviceStateInfo(mSupportedStates, mergedBaseState, mergedState); + + final DeviceState baseState = new DeviceState( + new DeviceState.Configuration.Builder(mergedBaseState, "" /* name */).build()); + final DeviceState state = new DeviceState( + new DeviceState.Configuration.Builder(mergedState, "" /* name */).build()); + return new DeviceStateInfo(mSupportedDeviceStates, baseState, state); } private void notifyDeviceStateInfoChanged() { @@ -392,25 +395,25 @@ public final class DeviceStateManagerGlobalTest { onStateRequestOverlayDismissed_enforcePermission(); } - public void setSupportedStates(int[] states) { - mSupportedStates = states; + public void setSupportedStates(List<DeviceState> states) { + mSupportedDeviceStates = states; notifyDeviceStateInfoChanged(); } - public int[] getSupportedStates() { - return mSupportedStates; + public List<DeviceState> getSupportedDeviceStates() { + return mSupportedDeviceStates; } - public void setBaseState(int state) { + public void setBaseState(DeviceState state) { mBaseState = state; notifyDeviceStateInfoChanged(); } - public int getBaseState() { + public DeviceState getBaseState() { return getInfo().baseState; } - public int getMergedState() { + public DeviceState getMergedState() { return getInfo().currentState; } } diff --git a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateTest.java b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateTest.java index c2877217a529..68de21f76dc8 100644 --- a/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateTest.java +++ b/core/tests/devicestatetests/src/android/hardware/devicestate/DeviceStateTest.java @@ -16,19 +16,27 @@ package android.hardware.devicestate; -import static android.hardware.devicestate.DeviceStateManager.MAXIMUM_DEVICE_STATE_IDENTIFIER; +import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED; +import static android.hardware.devicestate.DeviceState.PROPERTY_POLICY_AVAILABLE_FOR_APP_REQUEST; +import static android.hardware.devicestate.DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS; import static android.hardware.devicestate.DeviceStateManager.MINIMUM_DEVICE_STATE_IDENTIFIER; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertThrows; +import static org.testng.Assert.assertTrue; +import android.os.Parcel; import android.platform.test.annotations.Presubmit; +import junit.framework.Assert; + import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + /** * Unit tests for {@link android.hardware.devicestate.DeviceState}. * <p/> @@ -39,33 +47,50 @@ import org.junit.runners.JUnit4; public final class DeviceStateTest { @Test public void testConstruct() { - final DeviceState state = new DeviceState(MINIMUM_DEVICE_STATE_IDENTIFIER /* identifier */, - "TEST_CLOSED" /* name */, DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS /* flags */); + DeviceState.Configuration config = new DeviceState.Configuration.Builder( + MINIMUM_DEVICE_STATE_IDENTIFIER, "TEST_CLOSED") + .setSystemProperties( + new HashSet<>(List.of(PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS))) + .build(); + final DeviceState state = new DeviceState(config); assertEquals(state.getIdentifier(), MINIMUM_DEVICE_STATE_IDENTIFIER); assertEquals(state.getName(), "TEST_CLOSED"); - assertEquals(state.getFlags(), DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS); + assertTrue(state.hasProperty(PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS)); } @Test - public void testConstruct_nullName() { - final DeviceState state = new DeviceState(MAXIMUM_DEVICE_STATE_IDENTIFIER /* identifier */, - null /* name */, 0/* flags */); - assertEquals(state.getIdentifier(), MAXIMUM_DEVICE_STATE_IDENTIFIER); - assertNull(state.getName()); - assertEquals(state.getFlags(), 0); - } + public void testHasProperties() { + DeviceState.Configuration config = new DeviceState.Configuration.Builder( + MINIMUM_DEVICE_STATE_IDENTIFIER, "TEST") + .setSystemProperties(new HashSet<>(List.of(PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS, + PROPERTY_POLICY_AVAILABLE_FOR_APP_REQUEST))) + .build(); - @Test - public void testConstruct_tooLargeIdentifier() { - assertThrows(IllegalArgumentException.class, - () -> new DeviceState(MAXIMUM_DEVICE_STATE_IDENTIFIER + 1 /* identifier */, - null /* name */, 0 /* flags */)); + final DeviceState state = new DeviceState(config); + + assertTrue(state.hasProperty(PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS)); + assertTrue(state.hasProperty(PROPERTY_POLICY_AVAILABLE_FOR_APP_REQUEST)); + assertTrue(state.hasProperties(PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS, + PROPERTY_POLICY_AVAILABLE_FOR_APP_REQUEST)); } @Test - public void testConstruct_tooSmallIdentifier() { - assertThrows(IllegalArgumentException.class, - () -> new DeviceState(MINIMUM_DEVICE_STATE_IDENTIFIER - 1 /* identifier */, - null /* name */, 0 /* flags */)); + public void writeToParcel() { + final DeviceState originalState = new DeviceState( + new DeviceState.Configuration.Builder(0, "TEST_STATE") + .setSystemProperties(Set.of(PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS, + PROPERTY_POLICY_AVAILABLE_FOR_APP_REQUEST)) + .setPhysicalProperties( + Set.of(PROPERTY_FOLDABLE_HARDWARE_CONFIGURATION_FOLD_IN_CLOSED)) + .build()); + + final Parcel parcel = Parcel.obtain(); + originalState.getConfiguration().writeToParcel(parcel, 0 /* flags */); + parcel.setDataPosition(0); + + final DeviceState.Configuration stateConfiguration = + DeviceState.Configuration.CREATOR.createFromParcel(parcel); + + Assert.assertEquals(originalState, new DeviceState(stateConfiguration)); } } diff --git a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java index af6bdea86ba1..1ee28c40043d 100644 --- a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java +++ b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java @@ -21,7 +21,6 @@ import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREG import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.hardware.devicestate.DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS; import static android.hardware.devicestate.DeviceState.PROPERTY_POLICY_CANCEL_WHEN_REQUESTER_NOT_ON_TOP; -import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE; import static android.hardware.devicestate.DeviceStateManager.MAXIMUM_DEVICE_STATE_IDENTIFIER; import static android.hardware.devicestate.DeviceStateManager.MINIMUM_DEVICE_STATE_IDENTIFIER; @@ -76,6 +75,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -110,6 +110,12 @@ public final class DeviceStateManagerService extends SystemService { private static final String TAG = "DeviceStateManagerService"; private static final boolean DEBUG = false; + /** {@link DeviceState} to model an invalid device state */ + // TODO(b/328314031): Investigate how we can remove this constant + private static final DeviceState INVALID_DEVICE_STATE = new DeviceState( + new DeviceState.Configuration.Builder(DeviceStateManager.INVALID_DEVICE_STATE, + "INVALID").build()); + private final Object mLock = new Object(); // Handler on the {@link DisplayThread} used to dispatch calls to the policy and to registered // callbacks though its handler (mHandler). Provides a guarantee of callback order when @@ -355,14 +361,20 @@ public final class DeviceStateManagerService extends SystemService { } /** Returns the list of currently supported device states. */ - DeviceState[] getSupportedStates() { + List<DeviceState> getSupportedStates() { synchronized (mLock) { - DeviceState[] supportedStates = new DeviceState[mDeviceStates.size()]; - for (int i = 0; i < supportedStates.length; i++) { - supportedStates[i] = mDeviceStates.valueAt(i); - } - return supportedStates; + return getSupportedStatesLocked(); + } + } + + /** Returns the list of currently supported device states */ + @GuardedBy("mLock") + private List<DeviceState> getSupportedStatesLocked() { + List<DeviceState> supportedStates = new ArrayList<>(mDeviceStates.size()); + for (int i = 0; i < mDeviceStates.size(); i++) { + supportedStates.add(i, mDeviceStates.valueAt(i)); } + return supportedStates; } /** Returns the list of currently supported device state identifiers. */ @@ -376,20 +388,46 @@ public final class DeviceStateManagerService extends SystemService { /** * Returns the current {@link DeviceStateInfo} of the device. If there has been no base state - * or committed state provided, {@link DeviceStateManager#INVALID_DEVICE_STATE} will be returned + * or committed state provided, {@link #INVALID_DEVICE_STATE} will be returned * respectively. The supported states will always be included. * */ @GuardedBy("mLock") @NonNull private DeviceStateInfo getDeviceStateInfoLocked() { - final int[] supportedStates = getSupportedStateIdentifiersLocked(); - final int baseState = - mBaseState.isPresent() ? mBaseState.get().getIdentifier() : INVALID_DEVICE_STATE; - final int currentState = mCommittedState.isPresent() ? mCommittedState.get().getIdentifier() - : INVALID_DEVICE_STATE; + final List<DeviceState> supportedStates = getSupportedStatesLocked(); + final DeviceState baseState = mBaseState.orElse(null); + final DeviceState currentState = mCommittedState.orElse(null); + + return new DeviceStateInfo(supportedStates, + baseState != null ? baseState : INVALID_DEVICE_STATE, + createMergedDeviceState(currentState, baseState)); + } + + /** + * Returns a {@link DeviceState} with the combined properties of the current system state, as + * well as the physical property that corresponds to the base state (physical hardware state) of + * the device. + */ + private DeviceState createMergedDeviceState(@Nullable DeviceState committedState, + @Nullable DeviceState baseState) { + if (committedState == null) { + return INVALID_DEVICE_STATE; + } + + Set<@DeviceState.DeviceStateProperties Integer> systemProperties = + committedState.getConfiguration().getSystemProperties(); + + Set<@DeviceState.DeviceStateProperties Integer> physicalProperties = + baseState != null ? baseState.getConfiguration().getPhysicalProperties() + : Collections.emptySet(); - return new DeviceStateInfo(supportedStates, baseState, currentState); + DeviceState.Configuration deviceStateConfiguration = new DeviceState.Configuration.Builder( + committedState.getIdentifier(), committedState.getName()) + .setSystemProperties(systemProperties) + .setPhysicalProperties(physicalProperties) + .build(); + return new DeviceState(deviceStateConfiguration); } @VisibleForTesting @@ -437,7 +475,7 @@ public final class DeviceStateManagerService extends SystemService { private void setRearDisplayStateLocked() { int rearDisplayIdentifier = getContext().getResources().getInteger( R.integer.config_deviceStateRearDisplay); - if (rearDisplayIdentifier != INVALID_DEVICE_STATE) { + if (rearDisplayIdentifier != INVALID_DEVICE_STATE.getIdentifier()) { mRearDisplayState = mDeviceStates.get(rearDisplayIdentifier); } } diff --git a/services/core/java/com/android/server/devicestate/DeviceStateManagerShellCommand.java b/services/core/java/com/android/server/devicestate/DeviceStateManagerShellCommand.java index 02c9bb3b9deb..97913de32076 100644 --- a/services/core/java/com/android/server/devicestate/DeviceStateManagerShellCommand.java +++ b/services/core/java/com/android/server/devicestate/DeviceStateManagerShellCommand.java @@ -25,7 +25,7 @@ import android.os.Binder; import android.os.ShellCommand; import java.io.PrintWriter; -import java.util.Arrays; +import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -177,17 +177,18 @@ public class DeviceStateManagerShellCommand extends ShellCommand { } private int runPrintStates(PrintWriter pw) { - DeviceState[] states = mService.getSupportedStates(); + List<DeviceState> states = mService.getSupportedStates(); pw.print("Supported states: [\n"); - for (int i = 0; i < states.length; i++) { - pw.print(" " + states[i] + ",\n"); + for (int i = 0; i < states.size(); i++) { + pw.print(" " + states.get(i) + ",\n"); } pw.println("]"); return 0; } private int runPrintStatesSimple(PrintWriter pw) { - pw.print(Arrays.stream(mService.getSupportedStates()) + pw.print(mService.getSupportedStates() + .stream() .map(DeviceState::getIdentifier) .map(Object::toString) .collect(Collectors.joining(","))); 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 9130adca34b4..7f4540785c48 100644 --- a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java @@ -48,8 +48,6 @@ import com.android.compatibility.common.util.PollingCheck; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowProcessController; -import junit.framework.Assert; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -87,9 +85,9 @@ public final class DeviceStateManagerServiceTest { new DeviceState.Configuration.Builder(255, "UNSUPPORTED") .build()); - private static final int[] SUPPORTED_DEVICE_STATE_IDENTIFIERS = - new int[]{DEFAULT_DEVICE_STATE.getIdentifier(), OTHER_DEVICE_STATE.getIdentifier(), - DEVICE_STATE_CANCEL_WHEN_REQUESTER_NOT_ON_TOP.getIdentifier()}; + private static final List<DeviceState> SUPPORTED_DEVICE_STATES = Arrays.asList( + DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE, + DEVICE_STATE_CANCEL_WHEN_REQUESTER_NOT_ON_TOP); private static final int FAKE_PROCESS_ID = 100; @@ -229,7 +227,7 @@ public final class DeviceStateManagerServiceTest { assertEquals(mSysPropSetter.getValue(), DEFAULT_DEVICE_STATE.getIdentifier() + ":" + DEFAULT_DEVICE_STATE.getName()); assertEquals(mService.getBaseState(), Optional.of(DEFAULT_DEVICE_STATE)); - assertThat(mService.getSupportedStates()).asList().containsExactly(DEFAULT_DEVICE_STATE, + assertThat(mService.getSupportedStates()).containsExactly(DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE, DEVICE_STATE_CANCEL_WHEN_REQUESTER_NOT_ON_TOP); mProvider.notifySupportedDeviceStates(new DeviceState[]{DEFAULT_DEVICE_STATE}); @@ -242,10 +240,9 @@ public final class DeviceStateManagerServiceTest { assertEquals(mSysPropSetter.getValue(), DEFAULT_DEVICE_STATE.getIdentifier() + ":" + DEFAULT_DEVICE_STATE.getName()); assertEquals(mService.getBaseState(), Optional.of(DEFAULT_DEVICE_STATE)); - assertThat(mService.getSupportedStates()).asList().containsExactly(DEFAULT_DEVICE_STATE); + assertThat(mService.getSupportedStates()).containsExactly(DEFAULT_DEVICE_STATE); - assertArrayEquals(callback.getLastNotifiedInfo().supportedStates, - new int[]{DEFAULT_DEVICE_STATE.getIdentifier()}); + assertEquals(callback.getLastNotifiedInfo().supportedStates, List.of(DEFAULT_DEVICE_STATE)); } @Test @@ -262,7 +259,7 @@ public final class DeviceStateManagerServiceTest { assertEquals(mSysPropSetter.getValue(), DEFAULT_DEVICE_STATE.getIdentifier() + ":" + DEFAULT_DEVICE_STATE.getName()); assertEquals(mService.getBaseState(), Optional.of(DEFAULT_DEVICE_STATE)); - assertThat(mService.getSupportedStates()).asList().containsExactly(DEFAULT_DEVICE_STATE, + assertThat(mService.getSupportedStates()).containsExactly(DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE, DEVICE_STATE_CANCEL_WHEN_REQUESTER_NOT_ON_TOP); mProvider.notifySupportedDeviceStates(new DeviceState[]{DEFAULT_DEVICE_STATE, @@ -276,7 +273,7 @@ public final class DeviceStateManagerServiceTest { assertEquals(mSysPropSetter.getValue(), DEFAULT_DEVICE_STATE.getIdentifier() + ":" + DEFAULT_DEVICE_STATE.getName()); assertEquals(mService.getBaseState(), Optional.of(DEFAULT_DEVICE_STATE)); - assertThat(mService.getSupportedStates()).asList().containsExactly(DEFAULT_DEVICE_STATE, + assertThat(mService.getSupportedStates()).containsExactly(DEFAULT_DEVICE_STATE, OTHER_DEVICE_STATE, DEVICE_STATE_CANCEL_WHEN_REQUESTER_NOT_ON_TOP); // The callback wasn't notified about a change in supported states as the states have not @@ -288,9 +285,9 @@ public final class DeviceStateManagerServiceTest { public void getDeviceStateInfo() throws RemoteException { DeviceStateInfo info = mService.getBinderService().getDeviceStateInfo(); assertNotNull(info); - assertArrayEquals(info.supportedStates, SUPPORTED_DEVICE_STATE_IDENTIFIERS); - assertEquals(info.baseState, DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(info.currentState, DEFAULT_DEVICE_STATE.getIdentifier()); + assertEquals(info.supportedStates, SUPPORTED_DEVICE_STATES); + assertEquals(info.baseState, DEFAULT_DEVICE_STATE); + assertEquals(info.currentState, DEFAULT_DEVICE_STATE); } @FlakyTest(bugId = 297949293) @@ -304,9 +301,9 @@ public final class DeviceStateManagerServiceTest { DeviceStateInfo info = mService.getBinderService().getDeviceStateInfo(); - assertArrayEquals(info.supportedStates, SUPPORTED_DEVICE_STATE_IDENTIFIERS); - assertEquals(info.baseState, INVALID_DEVICE_STATE); - assertEquals(info.currentState, INVALID_DEVICE_STATE); + assertEquals(info.supportedStates, SUPPORTED_DEVICE_STATES); + assertEquals(info.baseState.getIdentifier(), INVALID_DEVICE_STATE); + assertEquals(info.currentState.getIdentifier(), INVALID_DEVICE_STATE); } @Test @@ -315,33 +312,33 @@ public final class DeviceStateManagerServiceTest { mService.getBinderService().registerCallback(callback); mProvider.setState(OTHER_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState.getIdentifier() == OTHER_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState.getIdentifier() == OTHER_DEVICE_STATE.getIdentifier()); mProvider.setState(DEFAULT_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState.getIdentifier() == DEFAULT_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState.getIdentifier() == DEFAULT_DEVICE_STATE.getIdentifier()); mPolicy.blockConfigure(); mProvider.setState(OTHER_DEVICE_STATE.getIdentifier()); // The callback should not have been notified of the state change as the policy is still // pending callback. - waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState.getIdentifier() == DEFAULT_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState.getIdentifier() == DEFAULT_DEVICE_STATE.getIdentifier()); mPolicy.resumeConfigure(); // Now that the policy is finished processing the callback should be notified of the state // change. - waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState.getIdentifier() == OTHER_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState.getIdentifier() == OTHER_DEVICE_STATE.getIdentifier()); } @@ -351,10 +348,8 @@ public final class DeviceStateManagerServiceTest { mService.getBinderService().registerCallback(callback); flushHandler(); assertNotNull(callback.getLastNotifiedInfo()); - assertEquals(callback.getLastNotifiedInfo().baseState, - DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - DEFAULT_DEVICE_STATE.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().baseState, DEFAULT_DEVICE_STATE); + assertEquals(callback.getLastNotifiedInfo().currentState, DEFAULT_DEVICE_STATE); } @Test @@ -397,10 +392,8 @@ public final class DeviceStateManagerServiceTest { OTHER_DEVICE_STATE.getIdentifier()); assertNotNull(callback.getLastNotifiedInfo()); - assertEquals(callback.getLastNotifiedInfo().baseState, - DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - OTHER_DEVICE_STATE.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().baseState, DEFAULT_DEVICE_STATE); + assertEquals(callback.getLastNotifiedInfo().currentState, OTHER_DEVICE_STATE); mService.getBinderService().cancelStateRequest(); @@ -415,10 +408,8 @@ public final class DeviceStateManagerServiceTest { assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().baseState, - DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - DEFAULT_DEVICE_STATE.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().baseState, DEFAULT_DEVICE_STATE); + assertEquals(callback.getLastNotifiedInfo().currentState, DEFAULT_DEVICE_STATE); } @FlakyTest(bugId = 200332057) @@ -718,10 +709,8 @@ public final class DeviceStateManagerServiceTest { OTHER_DEVICE_STATE.getIdentifier()); assertNotNull(callback.getLastNotifiedInfo()); - assertEquals(callback.getLastNotifiedInfo().baseState, - OTHER_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - OTHER_DEVICE_STATE.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().baseState, OTHER_DEVICE_STATE); + assertEquals(callback.getLastNotifiedInfo().currentState, OTHER_DEVICE_STATE); mService.getBinderService().cancelBaseStateOverride(); @@ -737,10 +726,9 @@ public final class DeviceStateManagerServiceTest { assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState.getIdentifier() == DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - DEFAULT_DEVICE_STATE.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().currentState, DEFAULT_DEVICE_STATE); } @Test @@ -774,10 +762,8 @@ public final class DeviceStateManagerServiceTest { OTHER_DEVICE_STATE.getIdentifier()); assertNotNull(callback.getLastNotifiedInfo()); - assertEquals(callback.getLastNotifiedInfo().baseState, - OTHER_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - OTHER_DEVICE_STATE.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().baseState, OTHER_DEVICE_STATE); + assertEquals(callback.getLastNotifiedInfo().currentState, OTHER_DEVICE_STATE); mProvider.setState(testDeviceState.getIdentifier()); @@ -793,10 +779,9 @@ public final class DeviceStateManagerServiceTest { assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), testDeviceState.getIdentifier()); - waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState.getIdentifier() == testDeviceState.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - testDeviceState.getIdentifier()); + assertEquals(callback.getLastNotifiedInfo().currentState, testDeviceState); } @Test @@ -833,10 +818,6 @@ public final class DeviceStateManagerServiceTest { }); } - private static void assertArrayEquals(int[] expected, int[] actual) { - Assert.assertTrue(Arrays.equals(expected, actual)); - } - /** * Common code to verify the handling of FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP flag. * |