Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56b0f7d7 authored by Diego Vela's avatar Diego Vela Committed by Android (Google) Code Review
Browse files

Merge "Extract Sidecar adapter functions." into main

parents e1d8091d 9451184d
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package androidx.window.common;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
@@ -26,30 +28,30 @@ import android.os.Bundle;
 */
public class EmptyLifecycleCallbacksAdapter implements Application.ActivityLifecycleCallbacks {
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
    }

    @Override
    public void onActivityStarted(Activity activity) {
    public void onActivityStarted(@NonNull Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
    public void onActivityResumed(@NonNull Activity activity) {
    }

    @Override
    public void onActivityPaused(Activity activity) {
    public void onActivityPaused(@NonNull Activity activity) {
    }

    @Override
    public void onActivityStopped(Activity activity) {
    public void onActivityStopped(@NonNull Activity activity) {
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
    public void onActivityDestroyed(@NonNull Activity activity) {
    }
}
+6 −63
Original line number Diff line number Diff line
@@ -16,16 +16,10 @@

package androidx.window.sidecar;

import static android.view.Display.DEFAULT_DISPLAY;

import static androidx.window.util.ExtensionHelper.rotateRectToDisplayRotation;
import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;

import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityThread;
import android.app.Application;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.devicestate.DeviceStateManager;
import android.os.Bundle;
import android.os.IBinder;
@@ -38,7 +32,6 @@ import androidx.window.common.RawFoldingFeatureProducer;
import androidx.window.util.BaseDataProducer;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
@@ -76,64 +69,13 @@ class SampleSidecarImpl extends StubSidecar {
    @NonNull
    @Override
    public SidecarDeviceState getDeviceState() {
        SidecarDeviceState deviceState = new SidecarDeviceState();
        deviceState.posture = deviceStateFromFeature();
        return deviceState;
    }

    private int deviceStateFromFeature() {
        for (int i = 0; i < mStoredFeatures.size(); i++) {
            CommonFoldingFeature feature = mStoredFeatures.get(i);
            final int state = feature.getState();
            switch (state) {
                case CommonFoldingFeature.COMMON_STATE_FLAT:
                    return SidecarDeviceState.POSTURE_OPENED;
                case CommonFoldingFeature.COMMON_STATE_HALF_OPENED:
                    return SidecarDeviceState.POSTURE_HALF_OPENED;
                case CommonFoldingFeature.COMMON_STATE_UNKNOWN:
                    return SidecarDeviceState.POSTURE_UNKNOWN;
            }
        }
        return SidecarDeviceState.POSTURE_UNKNOWN;
        return SidecarHelper.calculateDeviceState(mStoredFeatures);
    }

    @NonNull
    @Override
    public SidecarWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
        Activity activity = ActivityThread.currentActivityThread().getActivity(windowToken);
        SidecarWindowLayoutInfo windowLayoutInfo = new SidecarWindowLayoutInfo();
        if (activity == null) {
            return windowLayoutInfo;
        }
        windowLayoutInfo.displayFeatures = getDisplayFeatures(activity);
        return windowLayoutInfo;
    }

    private List<SidecarDisplayFeature> getDisplayFeatures(@NonNull Activity activity) {
        int displayId = activity.getDisplay().getDisplayId();
        if (displayId != DEFAULT_DISPLAY) {
            return Collections.emptyList();
        }

        if (activity.isInMultiWindowMode()) {
            // It is recommended not to report any display features in multi-window mode, since it
            // won't be possible to synchronize the display feature positions with window movement.
            return Collections.emptyList();
        }

        List<SidecarDisplayFeature> features = new ArrayList<>();
        final int rotation = activity.getResources().getConfiguration().windowConfiguration
                .getDisplayRotation();
        for (CommonFoldingFeature baseFeature : mStoredFeatures) {
            SidecarDisplayFeature feature = new SidecarDisplayFeature();
            Rect featureRect = baseFeature.getRect();
            rotateRectToDisplayRotation(displayId, rotation, featureRect);
            transformToWindowSpaceRect(activity, featureRect);
            feature.setRect(featureRect);
            feature.setType(baseFeature.getType());
            features.add(feature);
        }
        return Collections.unmodifiableList(features);
        return SidecarHelper.calculateWindowLayoutInfo(windowToken, mStoredFeatures);
    }

    @Override
@@ -145,13 +87,14 @@ class SampleSidecarImpl extends StubSidecar {

    private final class NotifyOnConfigurationChanged extends EmptyLifecycleCallbacksAdapter {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        public void onActivityCreated(@NonNull Activity activity,
                @Nullable Bundle savedInstanceState) {
            super.onActivityCreated(activity, savedInstanceState);
            onDisplayFeaturesChangedForActivity(activity);
        }

        @Override
        public void onActivityConfigurationChanged(Activity activity) {
        public void onActivityConfigurationChanged(@NonNull Activity activity) {
            super.onActivityConfigurationChanged(activity);
            onDisplayFeaturesChangedForActivity(activity);
        }
+129 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package androidx.window.sidecar;

import static android.view.Display.DEFAULT_DISPLAY;

import static androidx.window.util.ExtensionHelper.rotateRectToDisplayRotation;
import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;

import android.annotation.NonNull;
import android.app.Activity;
import android.app.ActivityThread;
import android.graphics.Rect;
import android.os.IBinder;

import androidx.window.common.CommonFoldingFeature;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * A utility class for transforming between Sidecar and Extensions features.
 */
class SidecarHelper {

    private SidecarHelper() {}

    /**
     * Returns the {@link SidecarDeviceState} posture that is calculated for the first fold in
     * the feature list. Sidecar devices only have one fold so we only pick the first one to
     * determine the state.
     * @param featureList the {@link CommonFoldingFeature} that are currently active.
     * @return the {@link SidecarDeviceState} calculated from the {@link List} of
     * {@link CommonFoldingFeature}.
     */
    @SuppressWarnings("deprecation")
    private static int deviceStateFromFeatureList(@NonNull List<CommonFoldingFeature> featureList) {
        for (int i = 0; i < featureList.size(); i++) {
            final CommonFoldingFeature feature = featureList.get(i);
            final int state = feature.getState();
            switch (state) {
                case CommonFoldingFeature.COMMON_STATE_FLAT:
                    return SidecarDeviceState.POSTURE_OPENED;
                case CommonFoldingFeature.COMMON_STATE_HALF_OPENED:
                    return SidecarDeviceState.POSTURE_HALF_OPENED;
                case CommonFoldingFeature.COMMON_STATE_UNKNOWN:
                    return SidecarDeviceState.POSTURE_UNKNOWN;
                case CommonFoldingFeature.COMMON_STATE_NO_FOLDING_FEATURES:
                    return SidecarDeviceState.POSTURE_UNKNOWN;
                case CommonFoldingFeature.COMMON_STATE_USE_BASE_STATE:
                    return SidecarDeviceState.POSTURE_UNKNOWN;
            }
        }
        return SidecarDeviceState.POSTURE_UNKNOWN;
    }

    /**
     * Returns a {@link SidecarDeviceState} calculated from a {@link List} of
     * {@link CommonFoldingFeature}s.
     */
    @SuppressWarnings("deprecation")
    static SidecarDeviceState calculateDeviceState(
            @NonNull List<CommonFoldingFeature> featureList) {
        final SidecarDeviceState deviceState = new SidecarDeviceState();
        deviceState.posture = deviceStateFromFeatureList(featureList);
        return deviceState;
    }

    @SuppressWarnings("deprecation")
    private static List<SidecarDisplayFeature> calculateDisplayFeatures(
            @NonNull Activity activity,
            @NonNull List<CommonFoldingFeature> featureList
    ) {
        final int displayId = activity.getDisplay().getDisplayId();
        if (displayId != DEFAULT_DISPLAY) {
            return Collections.emptyList();
        }

        if (activity.isInMultiWindowMode()) {
            // It is recommended not to report any display features in multi-window mode, since it
            // won't be possible to synchronize the display feature positions with window movement.
            return Collections.emptyList();
        }

        final List<SidecarDisplayFeature> features = new ArrayList<>();
        final int rotation = activity.getResources().getConfiguration().windowConfiguration
                .getDisplayRotation();
        for (CommonFoldingFeature baseFeature : featureList) {
            final SidecarDisplayFeature feature = new SidecarDisplayFeature();
            final Rect featureRect = baseFeature.getRect();
            rotateRectToDisplayRotation(displayId, rotation, featureRect);
            transformToWindowSpaceRect(activity, featureRect);
            feature.setRect(featureRect);
            feature.setType(baseFeature.getType());
            features.add(feature);
        }
        return Collections.unmodifiableList(features);
    }

    /**
     * Returns a {@link SidecarWindowLayoutInfo} calculated from the {@link List} of
     * {@link CommonFoldingFeature}.
     */
    @SuppressWarnings("deprecation")
    static SidecarWindowLayoutInfo calculateWindowLayoutInfo(@NonNull IBinder windowToken,
            @NonNull List<CommonFoldingFeature> featureList) {
        final Activity activity = ActivityThread.currentActivityThread().getActivity(windowToken);
        final SidecarWindowLayoutInfo windowLayoutInfo = new SidecarWindowLayoutInfo();
        if (activity == null) {
            return windowLayoutInfo;
        }
        windowLayoutInfo.displayFeatures = calculateDisplayFeatures(activity, featureList);
        return windowLayoutInfo;
    }
}