Search in sources :

Example 96 with PendingAnimation

use of com.android.launcher3.util.PendingAnimation in project android_packages_apps_404Launcher by P-404.

the class RecentsView method confirmSplitSelect.

public void confirmSplitSelect(TaskView taskView) {
    mSplitToast.cancel();
    if (!taskView.getTask().isDockable) {
        // Task not split screen supported
        mSplitUnsupportedToast.show();
        return;
    }
    RectF secondTaskStartingBounds = new RectF();
    Rect secondTaskEndingBounds = new Rect();
    // TODO(194414938) starting bounds seem slightly off, investigate
    Rect firstTaskStartingBounds = new Rect();
    Rect firstTaskEndingBounds = mTempRect;
    int duration = mActivity.getStateManager().getState().getTransitionDuration(getContext());
    PendingAnimation pendingAnimation = new PendingAnimation(duration);
    int halfDividerSize = getResources().getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2;
    mOrientationHandler.getFinalSplitPlaceholderBounds(halfDividerSize, mActivity.getDeviceProfile(), mSplitSelectStateController.getActiveSplitStagePosition(), firstTaskEndingBounds, secondTaskEndingBounds);
    if (mFirstFloatingTaskView == null)
        return;
    mFirstFloatingTaskView.getBoundsOnScreen(firstTaskStartingBounds);
    mFirstFloatingTaskView.addAnimation(pendingAnimation, new RectF(firstTaskStartingBounds), firstTaskEndingBounds, mFirstFloatingTaskView, false);
    mSecondFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity, taskView, secondTaskStartingBounds);
    mSecondFloatingTaskView.setAlpha(1);
    mSecondFloatingTaskView.addAnimation(pendingAnimation, secondTaskStartingBounds, secondTaskEndingBounds, taskView.getThumbnail(), true);
    pendingAnimation.addEndListener(aBoolean -> mSplitSelectStateController.setSecondTaskId(taskView.getTask(), aBoolean1 -> RecentsView.this.resetFromSplitSelectionState()));
    mSecondSplitHiddenTaskView = taskView;
    taskView.setVisibility(INVISIBLE);
    pendingAnimation.buildAnim().start();
}
Also used : RectF(android.graphics.RectF) BACKGROUND_APP(com.android.launcher3.LauncherState.BACKGROUND_APP) RemoteTargetGluer(com.android.quickstep.RemoteTargetGluer) HIDDEN_NO_TASKS(com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_TASKS) Bundle(android.os.Bundle) Overrides(com.android.launcher3.util.ResourceBasedOverride.Overrides) NonNull(androidx.annotation.NonNull) AnimatorListeners(com.android.launcher3.anim.AnimatorListeners) AccessibilityManagerCompat(com.android.launcher3.compat.AccessibilityManagerCompat) BaseActivityInterface(com.android.quickstep.BaseActivityInterface) Drawable(android.graphics.drawable.Drawable) TaskViewSimulator(com.android.quickstep.util.TaskViewSimulator) LayoutTransition(android.animation.LayoutTransition) PropertyValuesHolder(android.animation.PropertyValuesHolder) TaskStackChangeListeners(com.android.systemui.shared.system.TaskStackChangeListeners) UiThread(androidx.annotation.UiThread) Canvas(android.graphics.Canvas) LayoutUtils(com.android.quickstep.util.LayoutUtils) AccessibilityEvent(android.view.accessibility.AccessibilityEvent) TargetApi(android.annotation.TargetApi) Log(android.util.Log) TaskVisualsChangeListener(com.android.quickstep.RecentsModel.TaskVisualsChangeListener) RecentsAnimationTargets(com.android.quickstep.RecentsAnimationTargets) HIDDEN_NO_RECENTS(com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_RECENTS) Interpolator(android.view.animation.Interpolator) HIDDEN_NON_ZERO_ROTATION(com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION) AnimatorListenerAdapter(android.animation.AnimatorListenerAdapter) DeviceProfile(com.android.launcher3.DeviceProfile) HapticFeedbackConstants(android.view.HapticFeedbackConstants) LAUNCHER_TASK_LAUNCH_SWIPE_DOWN(com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK_LAUNCH_SWIPE_DOWN) Nullable(androidx.annotation.Nullable) UI_STATE_FULLSCREEN_TASK(com.android.launcher3.util.SystemUiController.UI_STATE_FULLSCREEN_TASK) Layout(android.text.Layout) MultiWindowModeChangedListener(com.android.launcher3.BaseActivity.MultiWindowModeChangedListener) TextPaint(android.text.TextPaint) AbstractFloatingView.getTopOpenViewWithType(com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType) RemoteAnimationTargetCompat(com.android.systemui.shared.system.RemoteAnimationTargetCompat) TaskKey(com.android.systemui.shared.recents.model.Task.TaskKey) Insettable(com.android.launcher3.Insettable) SystemClock(android.os.SystemClock) Utilities.squaredTouchSlop(com.android.launcher3.Utilities.squaredTouchSlop) SystemUiProxy(com.android.quickstep.SystemUiProxy) CANVAS_TRANSLATE(com.android.launcher3.touch.PagedOrientationHandler.CANVAS_TRANSLATE) RemoteAnimationTargets(com.android.quickstep.RemoteAnimationTargets) ArrayList(java.util.ArrayList) TransformParams(com.android.quickstep.util.TransformParams) TaskUtils.checkCurrentOrManagedUserId(com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId) SplitScreenBounds(com.android.quickstep.util.SplitScreenBounds) VibrationEffect(android.os.VibrationEffect) UserHandle(android.os.UserHandle) Toast(android.widget.Toast) Utilities.mapToRange(com.android.launcher3.Utilities.mapToRange) DEPTH(com.android.launcher3.statehandlers.DepthController.DEPTH) LocusId(android.content.LocusId) IntArray(com.android.launcher3.util.IntArray) MeasureSpec.makeMeasureSpec(android.view.View.MeasureSpec.makeMeasureSpec) DISMISS_ALPHA(com.android.quickstep.views.ClearAllButton.DISMISS_ALPHA) BaseState(com.android.launcher3.statemanager.BaseState) SpringProperty(com.android.launcher3.anim.SpringProperty) OverScroll(com.android.launcher3.touch.OverScroll) ViewPool(com.android.launcher3.util.ViewPool) ViewDebug(android.view.ViewDebug) FeatureFlags(com.android.launcher3.config.FeatureFlags) DynamicResource(com.android.launcher3.util.DynamicResource) SUCCESS_TRANSITION_PROGRESS(com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS) LINEAR(com.android.launcher3.anim.Interpolators.LINEAR) IntSet(com.android.launcher3.util.IntSet) SparseBooleanArray(android.util.SparseBooleanArray) HandlerRunnable(com.android.launcher3.icons.cache.HandlerRunnable) R(com.android.launcher3.R) TranslateEdgeEffect(com.android.launcher3.util.TranslateEdgeEffect) Configuration(android.content.res.Configuration) ColorUtils(androidx.core.graphics.ColorUtils) RunnableList(com.android.launcher3.util.RunnableList) ACCEL(com.android.launcher3.anim.Interpolators.ACCEL) ValueAnimator(android.animation.ValueAnimator) Rect(android.graphics.Rect) PackageManagerWrapper(com.android.systemui.shared.system.PackageManagerWrapper) PointF(android.graphics.PointF) StagedSplitBounds(com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds) Task(com.android.systemui.shared.recents.model.Task) Interpolators.clampToProgress(com.android.launcher3.anim.Interpolators.clampToProgress) RECENTS_LAUNCH_DURATION(com.android.launcher3.QuickstepTransitionManager.RECENTS_LAUNCH_DURATION) Animator(android.animation.Animator) STAGE_POSITION_TOP_OR_LEFT(com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT) FloatProperty(android.util.FloatProperty) AttributeSet(android.util.AttributeSet) ActivityManagerWrapper(com.android.systemui.shared.system.ActivityManagerWrapper) TaskViewUtils(com.android.quickstep.TaskViewUtils) STAGE_POSITION_BOTTOM_OR_RIGHT(com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT) MAIN_EXECUTOR(com.android.launcher3.util.Executors.MAIN_EXECUTOR) View(android.view.View) VibratorWrapper(com.android.quickstep.util.VibratorWrapper) Matrix(android.graphics.Matrix) RectF(android.graphics.RectF) OverScroller(android.widget.OverScroller) Utilities(com.android.launcher3.Utilities) AnimatedFloat(com.android.quickstep.AnimatedFloat) TransitionListener(android.animation.LayoutTransition.TransitionListener) UI_HELPER_EXECUTOR(com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR) DepthController(com.android.launcher3.statehandlers.DepthController) ObjectAnimator(android.animation.ObjectAnimator) EDGE_NAV_BAR(com.android.launcher3.Utilities.EDGE_NAV_BAR) TaskStackChangeListener(com.android.systemui.shared.system.TaskStackChangeListener) ROTATION_0(android.view.Surface.ROTATION_0) ViewGroup(android.view.ViewGroup) MultiValueAlpha(com.android.launcher3.util.MultiValueAlpha) SplitSelectStateController(com.android.quickstep.util.SplitSelectStateController) Objects(java.util.Objects) List(java.util.List) OnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener) HIDDEN_SPLIT_SCREEN(com.android.quickstep.views.OverviewActionsView.HIDDEN_SPLIT_SCREEN) ThumbnailData(com.android.systemui.shared.recents.model.ThumbnailData) RemoteTargetHandle(com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle) ListView(android.widget.ListView) Themes(com.android.launcher3.util.Themes) SurfaceTransactionApplier(com.android.quickstep.util.SurfaceTransactionApplier) TYPE_TASK_MENU(com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU) IPipAnimationListener(com.android.wm.shell.pip.IPipAnimationListener) ACCEL_DEACCEL(com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL) Typeface(android.graphics.Typeface) Context(android.content.Context) StaticLayout(android.text.StaticLayout) AccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo) TaskThumbnailCache(com.android.quickstep.TaskThumbnailCache) KeyEvent(android.view.KeyEvent) LAUNCHER_TASK_CLEAR_ALL(com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK_CLEAR_ALL) RunningTaskInfo(android.app.ActivityManager.RunningTaskInfo) EXACTLY(android.view.View.MeasureSpec.EXACTLY) STATE_HANDLER_INVISIBILITY_FLAGS(com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS) Pair(android.util.Pair) LAUNCHER_TASK_DISMISS_SWIPE_UP(com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK_DISMISS_SWIPE_UP) HashMap(java.util.HashMap) FAST_OUT_SLOW_IN(com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN) AnimatorPlaybackController(com.android.launcher3.anim.AnimatorPlaybackController) Utilities.squaredHypot(com.android.launcher3.Utilities.squaredHypot) ENABLE_QUICKSTEP_LIVE_TILE(com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE) MotionEvent(android.view.MotionEvent) BaseActivity(com.android.launcher3.BaseActivity) AnimatorSet(android.animation.AnimatorSet) Build(android.os.Build) TaskOverlayFactory(com.android.quickstep.TaskOverlayFactory) SurfaceParams(com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams) GroupTask(com.android.quickstep.util.GroupTask) LayoutInflater(android.view.LayoutInflater) GestureState(com.android.quickstep.GestureState) RecentsAnimationController(com.android.quickstep.RecentsAnimationController) TASK_VIEW_ID_CRASH(com.android.launcher3.testing.TestProtocol.TASK_VIEW_ID_CRASH) StatefulActivity(com.android.launcher3.statemanager.StatefulActivity) Point(android.graphics.Point) RecentsOrientedState(com.android.quickstep.util.RecentsOrientedState) ResourceProvider(com.android.systemui.plugins.ResourceProvider) VIEW_ALPHA(com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA) BlendMode(android.graphics.BlendMode) Color(android.graphics.Color) Consumer(java.util.function.Consumer) InvariantDeviceProfile(com.android.launcher3.InvariantDeviceProfile) FINAL_FRAME(com.android.launcher3.anim.Interpolators.FINAL_FRAME) RecentsModel(com.android.quickstep.RecentsModel) PagedView(com.android.launcher3.PagedView) ACCEL_0_75(com.android.launcher3.anim.Interpolators.ACCEL_0_75) PagedOrientationHandler(com.android.launcher3.touch.PagedOrientationHandler) StagePosition(com.android.launcher3.util.SplitConfigurationOptions.StagePosition) PendingAnimation(com.android.launcher3.anim.PendingAnimation) ViewUtils(com.android.quickstep.ViewUtils) PendingAnimation(com.android.launcher3.anim.PendingAnimation) Rect(android.graphics.Rect) TextPaint(android.text.TextPaint) Point(android.graphics.Point)

Example 97 with PendingAnimation

use of com.android.launcher3.util.PendingAnimation in project android_packages_apps_404Launcher by P-404.

the class FloatingTaskView method addAnimation.

public void addAnimation(PendingAnimation animation, RectF startingBounds, Rect endBounds, View viewToCover, boolean fadeWithThumbnail) {
    final BaseDragLayer dragLayer = mActivity.getDragLayer();
    int[] dragLayerBounds = new int[2];
    dragLayer.getLocationOnScreen(dragLayerBounds);
    SplitOverlayProperties prop = new SplitOverlayProperties(endBounds, startingBounds, viewToCover, dragLayerBounds[0], dragLayerBounds[1]);
    ValueAnimator transitionAnimator = ValueAnimator.ofFloat(0, 1);
    animation.add(transitionAnimator);
    long animDuration = animation.getDuration();
    Rect crop = new Rect();
    RectF floatingTaskViewBounds = new RectF();
    final float initialWindowRadius = supportsRoundedCornersOnWindows(getResources()) ? Math.max(crop.width(), crop.height()) / 2f : 0f;
    if (fadeWithThumbnail) {
        animation.addFloat(mSplitPlaceholderView, SplitPlaceholderView.ALPHA_FLOAT, 0, 1, ACCEL);
        animation.addFloat(mImageView, LauncherAnimUtils.VIEW_ALPHA, 1, 0, DEACCEL_3);
    }
    MultiValueUpdateListener listener = new MultiValueUpdateListener() {

        final FloatProp mWindowRadius = new FloatProp(initialWindowRadius, initialWindowRadius, 0, animDuration, LINEAR);

        final FloatProp mDx = new FloatProp(0, prop.dX, 0, animDuration, LINEAR);

        final FloatProp mDy = new FloatProp(0, prop.dY, 0, animDuration, LINEAR);

        final FloatProp mTaskViewScaleX = new FloatProp(prop.initialTaskViewScaleX, prop.finalTaskViewScaleX, 0, animDuration, LINEAR);

        final FloatProp mTaskViewScaleY = new FloatProp(prop.initialTaskViewScaleY, prop.finalTaskViewScaleY, 0, animDuration, LINEAR);

        @Override
        public void onUpdate(float percent, boolean initOnly) {
            // Calculate the icon position.
            floatingTaskViewBounds.set(startingBounds);
            floatingTaskViewBounds.offset(mDx.value, mDy.value);
            Utilities.scaleRectFAboutCenter(floatingTaskViewBounds, mTaskViewScaleX.value, mTaskViewScaleY.value);
            update(floatingTaskViewBounds, percent, mWindowRadius.value * 1);
        }
    };
    transitionAnimator.addUpdateListener(listener);
}
Also used : RectF(android.graphics.RectF) BaseDragLayer(com.android.launcher3.views.BaseDragLayer) Rect(android.graphics.Rect) MultiValueUpdateListener(com.android.quickstep.util.MultiValueUpdateListener) ValueAnimator(android.animation.ValueAnimator)

Example 98 with PendingAnimation

use of com.android.launcher3.util.PendingAnimation in project android_packages_apps_404Launcher by P-404.

the class StateManager method createAnimationToNewWorkspaceInternal.

private PendingAnimation createAnimationToNewWorkspaceInternal(final STATE_TYPE state) {
    PendingAnimation builder = new PendingAnimation(mConfig.duration);
    if (!mConfig.hasAnimationFlag(SKIP_ALL_ANIMATIONS)) {
        for (StateHandler handler : getStateHandlers()) {
            handler.setStateWithAnimation(state, mConfig, builder);
        }
    }
    builder.addListener(createStateAnimationListener(state));
    mConfig.setAnimation(builder.buildAnim(), state);
    return builder;
}
Also used : PendingAnimation(com.android.launcher3.anim.PendingAnimation)

Example 99 with PendingAnimation

use of com.android.launcher3.util.PendingAnimation in project android_packages_apps_404Launcher by P-404.

the class WorkspaceStateTransitionAnimation method setWorkspaceProperty.

/**
 * Starts a transition animation for the workspace.
 */
private void setWorkspaceProperty(LauncherState state, PropertySetter propertySetter, StateAnimationConfig config) {
    ScaleAndTranslation scaleAndTranslation = state.getWorkspaceScaleAndTranslation(mLauncher);
    ScaleAndTranslation hotseatScaleAndTranslation = state.getHotseatScaleAndTranslation(mLauncher);
    mNewScale = scaleAndTranslation.scale;
    PageAlphaProvider pageAlphaProvider = state.getWorkspacePageAlphaProvider(mLauncher);
    final int childCount = mWorkspace.getChildCount();
    for (int i = 0; i < childCount; i++) {
        applyChildState(state, (CellLayout) mWorkspace.getChildAt(i), i, pageAlphaProvider, propertySetter, config);
    }
    int elements = state.getVisibleElements(mLauncher);
    Interpolator fadeInterpolator = config.getInterpolator(ANIM_WORKSPACE_FADE, pageAlphaProvider.interpolator);
    Hotseat hotseat = mWorkspace.getHotseat();
    Interpolator scaleInterpolator = config.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT);
    LauncherState fromState = mLauncher.getStateManager().getState();
    boolean shouldSpring = propertySetter instanceof PendingAnimation && fromState == HINT_STATE && state == NORMAL;
    if (shouldSpring) {
        ((PendingAnimation) propertySetter).add(getSpringScaleAnimator(mLauncher, mWorkspace, mNewScale));
    } else {
        propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, scaleInterpolator);
    }
    mWorkspace.setPivotToScaleWithSelf(hotseat);
    float hotseatScale = hotseatScaleAndTranslation.scale;
    if (shouldSpring) {
        PendingAnimation pa = (PendingAnimation) propertySetter;
        pa.add(getSpringScaleAnimator(mLauncher, hotseat, hotseatScale));
    } else {
        Interpolator hotseatScaleInterpolator = config.getInterpolator(ANIM_HOTSEAT_SCALE, scaleInterpolator);
        propertySetter.setFloat(hotseat, SCALE_PROPERTY, hotseatScale, hotseatScaleInterpolator);
    }
    float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0;
    propertySetter.setViewAlpha(hotseat, hotseatIconsAlpha, fadeInterpolator);
    float workspacePageIndicatorAlpha = (elements & WORKSPACE_PAGE_INDICATOR) != 0 ? 1 : 0;
    propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(), workspacePageIndicatorAlpha, fadeInterpolator);
    Interpolator translationInterpolator = config.getInterpolator(ANIM_WORKSPACE_TRANSLATE, ZOOM_OUT);
    propertySetter.setFloat(mWorkspace, VIEW_TRANSLATE_X, scaleAndTranslation.translationX, translationInterpolator);
    propertySetter.setFloat(mWorkspace, VIEW_TRANSLATE_Y, scaleAndTranslation.translationY, translationInterpolator);
    Interpolator hotseatTranslationInterpolator = config.getInterpolator(ANIM_HOTSEAT_TRANSLATE, translationInterpolator);
    propertySetter.setFloat(hotseat, VIEW_TRANSLATE_Y, hotseatScaleAndTranslation.translationY, hotseatTranslationInterpolator);
    propertySetter.setFloat(mWorkspace.getPageIndicator(), VIEW_TRANSLATE_Y, hotseatScaleAndTranslation.translationY, hotseatTranslationInterpolator);
    if (!config.hasAnimationFlag(SKIP_SCRIM)) {
        setScrim(propertySetter, state, config);
    }
}
Also used : ScaleAndTranslation(com.android.launcher3.LauncherState.ScaleAndTranslation) PendingAnimation(com.android.launcher3.anim.PendingAnimation) PageAlphaProvider(com.android.launcher3.LauncherState.PageAlphaProvider) Interpolator(android.view.animation.Interpolator)

Example 100 with PendingAnimation

use of com.android.launcher3.util.PendingAnimation in project android_packages_apps_404Launcher by P-404.

the class RecentsView method createAllTasksDismissAnimation.

public PendingAnimation createAllTasksDismissAnimation(long duration) {
    if (FeatureFlags.IS_STUDIO_BUILD && mPendingAnimation != null) {
        throw new IllegalStateException("Another pending animation is still running");
    }
    PendingAnimation anim = new PendingAnimation(duration);
    int count = getTaskViewCount();
    for (int i = 0; i < count; i++) {
        addDismissedTaskAnimations(requireTaskViewAt(i), duration, anim);
    }
    mPendingAnimation = anim;
    mPendingAnimation.addEndListener(isSuccess -> {
        if (isSuccess) {
            // Remove all the task views now
            finishRecentsAnimation(true, /* toRecents */
            false, /* shouldPip */
            () -> {
                UI_HELPER_EXECUTOR.getHandler().postDelayed(ActivityManagerWrapper.getInstance()::removeAllRecentTasks, REMOVE_TASK_WAIT_FOR_APP_STOP_MS);
                removeTasksViewsAndClearAllButton();
                startHome();
            });
        }
        mPendingAnimation = null;
    });
    return anim;
}
Also used : PendingAnimation(com.android.launcher3.anim.PendingAnimation) TextPaint(android.text.TextPaint) Point(android.graphics.Point)

Aggregations

PendingAnimation (com.android.launcher3.anim.PendingAnimation)145 AnimatorPlaybackController (com.android.launcher3.anim.AnimatorPlaybackController)58 Animator (android.animation.Animator)46 AnimatorSet (android.animation.AnimatorSet)45 Rect (android.graphics.Rect)36 ValueAnimator (android.animation.ValueAnimator)34 Point (android.graphics.Point)32 TextPaint (android.text.TextPaint)32 ObjectAnimator (android.animation.ObjectAnimator)31 Context (android.content.Context)31 AnimatorListenerAdapter (android.animation.AnimatorListenerAdapter)29 View (android.view.View)29 RecentsView (com.android.quickstep.views.RecentsView)29 DeviceProfile (com.android.launcher3.DeviceProfile)27 RectF (android.graphics.RectF)26 Interpolator (android.view.animation.Interpolator)26 PagedOrientationHandler (com.android.launcher3.touch.PagedOrientationHandler)25 FloatProperty (android.util.FloatProperty)23 Matrix (android.graphics.Matrix)21 SpringProperty (com.android.launcher3.anim.SpringProperty)21