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

Commit d3237afb authored by Bryce Lee's avatar Bryce Lee
Browse files

TouchHandler for hiding dream overlay complications.

This changelist introduces HideComplicationTouchHandler, which is
responsible for monitoring touches on the dream overlay and determining
when complications should be hidden. When a touch ends, the
DreamTouchHandler also handles restoring complication visibility.

Test: atest HideComplicationTouchHandler
Fixes: 214292772
Change-Id: Ib80ed9d6c351503ef5f9910b9870c4a5672b96d2
parent 6c6f6bd6
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -701,4 +701,10 @@

    <!-- How long in milliseconds before full burn-in protection is achieved. -->
    <integer name="config_dreamOverlayMillisUntilFullJitter">240000</integer>

    <integer name="complicationFadeOutMs">500</integer>

    <integer name="complicationFadeInMs">500</integer>

    <integer name="complicationRestoreMs">1000</integer>
</resources>
+13 −0
Original line number Diff line number Diff line
@@ -185,6 +185,19 @@ public interface Complication {
        void requestExitDream();
    }

    /**
     * The implementation of this interface is in charge of managing the visible state of
     * the shown complication.
     */
    interface VisibilityController {
        /**
         * Called to set the visibility of all shown and future complications.
         * @param visibility The desired future visibility.
         * @param animate whether the change should be animated.
         */
        void setVisibility(@View.Visibility int visibility, boolean animate);
    }

    /**
     * Returned through {@link Complication#createView(ComplicationViewModel)}, {@link ViewHolder}
     * is a container for a single {@link Complication} instance. The {@link Host} guarantees that
+41 −2
Original line number Diff line number Diff line
@@ -16,17 +16,23 @@

package com.android.systemui.dreams.complication;

import static com.android.systemui.dreams.complication.dagger.ComplicationHostViewModule.COMPLICATIONS_FADE_IN_DURATION;
import static com.android.systemui.dreams.complication.dagger.ComplicationHostViewModule.COMPLICATIONS_FADE_OUT_DURATION;
import static com.android.systemui.dreams.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN;
import static com.android.systemui.dreams.complication.dagger.ComplicationHostViewModule.SCOPED_COMPLICATIONS_LAYOUT;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;

import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Constraints;

import com.android.systemui.R;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
import com.android.systemui.touch.TouchInsetManager;

import java.util.ArrayList;
@@ -43,7 +49,8 @@ import javax.inject.Named;
 * their layout parameters and attributes. The management of this set is done by
 * {@link ComplicationHostViewController}.
 */
public class ComplicationLayoutEngine  {
@DreamOverlayComponent.DreamOverlayScope
public class ComplicationLayoutEngine implements Complication.VisibilityController {
    public static final String TAG = "ComplicationLayoutEngine";

    /**
@@ -454,15 +461,45 @@ public class ComplicationLayoutEngine {
    private final HashMap<ComplicationId, ViewEntry> mEntries = new HashMap<>();
    private final HashMap<Integer, PositionGroup> mPositions = new HashMap<>();
    private final TouchInsetManager.TouchInsetSession mSession;
    private final int mFadeInDuration;
    private final int mFadeOutDuration;
    private ViewPropertyAnimator mViewPropertyAnimator;

    /** */
    @Inject
    public ComplicationLayoutEngine(@Named(SCOPED_COMPLICATIONS_LAYOUT) ConstraintLayout layout,
            @Named(COMPLICATION_MARGIN) int margin,
            TouchInsetManager.TouchInsetSession session) {
            TouchInsetManager.TouchInsetSession session,
            @Named(COMPLICATIONS_FADE_IN_DURATION) int fadeInDuration,
            @Named(COMPLICATIONS_FADE_OUT_DURATION) int fadeOutDuration) {
        mLayout = layout;
        mMargin = margin;
        mSession = session;
        mFadeInDuration = fadeInDuration;
        mFadeOutDuration = fadeOutDuration;
    }

    @Override
    public void setVisibility(int visibility, boolean animate) {
        final boolean appearing = visibility == View.VISIBLE;

        if (mViewPropertyAnimator != null) {
            mViewPropertyAnimator.cancel();
        }

        if (appearing) {
            mLayout.setVisibility(View.VISIBLE);
        }

        mViewPropertyAnimator = mLayout.animate()
                .alpha(appearing ? 1f : 0f)
                .setDuration(appearing ? mFadeInDuration : mFadeOutDuration)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mLayout.setVisibility(visibility);
                    }
                });
    }

    /**
@@ -477,6 +514,8 @@ public class ComplicationLayoutEngine {
     */
    public void addComplication(ComplicationId id, View view,
            ComplicationLayoutParams lp, @Complication.Category int category) {
        Log.d(TAG, "engine: " + this + " addComplication");

        // If the complication is present, remove.
        if (mEntries.containsKey(id)) {
            removeComplication(id);
+33 −0
Original line number Diff line number Diff line
@@ -38,6 +38,9 @@ import dagger.Provides;
public abstract class ComplicationHostViewModule {
    public static final String SCOPED_COMPLICATIONS_LAYOUT = "scoped_complications_layout";
    public static final String COMPLICATION_MARGIN = "complication_margin";
    public static final String COMPLICATIONS_FADE_OUT_DURATION = "complications_fade_out_duration";
    public static final String COMPLICATIONS_FADE_IN_DURATION = "complications_fade_in_duration";
    public static final String COMPLICATIONS_RESTORE_TIMEOUT = "complication_restore_timeout";

    /**
     * Generates a {@link ConstraintLayout}, which can host
@@ -60,4 +63,34 @@ public abstract class ComplicationHostViewModule {
    static int providesComplicationPadding(@Main Resources resources) {
        return resources.getDimensionPixelSize(R.dimen.dream_overlay_complication_margin);
    }

    /**
     * Provides the fade out duration for complications.
     */
    @Provides
    @Named(COMPLICATIONS_FADE_OUT_DURATION)
    @DreamOverlayComponent.DreamOverlayScope
    static int providesComplicationsFadeOutDuration(@Main Resources resources) {
        return resources.getInteger(R.integer.complicationFadeOutMs);
    }

    /**
     * Provides the fade in duration for complications.
     */
    @Provides
    @Named(COMPLICATIONS_FADE_IN_DURATION)
    @DreamOverlayComponent.DreamOverlayScope
    static int providesComplicationsFadeInDuration(@Main Resources resources) {
        return resources.getInteger(R.integer.complicationFadeInMs);
    }

    /**
     * Provides the timeout for restoring complication visibility.
     */
    @Provides
    @Named(COMPLICATIONS_RESTORE_TIMEOUT)
    @DreamOverlayComponent.DreamOverlayScope
    static int providesComplicationsRestoreTimeout(@Main Resources resources) {
        return resources.getInteger(R.integer.complicationRestoreMs);
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -21,7 +21,9 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStore;

import com.android.systemui.dreams.complication.Complication;
import com.android.systemui.dreams.complication.ComplicationCollectionViewModel;
import com.android.systemui.dreams.complication.ComplicationLayoutEngine;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
@@ -62,4 +64,13 @@ public interface ComplicationModule {

        return provider.get(ComplicationCollectionViewModel.class);
    }

    /**
     * Provides the visibility controller for display complications.
     */
    @Provides
    static Complication.VisibilityController providesVisibilityController(
            ComplicationLayoutEngine engine) {
        return engine;
    }
}
Loading