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

Commit 14c735d9 authored by Andrii Kulian's avatar Andrii Kulian Committed by Android (Google) Code Review
Browse files

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

parents 11ae41ad ce4afed0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -749,7 +749,8 @@ public class Instrumentation {
         * @see #onStartActivity(Intent)
         * @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);
        }

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

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
 * vendor library, and the vendor implementation must match the signature of this class.
@@ -31,6 +35,12 @@ public class ExtensionProvider {
        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.
     * @return API version string in MAJOR.MINOR.PATCH-description format.
+0 −32
Original line number Diff line number Diff line
@@ -23,19 +23,15 @@ import static androidx.window.util.ExtensionHelper.transformToWindowSpaceRect;

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

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

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

    private final SplitController mSplitController;

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

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

        mSplitController = new SplitController();
    }

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

        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 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 Diff line number Diff line
@@ -19,7 +19,9 @@ package androidx.window.extensions.organizer;
import android.annotation.NonNull;
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.
@@ -27,20 +29,26 @@ import androidx.window.extensions.ExtensionSplitPairRule;
class SplitContainer {
    private final TaskFragmentContainer mPrimaryContainer;
    private final TaskFragmentContainer mSecondaryContainer;
    private final ExtensionSplitPairRule mSplitPairRule;
    private final SplitRule mSplitRule;

    SplitContainer(@NonNull TaskFragmentContainer primaryContainer,
            @NonNull Activity primaryActivity,
            @NonNull TaskFragmentContainer secondaryContainer,
            @NonNull ExtensionSplitPairRule splitPairRule) {
            @NonNull SplitRule splitRule) {
        mPrimaryContainer = primaryContainer;
        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);
        }
        if (mSplitPairRule.finishSecondaryWithPrimary || mSplitPairRule.useAsPlaceholder) {
        if (shouldFinishSecondaryWithPrimary || isPlaceholderContainer) {
            mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer);
        }
    }
@@ -56,7 +64,11 @@ class SplitContainer {
    }

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

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