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

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

Merge "Update split controller to latest extension interface" into sc-v2-dev...

Merge "Update split controller to latest extension interface" into sc-v2-dev am: 14c735d9 am: c24031f3

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15369313

Change-Id: If8ef5603b42f1ab7fbc6b8042217aac6cb6d3955
parents f9338c95 c24031f3
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -749,7 +749,8 @@ public class Instrumentation {
         * @see #onStartActivity(Intent)
         * @see #onStartActivity(Intent)
         * @hide
         * @hide
         */
         */
        public ActivityResult onStartActivity(Context who, Intent intent, Bundle options) {
        public ActivityResult onStartActivity(@NonNull Context who, @NonNull Intent intent,
                @NonNull Bundle options) {
            return onStartActivity(intent);
            return onStartActivity(intent);
        }
        }


+10 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,10 @@ package androidx.window.extensions;


import android.content.Context;
import android.content.Context;


import androidx.annotation.NonNull;
import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
import androidx.window.extensions.organizer.EmbeddingExtensionImpl;

/**
/**
 * Provider class that will instantiate the library implementation. It must be included in the
 * Provider class that will instantiate the library implementation. It must be included in the
 * vendor library, and the vendor implementation must match the signature of this class.
 * vendor library, and the vendor implementation must match the signature of this class.
@@ -31,6 +35,12 @@ public class ExtensionProvider {
        return new SampleExtensionImpl(context);
        return new SampleExtensionImpl(context);
    }
    }


    /** Provides a reference implementation of {@link ActivityEmbeddingComponent}. */
    public static ActivityEmbeddingComponent getActivityEmbeddingExtensionImpl(
            @NonNull Context context) {
        return new EmbeddingExtensionImpl();
    }

    /**
    /**
     * The support library will use this method to check API version compatibility.
     * The support library will use this method to check API version compatibility.
     * @return API version string in MAJOR.MINOR.PATCH-description format.
     * @return API version string in MAJOR.MINOR.PATCH-description format.
+0 −32
Original line number Original line Diff line number Diff line
@@ -23,19 +23,15 @@ import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;


import android.app.Activity;
import android.app.Activity;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.util.Log;


import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.window.common.DeviceStateManagerPostureProducer;
import androidx.window.common.DeviceStateManagerPostureProducer;
import androidx.window.common.DisplayFeature;
import androidx.window.common.DisplayFeature;
import androidx.window.common.ResourceConfigDisplayFeatureProducer;
import androidx.window.common.ResourceConfigDisplayFeatureProducer;
import androidx.window.common.SettingsDevicePostureProducer;
import androidx.window.common.SettingsDevicePostureProducer;
import androidx.window.common.SettingsDisplayFeatureProducer;
import androidx.window.common.SettingsDisplayFeatureProducer;
import androidx.window.extensions.organizer.SplitController;
import androidx.window.util.DataProducer;
import androidx.window.util.DataProducer;
import androidx.window.util.PriorityDataProducer;
import androidx.window.util.PriorityDataProducer;


@@ -60,8 +56,6 @@ class SampleExtensionImpl extends StubExtension {
    private final SettingsDisplayFeatureProducer mSettingsDisplayFeatureProducer;
    private final SettingsDisplayFeatureProducer mSettingsDisplayFeatureProducer;
    private final DataProducer<List<DisplayFeature>> mDisplayFeatureProducer;
    private final DataProducer<List<DisplayFeature>> mDisplayFeatureProducer;


    private final SplitController mSplitController;

    SampleExtensionImpl(Context context) {
    SampleExtensionImpl(Context context) {
        mSettingsDevicePostureProducer = new SettingsDevicePostureProducer(context);
        mSettingsDevicePostureProducer = new SettingsDevicePostureProducer(context);
        mDevicePostureProducer = new PriorityDataProducer<>(List.of(
        mDevicePostureProducer = new PriorityDataProducer<>(List.of(
@@ -77,8 +71,6 @@ class SampleExtensionImpl extends StubExtension {


        mDevicePostureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);
        mDevicePostureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);
        mDisplayFeatureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);
        mDisplayFeatureProducer.addDataChangedCallback(this::onDisplayFeaturesChanged);

        mSplitController = new SplitController();
    }
    }


    private int getFeatureState(DisplayFeature feature) {
    private int getFeatureState(DisplayFeature feature) {
@@ -142,28 +134,4 @@ class SampleExtensionImpl extends StubExtension {


        onDisplayFeaturesChanged();
        onDisplayFeaturesChanged();
    }
    }

    @Override
    public void setSplitRules(@NonNull List<ExtensionSplitRule> splitRules) {
        mSplitController.setSplitRules(splitRules);
    }

    @Override
    @NonNull
    public List<ExtensionSplitRule> getSplitRules() {
        return new ArrayList<>(mSplitController.getSplitRules());
    }

    @Override
    public void setSplitOrganizerCallback(@Nullable SplitOrganizerCallback callback) {
        mSplitController.setSplitOrganizerCallback(callback);
    }

    @Override
    public void startActivityToSide(@NonNull Activity launchingActivity, @NonNull Intent intent,
            @Nullable Bundle options, @NonNull ExtensionSplitPairRule splitPairRule,
            int startRequestId) {
        mSplitController.startActivityToSide(launchingActivity, intent, options, splitPairRule,
                startRequestId);
    }
}
}
+48 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2021 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.extensions.organizer;

import androidx.annotation.NonNull;
import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
import androidx.window.extensions.embedding.EmbeddingRule;
import androidx.window.extensions.embedding.SplitInfo;

import java.util.List;
import java.util.Set;
import java.util.function.Consumer;

/**
 * Reference implementation of the activity embedding interface defined in WM Jetpack.
 */
public class EmbeddingExtensionImpl implements ActivityEmbeddingComponent {

    private final SplitController mSplitController;

    public EmbeddingExtensionImpl() {
        mSplitController = new SplitController();
    }

    @Override
    public void setEmbeddingRules(@NonNull Set<EmbeddingRule> rules) {
        mSplitController.setEmbeddingRules(rules);
    }

    @Override
    public void setEmbeddingCallback(@NonNull Consumer<List<SplitInfo>> consumer) {
        mSplitController.setEmbeddingCallback(consumer);
    }
}
+20 −8
Original line number Original line Diff line number Diff line
@@ -19,7 +19,9 @@ package androidx.window.extensions.organizer;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.app.Activity;
import android.app.Activity;


import androidx.window.extensions.ExtensionSplitPairRule;
import androidx.window.extensions.embedding.SplitPairRule;
import androidx.window.extensions.embedding.SplitPlaceholderRule;
import androidx.window.extensions.embedding.SplitRule;


/**
/**
 * Client-side descriptor of a split that holds two containers.
 * Client-side descriptor of a split that holds two containers.
@@ -27,20 +29,26 @@ import androidx.window.extensions.ExtensionSplitPairRule;
class SplitContainer {
class SplitContainer {
    private final TaskFragmentContainer mPrimaryContainer;
    private final TaskFragmentContainer mPrimaryContainer;
    private final TaskFragmentContainer mSecondaryContainer;
    private final TaskFragmentContainer mSecondaryContainer;
    private final ExtensionSplitPairRule mSplitPairRule;
    private final SplitRule mSplitRule;


    SplitContainer(@NonNull TaskFragmentContainer primaryContainer,
    SplitContainer(@NonNull TaskFragmentContainer primaryContainer,
            @NonNull Activity primaryActivity,
            @NonNull Activity primaryActivity,
            @NonNull TaskFragmentContainer secondaryContainer,
            @NonNull TaskFragmentContainer secondaryContainer,
            @NonNull ExtensionSplitPairRule splitPairRule) {
            @NonNull SplitRule splitRule) {
        mPrimaryContainer = primaryContainer;
        mPrimaryContainer = primaryContainer;
        mSecondaryContainer = secondaryContainer;
        mSecondaryContainer = secondaryContainer;
        mSplitPairRule = splitPairRule;
        mSplitRule = splitRule;


        if (mSplitPairRule.finishPrimaryWithSecondary || mSplitPairRule.useAsPlaceholder) {
        final boolean isPlaceholderContainer = isPlaceholderContainer();
        final boolean shouldFinishPrimaryWithSecondary = (mSplitRule instanceof SplitPairRule)
                && ((SplitPairRule) mSplitRule).shouldFinishPrimaryWithSecondary();
        final boolean shouldFinishSecondaryWithPrimary = (mSplitRule instanceof SplitPairRule)
                && ((SplitPairRule) mSplitRule).shouldFinishSecondaryWithPrimary();

        if (shouldFinishPrimaryWithSecondary || isPlaceholderContainer) {
            mSecondaryContainer.addActivityToFinishOnExit(primaryActivity);
            mSecondaryContainer.addActivityToFinishOnExit(primaryActivity);
        }
        }
        if (mSplitPairRule.finishSecondaryWithPrimary || mSplitPairRule.useAsPlaceholder) {
        if (shouldFinishSecondaryWithPrimary || isPlaceholderContainer) {
            mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer);
            mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer);
        }
        }
    }
    }
@@ -56,7 +64,11 @@ class SplitContainer {
    }
    }


    @NonNull
    @NonNull
    ExtensionSplitPairRule getSplitPairRule() {
    SplitRule getSplitRule() {
        return mSplitPairRule;
        return mSplitRule;
    }

    boolean isPlaceholderContainer() {
        return (mSplitRule instanceof SplitPlaceholderRule);
    }
    }
}
}
Loading