diff options
| -rw-r--r-- | libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java | 71 |
1 files changed, 60 insertions, 11 deletions
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java index 32d447ef1586..fe9ce971d4d9 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java @@ -18,9 +18,12 @@ package androidx.window.extensions.layout; import static android.view.Display.DEFAULT_DISPLAY; +import static androidx.window.common.DisplayFeature.COMMON_STATE_FLAT; +import static androidx.window.common.DisplayFeature.COMMON_STATE_HALF_OPENED; import static androidx.window.util.ExtensionHelper.rotateRectToDisplayRotation; import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect; +import android.annotation.Nullable; import android.app.Activity; import android.content.Context; import android.graphics.Rect; @@ -119,22 +122,45 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent { return !mWindowLayoutChangeListeners.isEmpty(); } - private int getFeatureState(DisplayFeature feature) { + /** + * Calculate the {@link DisplayFeature.State} from the feature or the device posture producer. + * If the given {@link DisplayFeature.State} is not valid then {@code null} will be returned. + * The {@link FoldingFeature} should be ignored in the case of an invalid + * {@link DisplayFeature.State}. + * + * @param feature a {@link DisplayFeature} to provide the feature state if present. + * @return {@link DisplayFeature.State} of the hinge if present or the state from the posture + * produce if present. + */ + @Nullable + private Integer getFeatureState(DisplayFeature feature) { Integer featureState = feature.getState(); Optional<Integer> posture = mDevicePostureProducer.getData(); - int fallbackPosture = posture.orElse(DisplayFeature.COMMON_STATE_FLAT); - int displayFeatureState = featureState == null ? fallbackPosture : featureState; - return convertToExtensionState(displayFeatureState); + Integer state = featureState == null ? posture.orElse(null) : featureState; + return convertToExtensionState(state); } - private int convertToExtensionState(int state) { - switch (state) { - case DisplayFeature.COMMON_STATE_FLAT: - return FoldingFeature.STATE_FLAT; - case DisplayFeature.COMMON_STATE_HALF_OPENED: - return FoldingFeature.STATE_HALF_OPENED; + /** + * A convenience method to translate from the common feature state to the extensions feature + * state. More specifically, translates from {@link DisplayFeature.State} to + * {@link FoldingFeature.STATE_FLAT} or {@link FoldingFeature.STATE_HALF_OPENED}. If it is not + * possible to translate, then we will return a {@code null} value. + * + * @param state if it matches a value in {@link DisplayFeature.State}, {@code null} otherwise. + * @return a {@link FoldingFeature.STATE_FLAT} or {@link FoldingFeature.STATE_HALF_OPENED} if + * the given state matches a value in {@link DisplayFeature.State} and {@code null} otherwise. + */ + @Nullable + private Integer convertToExtensionState(@Nullable Integer state) { + if (state == null) { // The null check avoids a NullPointerException. + return null; + } else if (state == COMMON_STATE_FLAT) { + return FoldingFeature.STATE_FLAT; + } else if (state == COMMON_STATE_HALF_OPENED) { + return FoldingFeature.STATE_HALF_OPENED; + } else { + return null; } - return FoldingFeature.STATE_FLAT; } private void onDisplayFeaturesChanged() { @@ -151,6 +177,25 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent { return new WindowLayoutInfo(displayFeatures); } + /** + * Translate from the {@link DisplayFeature} to + * {@link androidx.window.extensions.layout.DisplayFeature} for a given {@link Activity}. If a + * {@link DisplayFeature} is not valid then it will be omitted. + * + * For a {@link FoldingFeature} the bounds are localized into the {@link Activity} window + * coordinate space and the state is calculated either from {@link DisplayFeature#getState()} or + * {@link #mDisplayFeatureProducer}. The state from {@link #mDisplayFeatureProducer} may not be + * valid since {@link #mDisplayFeatureProducer} is a general state controller. If the state is + * not valid, the {@link FoldingFeature} is omitted from the {@link List} of + * {@link androidx.window.extensions.layout.DisplayFeature}. If the bounds are not valid, + * constructing a {@link FoldingFeature} will throw an {@link IllegalArgumentException} since + * this can cause negative UI effects down stream. + * + * @param activity a proxy for the {@link android.view.Window} that contains the + * {@link androidx.window.extensions.layout.DisplayFeature}. + * @return a {@link List} of valid {@link androidx.window.extensions.layout.DisplayFeature} that + * are within the {@link android.view.Window} of the {@link Activity} + */ private List<androidx.window.extensions.layout.DisplayFeature> getDisplayFeatures( @NonNull Activity activity) { List<androidx.window.extensions.layout.DisplayFeature> features = new ArrayList<>(); @@ -170,6 +215,10 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent { if (storedFeatures.isPresent()) { for (DisplayFeature baseFeature : storedFeatures.get()) { + Integer state = getFeatureState(baseFeature); + if (state == null) { + continue; + } Rect featureRect = baseFeature.getRect(); rotateRectToDisplayRotation(displayId, featureRect); transformToWindowSpaceRect(activity, featureRect); |