Search in sources :

Example 1 with DEPTH

use of com.android.launcher3.statehandlers.DepthController.DEPTH in project android_packages_apps_Launcher3 by crdroidandroid.

the class QuickstepTransitionManager method getBackgroundAnimator.

private ObjectAnimator getBackgroundAnimator(RemoteAnimationTargetCompat[] appTargets) {
    // When launching an app from overview that doesn't map to a task, we still want to just
    // blur the wallpaper instead of the launcher surface as well
    boolean allowBlurringLauncher = mLauncher.getStateManager().getState() != OVERVIEW;
    DepthController depthController = mLauncher.getDepthController();
    ObjectAnimator backgroundRadiusAnim = ObjectAnimator.ofFloat(depthController, DEPTH, BACKGROUND_APP.getDepth(mLauncher)).setDuration(APP_LAUNCH_DURATION);
    if (allowBlurringLauncher) {
        final SurfaceControl dimLayer;
        if (BlurUtils.supportsBlursOnWindows()) {
            // Create a temporary effect layer, that lives on top of launcher, so we can apply
            // the blur to it. The EffectLayer will be fullscreen, which will help with caching
            // optimizations on the SurfaceFlinger side:
            // - Results would be able to be cached as a texture
            // - There won't be texture allocation overhead, because EffectLayers don't have
            // buffers
            ViewRootImpl viewRootImpl = mLauncher.getDragLayer().getViewRootImpl();
            SurfaceControl parent = viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null;
            dimLayer = new SurfaceControl.Builder().setName("Blur layer").setParent(parent).setOpaque(false).setHidden(false).setEffectLayer().build();
        } else {
            dimLayer = null;
        }
        depthController.setSurface(dimLayer);
        backgroundRadiusAnim.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationStart(Animator animation) {
                depthController.setIsInLaunchTransition(true);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                depthController.setIsInLaunchTransition(false);
                depthController.setSurface(null);
                if (dimLayer != null) {
                    new SurfaceControl.Transaction().remove(dimLayer).apply();
                }
            }
        });
    }
    return backgroundRadiusAnim;
}
Also used : ViewRootImpl(android.view.ViewRootImpl) ValueAnimator(android.animation.ValueAnimator) Animator(android.animation.Animator) ObjectAnimator(android.animation.ObjectAnimator) ObjectAnimator(android.animation.ObjectAnimator) SurfaceControl(android.view.SurfaceControl) AnimatorListenerAdapter(android.animation.AnimatorListenerAdapter) DepthController(com.android.launcher3.statehandlers.DepthController)

Example 2 with DEPTH

use of com.android.launcher3.statehandlers.DepthController.DEPTH in project android_packages_apps_Launcher3 by crdroidandroid.

the class GridCustomizationsProvider method parseAllGridOptions.

private List<GridOption> parseAllGridOptions() {
    List<GridOption> result = new ArrayList<>();
    try (XmlResourceParser parser = getContext().getResources().getXml(R.xml.device_profiles)) {
        final int depth = parser.getDepth();
        int type;
        while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
            if ((type == XmlPullParser.START_TAG) && GridOption.TAG_NAME.equals(parser.getName())) {
                result.add(new GridOption(getContext(), Xml.asAttributeSet(parser)));
            }
        }
    } catch (IOException | XmlPullParserException e) {
        Log.e(TAG, "Error parsing device profile", e);
        return Collections.emptyList();
    }
    return result;
}
Also used : XmlResourceParser(android.content.res.XmlResourceParser) ArrayList(java.util.ArrayList) GridOption(com.android.launcher3.InvariantDeviceProfile.GridOption) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) IOException(java.io.IOException)

Example 3 with DEPTH

use of com.android.launcher3.statehandlers.DepthController.DEPTH in project android_packages_apps_Launcher3 by crdroidandroid.

the class RecentsView method createTaskLaunchAnimation.

public PendingAnimation createTaskLaunchAnimation(TaskView tv, long duration, Interpolator interpolator) {
    if (FeatureFlags.IS_STUDIO_BUILD && mPendingAnimation != null) {
        throw new IllegalStateException("Another pending animation is still running");
    }
    int count = getTaskViewCount();
    if (count == 0) {
        return new PendingAnimation(duration);
    }
    // When swiping down from overview to tasks, ensures the snapped page's scroll maintain
    // invariant between quick switch and overview, to ensure a smooth animation transition.
    updateGridProperties();
    updateScrollSynchronously();
    int targetSysUiFlags = tv.getThumbnail().getSysUiStatusNavFlags();
    final boolean[] passedOverviewThreshold = new boolean[] { false };
    ValueAnimator progressAnim = ValueAnimator.ofFloat(0, 1);
    progressAnim.addUpdateListener(animator -> {
        // tasks' flags
        if (animator.getAnimatedFraction() > UPDATE_SYSUI_FLAGS_THRESHOLD) {
            mActivity.getSystemUiController().updateUiState(UI_STATE_FULLSCREEN_TASK, targetSysUiFlags);
        } else {
            mActivity.getSystemUiController().updateUiState(UI_STATE_FULLSCREEN_TASK, 0);
        }
        // Passing the threshold from taskview to fullscreen app will vibrate
        final boolean passed = animator.getAnimatedFraction() >= SUCCESS_TRANSITION_PROGRESS;
        if (passed != passedOverviewThreshold[0]) {
            passedOverviewThreshold[0] = passed;
            performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
        }
    });
    AnimatorSet anim = createAdjacentPageAnimForTaskLaunch(tv);
    DepthController depthController = getDepthController();
    if (depthController != null) {
        ObjectAnimator depthAnimator = ObjectAnimator.ofFloat(depthController, DEPTH, BACKGROUND_APP.getDepth(mActivity));
        anim.play(depthAnimator);
    }
    anim.play(progressAnim);
    anim.setInterpolator(interpolator);
    mPendingAnimation = new PendingAnimation(duration);
    mPendingAnimation.add(anim);
    if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
        mLiveTileTaskViewSimulator.addOverviewToAppAnim(mPendingAnimation, interpolator);
        mPendingAnimation.addOnFrameCallback(this::redrawLiveTile);
    }
    mPendingAnimation.addEndListener(isSuccess -> {
        if (isSuccess) {
            if (ENABLE_QUICKSTEP_LIVE_TILE.get() && tv.isRunningTask()) {
                finishRecentsAnimation(false, /* toRecents */
                null);
                onTaskLaunchAnimationEnd(true);
            } else {
                tv.launchTask(this::onTaskLaunchAnimationEnd);
            }
            Task task = tv.getTask();
            if (task != null) {
                mActivity.getStatsLogManager().logger().withItemInfo(tv.getItemInfo()).log(LAUNCHER_TASK_LAUNCH_SWIPE_DOWN);
            }
        } else {
            onTaskLaunchAnimationEnd(false);
        }
        mPendingAnimation = null;
    });
    return mPendingAnimation;
}
Also used : PendingAnimation(com.android.launcher3.anim.PendingAnimation) Task(com.android.systemui.shared.recents.model.Task) ObjectAnimator(android.animation.ObjectAnimator) AnimatorSet(android.animation.AnimatorSet) ValueAnimator(android.animation.ValueAnimator) DepthController(com.android.launcher3.statehandlers.DepthController) TextPaint(android.text.TextPaint) Point(android.graphics.Point)

Example 4 with DEPTH

use of com.android.launcher3.statehandlers.DepthController.DEPTH in project android_packages_apps_Launcher3 by crdroidandroid.

the class TaskViewUtils method createRecentsWindowAnimator.

/**
 * Creates an animation that controls the window of the opening targets for the recents launch
 * animation.
 */
public static void createRecentsWindowAnimator(TaskView v, boolean skipViewChanges, RemoteAnimationTargetCompat[] appTargets, RemoteAnimationTargetCompat[] wallpaperTargets, RemoteAnimationTargetCompat[] nonAppTargets, DepthController depthController, PendingAnimation out, @Nullable TransformParams params, @Nullable TaskViewSimulator tsv) {
    boolean isQuickSwitch = v.isEndQuickswitchCuj();
    v.setEndQuickswitchCuj(false);
    boolean inLiveTileMode = ENABLE_QUICKSTEP_LIVE_TILE.get() && v.getRecentsView().getRunningTaskIndex() != -1;
    final RemoteAnimationTargets targets = new RemoteAnimationTargets(appTargets, wallpaperTargets, nonAppTargets, inLiveTileMode ? MODE_CLOSING : MODE_OPENING);
    final RemoteAnimationTargetCompat navBarTarget = targets.getNavBarRemoteAnimationTarget();
    if (params == null) {
        SurfaceTransactionApplier applier = new SurfaceTransactionApplier(v);
        targets.addReleaseCheck(applier);
        params = new TransformParams().setSyncTransactionApplier(applier).setTargetSet(targets);
    }
    final RecentsView recentsView = v.getRecentsView();
    int taskIndex = recentsView.indexOfChild(v);
    Context context = v.getContext();
    DeviceProfile dp = BaseActivity.fromContext(context).getDeviceProfile();
    boolean showAsGrid = dp.isTablet && FeatureFlags.ENABLE_OVERVIEW_GRID.get();
    boolean parallaxCenterAndAdjacentTask = taskIndex != recentsView.getCurrentPage() && !showAsGrid;
    float gridTranslationSecondary = recentsView.getGridTranslationSecondary(taskIndex);
    int startScroll = recentsView.getScrollOffset(taskIndex);
    TaskViewSimulator topMostSimulator = null;
    if (tsv == null && targets.apps.length > 0) {
        tsv = new TaskViewSimulator(context, recentsView.getSizeStrategy());
        tsv.setDp(dp);
        // RecentsView never updates the display rotation until swipe-up so the value may
        // be stale. Use the display value instead.
        int displayRotation = DisplayController.INSTANCE.get(context).getInfo().rotation;
        tsv.getOrientationState().update(displayRotation, displayRotation);
        tsv.setPreview(targets.apps[targets.apps.length - 1]);
        tsv.fullScreenProgress.value = 0;
        tsv.recentsViewScale.value = 1;
        if (showAsGrid) {
            tsv.taskSecondaryTranslation.value = gridTranslationSecondary;
        }
        tsv.setScroll(startScroll);
        // Fade in the task during the initial 20% of the animation
        out.addFloat(params, TransformParams.TARGET_ALPHA, 0, 1, clampToProgress(LINEAR, 0, 0.2f));
    }
    if (tsv != null) {
        out.setFloat(tsv.fullScreenProgress, AnimatedFloat.VALUE, 1, TOUCH_RESPONSE_INTERPOLATOR);
        out.setFloat(tsv.recentsViewScale, AnimatedFloat.VALUE, tsv.getFullScreenScale(), TOUCH_RESPONSE_INTERPOLATOR);
        if (showAsGrid) {
            out.setFloat(tsv.taskSecondaryTranslation, AnimatedFloat.VALUE, 0, TOUCH_RESPONSE_INTERPOLATOR_ACCEL_DEACCEL);
        }
        out.setFloat(tsv.recentsViewScroll, AnimatedFloat.VALUE, 0, TOUCH_RESPONSE_INTERPOLATOR);
        TaskViewSimulator finalTsv = tsv;
        TransformParams finalParams = params;
        out.addOnFrameCallback(() -> finalTsv.apply(finalParams));
        if (navBarTarget != null) {
            final Rect cropRect = new Rect();
            out.addOnFrameListener(new MultiValueUpdateListener() {

                FloatProp mNavFadeOut = new FloatProp(1f, 0f, 0, ANIMATION_NAV_FADE_OUT_DURATION, NAV_FADE_OUT_INTERPOLATOR);

                FloatProp mNavFadeIn = new FloatProp(0f, 1f, ANIMATION_DELAY_NAV_FADE_IN, ANIMATION_NAV_FADE_IN_DURATION, NAV_FADE_IN_INTERPOLATOR);

                @Override
                public void onUpdate(float percent, boolean initOnly) {
                    final SurfaceParams.Builder navBuilder = new SurfaceParams.Builder(navBarTarget.leash);
                    if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
                        finalTsv.getCurrentCropRect().round(cropRect);
                        navBuilder.withMatrix(finalTsv.getCurrentMatrix()).withWindowCrop(cropRect).withAlpha(mNavFadeIn.value);
                    } else {
                        navBuilder.withAlpha(mNavFadeOut.value);
                    }
                    finalParams.applySurfaceParams(navBuilder.build());
                }
            });
        } else if (inLiveTileMode) {
            // There is no transition animation for app launch from recent in live tile mode so
            // we have to trigger the navigation bar animation from system here.
            final RecentsAnimationController controller = recentsView.getRecentsAnimationController();
            if (controller != null) {
                controller.animateNavigationBarToApp(RECENTS_LAUNCH_DURATION);
            }
        }
        topMostSimulator = tsv;
    }
    if (!skipViewChanges && parallaxCenterAndAdjacentTask && topMostSimulator != null) {
        out.addFloat(v, VIEW_ALPHA, 1, 0, clampToProgress(LINEAR, 0.2f, 0.4f));
        TaskViewSimulator simulatorToCopy = topMostSimulator;
        simulatorToCopy.apply(params);
        // Mt represents the overall transformation on the thumbnailView relative to the
        // Launcher's rootView
        // K(t) represents transformation on the running window by the taskViewSimulator at
        // any time t.
        // at t = 0, we know that the simulator matches the thumbnailView. So if we apply K(0)`
        // on the Launcher's rootView, the thumbnailView would match the full running task
        // window. If we apply "K(0)` K(t)" thumbnailView will match the final transformed
        // window at any time t. This gives the overall matrix on thumbnailView to be:
        // Mt K(0)` K(t)
        // During animation we apply transformation on the thumbnailView (and not the rootView)
        // to follow the TaskViewSimulator. So the final matrix applied on the thumbnailView is:
        // Mt K(0)` K(t) Mt`
        TaskThumbnailView ttv = v.getThumbnail();
        RectF tvBounds = new RectF(0, 0, ttv.getWidth(), ttv.getHeight());
        float[] tvBoundsMapped = new float[] { 0, 0, ttv.getWidth(), ttv.getHeight() };
        getDescendantCoordRelativeToAncestor(ttv, ttv.getRootView(), tvBoundsMapped, false);
        RectF tvBoundsInRoot = new RectF(tvBoundsMapped[0], tvBoundsMapped[1], tvBoundsMapped[2], tvBoundsMapped[3]);
        Matrix mt = new Matrix();
        mt.setRectToRect(tvBounds, tvBoundsInRoot, ScaleToFit.FILL);
        Matrix mti = new Matrix();
        mt.invert(mti);
        Matrix k0i = new Matrix();
        simulatorToCopy.getCurrentMatrix().invert(k0i);
        Matrix animationMatrix = new Matrix();
        out.addOnFrameCallback(() -> {
            animationMatrix.set(mt);
            animationMatrix.postConcat(k0i);
            animationMatrix.postConcat(simulatorToCopy.getCurrentMatrix());
            animationMatrix.postConcat(mti);
            ttv.setAnimationMatrix(animationMatrix);
        });
        out.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationEnd(Animator animation) {
                ttv.setAnimationMatrix(null);
            }
        });
    }
    out.addListener(new AnimationSuccessListener() {

        @Override
        public void onAnimationSuccess(Animator animator) {
            if (isQuickSwitch) {
                InteractionJankMonitorWrapper.end(InteractionJankMonitorWrapper.CUJ_QUICK_SWITCH);
            }
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            targets.release();
            super.onAnimationEnd(animation);
        }
    });
    if (depthController != null) {
        out.setFloat(depthController, DEPTH, BACKGROUND_APP.getDepth(context), TOUCH_RESPONSE_INTERPOLATOR);
    }
}
Also used : DeviceProfile(com.android.launcher3.DeviceProfile) MultiValueUpdateListener(com.android.quickstep.util.MultiValueUpdateListener) SurfaceTransactionApplier(com.android.quickstep.util.SurfaceTransactionApplier) Matrix(android.graphics.Matrix) AnimatorListenerAdapter(android.animation.AnimatorListenerAdapter) SurfaceParams(com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams) AnimationSuccessListener(com.android.launcher3.anim.AnimationSuccessListener) Context(android.content.Context) Rect(android.graphics.Rect) TaskViewSimulator(com.android.quickstep.util.TaskViewSimulator) RemoteAnimationTargetCompat(com.android.systemui.shared.system.RemoteAnimationTargetCompat) RectF(android.graphics.RectF) Animator(android.animation.Animator) ObjectAnimator(android.animation.ObjectAnimator) TransformParams(com.android.quickstep.util.TransformParams) RecentsView(com.android.quickstep.views.RecentsView) TaskThumbnailView(com.android.quickstep.views.TaskThumbnailView)

Example 5 with DEPTH

use of com.android.launcher3.statehandlers.DepthController.DEPTH in project android_packages_apps_Launcher3 by crdroidandroid.

the class OverviewToHomeAnim method animateWithVelocity.

/**
 * Starts the animation. If velocity < 0 (i.e. upwards), also plays a
 * {@link WorkspaceRevealAnim}.
 */
public void animateWithVelocity(float velocity) {
    StateManager<LauncherState> stateManager = mLauncher.getStateManager();
    LauncherState startState = stateManager.getState();
    if (startState != OVERVIEW) {
        Log.e(TAG, "animateFromOverviewToHome: unexpected start state " + startState);
    }
    AnimatorSet anim = new AnimatorSet();
    boolean playWorkspaceRevealAnim = velocity < 0;
    if (playWorkspaceRevealAnim) {
        WorkspaceRevealAnim workspaceRevealAnim = new WorkspaceRevealAnim(mLauncher, false);
        workspaceRevealAnim.addAnimatorListener(new AnimationSuccessListener() {

            @Override
            public void onAnimationSuccess(Animator animator) {
                mIsHomeStaggeredAnimFinished = true;
                maybeOverviewToHomeAnimComplete();
            }
        });
        anim.play(workspaceRevealAnim.getAnimators());
    } else {
        mIsHomeStaggeredAnimFinished = true;
    }
    StateAnimationConfig config = new StateAnimationConfig();
    if (playWorkspaceRevealAnim) {
        // WorkspaceRevealAnim handles the depth, so don't interfere.
        config.animFlags |= StateAnimationConfig.SKIP_DEPTH_CONTROLLER;
    }
    config.duration = startState.getTransitionDuration(mLauncher);
    AnimatorSet stateAnim = stateManager.createAtomicAnimation(startState, NORMAL, config);
    stateAnim.addListener(new AnimationSuccessListener() {

        @Override
        public void onAnimationSuccess(Animator animator) {
            mIsOverviewHidden = true;
            maybeOverviewToHomeAnimComplete();
        }
    });
    anim.play(stateAnim);
    stateManager.setCurrentAnimation(anim, NORMAL);
    anim.start();
}
Also used : LauncherState(com.android.launcher3.LauncherState) Animator(android.animation.Animator) StateAnimationConfig(com.android.launcher3.states.StateAnimationConfig) AnimatorSet(android.animation.AnimatorSet) AnimationSuccessListener(com.android.launcher3.anim.AnimationSuccessListener)

Aggregations

Animator (android.animation.Animator)3 ObjectAnimator (android.animation.ObjectAnimator)3 AnimatorListenerAdapter (android.animation.AnimatorListenerAdapter)2 AnimatorSet (android.animation.AnimatorSet)2 ValueAnimator (android.animation.ValueAnimator)2 AnimationSuccessListener (com.android.launcher3.anim.AnimationSuccessListener)2 DepthController (com.android.launcher3.statehandlers.DepthController)2 Context (android.content.Context)1 XmlResourceParser (android.content.res.XmlResourceParser)1 Matrix (android.graphics.Matrix)1 Point (android.graphics.Point)1 Rect (android.graphics.Rect)1 RectF (android.graphics.RectF)1 TextPaint (android.text.TextPaint)1 SurfaceControl (android.view.SurfaceControl)1 ViewRootImpl (android.view.ViewRootImpl)1 DeviceProfile (com.android.launcher3.DeviceProfile)1 GridOption (com.android.launcher3.InvariantDeviceProfile.GridOption)1 LauncherState (com.android.launcher3.LauncherState)1 PendingAnimation (com.android.launcher3.anim.PendingAnimation)1