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

Commit 731db2fd authored by Andrii Kulian's avatar Andrii Kulian Committed by Automerger Merge Worker
Browse files

Merge "Add a dedicated method to check task windowing mode" into tm-qpr-dev am: 945dbc04

parents effe589f 945dbc04
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -226,6 +226,18 @@ public class ActivityClient {
        }
    }

    /**
     * Returns the windowing mode of the task that hosts the activity, or {@code -1} if task is not
     * found.
     */
    public int getTaskWindowingMode(IBinder activityToken) {
        try {
            return getActivityClientController().getTaskWindowingMode(activityToken);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Returns the non-finishing activity token below in the same task if it belongs to the same
     * process.
+1 −0
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ interface IActivityClientController {
    boolean willActivityBeVisible(in IBinder token);
    int getDisplayId(in IBinder activityToken);
    int getTaskForActivity(in IBinder token, in boolean onlyRoot);
    int getTaskWindowingMode(in IBinder activityToken);
    IBinder getActivityTokenBelow(IBinder token);
    ComponentName getCallingActivity(in IBinder token);
    String getCallingPackage(in IBinder token);
+34 −44
Original line number Diff line number Diff line
@@ -25,8 +25,7 @@ import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;

import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.AppTask;
import android.app.ActivityClient;
import android.app.Application;
import android.app.WindowConfiguration;
import android.content.Context;
@@ -34,7 +33,6 @@ import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
import android.util.ArrayMap;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.window.common.CommonFoldingFeature;
@@ -179,15 +177,11 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent {
    private List<DisplayFeature> getDisplayFeatures(
            @NonNull Activity activity, List<CommonFoldingFeature> storedFeatures) {
        List<DisplayFeature> features = new ArrayList<>();
        int displayId = activity.getDisplay().getDisplayId();
        if (displayId != DEFAULT_DISPLAY) {
            Log.w(TAG, "This sample doesn't support display features on secondary displays");
            return features;
        } else if (isTaskInMultiWindowMode(activity)) {
            // 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.
        if (!shouldReportDisplayFeatures(activity)) {
            return features;
        } else {
        }

        int displayId = activity.getDisplay().getDisplayId();
        for (CommonFoldingFeature baseFeature : storedFeatures) {
            Integer state = convertToExtensionState(baseFeature.getState());
            if (state == null) {
@@ -198,38 +192,34 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent {
            transformToWindowSpaceRect(activity, featureRect);

            if (!isRectZero(featureRect)) {
                    // TODO(b/228641877) Remove guarding if when fixed.
                // TODO(b/228641877): Remove guarding when fixed.
                features.add(new FoldingFeature(featureRect, baseFeature.getType(), state));
            }
        }
        return features;
    }
    }

    /**
     * Checks whether the task associated with the activity is in multi-window. If task info is not
     * available it defaults to {@code true}.
     * Checks whether display features should be reported for the activity.
     * TODO(b/238948678): Support reporting display features in all windowing modes.
     */
    private boolean isTaskInMultiWindowMode(@NonNull Activity activity) {
        final ActivityManager am = activity.getSystemService(ActivityManager.class);
        if (am == null) {
            return true;
        }

        final List<AppTask> appTasks = am.getAppTasks();
        final int taskId = activity.getTaskId();
        AppTask task = null;
        for (AppTask t : appTasks) {
            if (t.getTaskInfo().taskId == taskId) {
                task = t;
                break;
            }
    private boolean shouldReportDisplayFeatures(@NonNull Activity activity) {
        int displayId = activity.getDisplay().getDisplayId();
        if (displayId != DEFAULT_DISPLAY) {
            // Display features are not supported on secondary displays.
            return false;
        }
        if (task == null) {
            // The task might be removed on the server already.
            return true;
        final int taskWindowingMode = ActivityClient.getInstance().getTaskWindowingMode(
                activity.getActivityToken());
        if (taskWindowingMode == -1) {
            // If we cannot determine the task windowing mode for any reason, it is likely that we
            // won't be able to determine its position correctly as well. DisplayFeatures' bounds
            // in this case can't be computed correctly, so we should skip.
            return false;
        }
        return WindowConfiguration.inMultiWindowMode(task.getTaskInfo().getWindowingMode());
        // 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 !WindowConfiguration.inMultiWindowMode(taskWindowingMode);
    }

    /**
+15 −0
Original line number Diff line number Diff line
@@ -577,6 +577,21 @@ class ActivityClientController extends IActivityClientController.Stub {
        }
    }

    /**
     * Returns the windowing mode of the task that hosts the activity, or {@code -1} if task is not
     * found.
     */
    @Override
    public int getTaskWindowingMode(IBinder activityToken) {
        synchronized (mGlobalLock) {
            final ActivityRecord ar = ActivityRecord.isInAnyTask(activityToken);
            if (ar == null) {
                return -1;
            }
            return ar.getTask().getWindowingMode();
        }
    }

    @Override
    @Nullable
    public IBinder getActivityTokenBelow(IBinder activityToken) {