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

Commit ce4afed0 authored by Andrii Kulian's avatar Andrii Kulian
Browse files

Update split controller to latest extension interface

Bug: 190433398
Bug: 190433972
Test: Manual
Change-Id: I215bd5925f35c2a798b7f82ac8753d86cf9b594c
parent dfb851d7
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