Merge "Ignore folding feature when it is not on the active display." into sc-v2-dev
This commit is contained in:
@@ -18,9 +18,12 @@ package androidx.window.extensions.layout;
|
|||||||
|
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
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.rotateRectToDisplayRotation;
|
||||||
import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;
|
import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;
|
||||||
|
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
@@ -119,22 +122,45 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent {
|
|||||||
return !mWindowLayoutChangeListeners.isEmpty();
|
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();
|
Integer featureState = feature.getState();
|
||||||
Optional<Integer> posture = mDevicePostureProducer.getData();
|
Optional<Integer> posture = mDevicePostureProducer.getData();
|
||||||
int fallbackPosture = posture.orElse(DisplayFeature.COMMON_STATE_FLAT);
|
Integer state = featureState == null ? posture.orElse(null) : featureState;
|
||||||
int displayFeatureState = featureState == null ? fallbackPosture : featureState;
|
return convertToExtensionState(state);
|
||||||
return convertToExtensionState(displayFeatureState);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int convertToExtensionState(int state) {
|
/**
|
||||||
switch (state) {
|
* A convenience method to translate from the common feature state to the extensions feature
|
||||||
case DisplayFeature.COMMON_STATE_FLAT:
|
* 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;
|
return FoldingFeature.STATE_FLAT;
|
||||||
case DisplayFeature.COMMON_STATE_HALF_OPENED:
|
} else if (state == COMMON_STATE_HALF_OPENED) {
|
||||||
return FoldingFeature.STATE_HALF_OPENED;
|
return FoldingFeature.STATE_HALF_OPENED;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return FoldingFeature.STATE_FLAT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onDisplayFeaturesChanged() {
|
private void onDisplayFeaturesChanged() {
|
||||||
@@ -151,6 +177,25 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent {
|
|||||||
return new WindowLayoutInfo(displayFeatures);
|
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(
|
private List<androidx.window.extensions.layout.DisplayFeature> getDisplayFeatures(
|
||||||
@NonNull Activity activity) {
|
@NonNull Activity activity) {
|
||||||
List<androidx.window.extensions.layout.DisplayFeature> features = new ArrayList<>();
|
List<androidx.window.extensions.layout.DisplayFeature> features = new ArrayList<>();
|
||||||
@@ -170,6 +215,10 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent {
|
|||||||
if (storedFeatures.isPresent()) {
|
if (storedFeatures.isPresent()) {
|
||||||
|
|
||||||
for (DisplayFeature baseFeature : storedFeatures.get()) {
|
for (DisplayFeature baseFeature : storedFeatures.get()) {
|
||||||
|
Integer state = getFeatureState(baseFeature);
|
||||||
|
if (state == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Rect featureRect = baseFeature.getRect();
|
Rect featureRect = baseFeature.getRect();
|
||||||
rotateRectToDisplayRotation(displayId, featureRect);
|
rotateRectToDisplayRotation(displayId, featureRect);
|
||||||
transformToWindowSpaceRect(activity, featureRect);
|
transformToWindowSpaceRect(activity, featureRect);
|
||||||
|
|||||||
Reference in New Issue
Block a user