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

Commit b54c4a3d authored by Tony Wickham's avatar Tony Wickham
Browse files

Added BaseDropTargetBar, which SearchDropTargetBar extends.

This is to allow for a future AppInfoDropTargetBar.

Change-Id: I5e66129919226eaef1ba1ddb0c0c99d0a6dc48df
parent e33c09f1
Loading
Loading
Loading
Loading
+131 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 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 com.android.launcher3;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.FrameLayout;

import com.android.launcher3.dragndrop.DragController;

/**
 * Base class for drop target bars (where you can drop apps to do actions such as uninstall).
 */
public abstract class BaseDropTargetBar extends FrameLayout implements DragController.DragListener {
    protected static final int DEFAULT_DRAG_FADE_DURATION = 175;

    protected View mDropTargetBar;

    protected LauncherViewPropertyAnimator mDropTargetBarAnimator;
    protected static final AccelerateInterpolator sAccelerateInterpolator =
            new AccelerateInterpolator();
    protected boolean mAccessibilityEnabled = false;

    protected boolean mDeferOnDragEnd;

    public BaseDropTargetBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BaseDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        mDropTargetBar = findViewById(R.id.drag_target_bar);

        // Create the various fade animations
        mDropTargetBar.setAlpha(0f);
        mDropTargetBarAnimator = new LauncherViewPropertyAnimator(mDropTargetBar);
        mDropTargetBarAnimator.setInterpolator(sAccelerateInterpolator);
        mDropTargetBarAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                // Ensure that the view is visible for the animation
                mDropTargetBar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                if (mDropTargetBar != null) {
                    AlphaUpdateListener.updateVisibility(mDropTargetBar, mAccessibilityEnabled);
                }
            }
        });
    }


    /**
     * Convenience method to animate the alpha of a view using hardware layers.
     */
    protected void animateViewAlpha(LauncherViewPropertyAnimator animator, View v, float alpha,
                                  int duration) {
        if (v == null) {
            return;
        }

        animator.cancel();
        if (Float.compare(v.getAlpha(), alpha) != 0) {
            if (duration > 0) {
                animator.alpha(alpha).withLayer().setDuration(duration).start();
            } else {
                v.setAlpha(alpha);
                AlphaUpdateListener.updateVisibility(v, mAccessibilityEnabled);
            }
        }
    }

    /*
     * DragController.DragListener implementation
     */
    @Override
    public void onDragStart(DragSource source, ItemInfo info, int dragAction) {
        showDropTarget();
    }

    /**
     * This is called to defer hiding the delete drop target until the drop animation has completed,
     * instead of hiding immediately when the drag has ended.
     */
    protected void deferOnDragEnd() {
        mDeferOnDragEnd = true;
    }

    @Override
    public void onDragEnd() {
        if (!mDeferOnDragEnd) {
            hideDropTarget();
        } else {
            mDeferOnDragEnd = false;
        }
    }

    public abstract void showDropTarget();

    public abstract void hideDropTarget();

    public abstract void enableAccessibleDrag(boolean enable);

    public abstract void setup(Launcher launcher, DragController dragController);
}
+6 −6
Original line number Diff line number Diff line
@@ -49,11 +49,11 @@ import com.android.launcher3.util.Thunk;
public abstract class ButtonDropTarget extends TextView
        implements DropTarget, DragController.DragListener, OnClickListener {

    private static int DRAG_VIEW_DROP_DURATION = 285;
    private static final int DRAG_VIEW_DROP_DURATION = 285;

    protected Launcher mLauncher;
    private int mBottomDragPadding;
    protected SearchDropTargetBar mSearchDropTargetBar;
    protected BaseDropTargetBar mDropTargetBar;

    /** Whether this drop target is active for the current drag */
    protected boolean mActive;
@@ -106,8 +106,8 @@ public abstract class ButtonDropTarget extends TextView
        mLauncher = launcher;
    }

    public void setSearchDropTargetBar(SearchDropTargetBar searchDropTargetBar) {
        mSearchDropTargetBar = searchDropTargetBar;
    public void setDropTargetBar(BaseDropTargetBar dropTargetBar) {
        mDropTargetBar = dropTargetBar;
    }

    @Override
@@ -230,13 +230,13 @@ public abstract class ButtonDropTarget extends TextView
        final Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(),
                width, height);
        final float scale = (float) to.width() / from.width();
        mSearchDropTargetBar.deferOnDragEnd();
        mDropTargetBar.deferOnDragEnd();

        Runnable onAnimationEndRunnable = new Runnable() {
            @Override
            public void run() {
                completeDrop(d);
                mSearchDropTargetBar.onDragEnd();
                mDropTargetBar.onDragEnd();
                mLauncher.exitSpringLoadedDragModeDelayed(true, 0, null);
            }
        };
+25 −93
Original line number Diff line number Diff line
@@ -23,17 +23,15 @@ import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.AccelerateInterpolator;
import android.widget.FrameLayout;

import com.android.launcher3.dragndrop.DragController;
import com.android.launcher3.util.Thunk;

/*
 * Ths bar will manage the transition between the QSB search bar and the delete drop
 * targets so that each of the individual IconDropTargets don't have to.
 * This bar will manage the transition between the QSB search bar and the delete/uninstall drop
 * targets so that each of the individual ButtonDropTargets don't have to.
 */
public class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
public class SearchDropTargetBar extends BaseDropTargetBar {

    /** The different states that the search bar space can be in. */
    public enum State {
@@ -58,21 +56,13 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
        }
    }

    private static int DEFAULT_DRAG_FADE_DURATION = 175;

    private LauncherViewPropertyAnimator mDropTargetBarAnimator;
    private LauncherViewPropertyAnimator mQSBSearchBarAnimator;
    private static final AccelerateInterpolator sAccelerateInterpolator =
            new AccelerateInterpolator();

    private State mState = State.SEARCH_BAR;
    @Thunk View mQSB;
    @Thunk View mDropTargetBar;
    private boolean mDeferOnDragEnd = false;
    @Thunk boolean mAccessibilityEnabled = false;

    // Drop targets
    private ButtonDropTarget mInfoDropTarget;
    private ButtonDropTarget mDeleteDropTarget;
    private ButtonDropTarget mUninstallDropTarget;

@@ -84,61 +74,48 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        // Get the individual components
        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
        mUninstallDropTarget = (ButtonDropTarget) mDropTargetBar
                .findViewById(R.id.uninstall_target_text);

        mDeleteDropTarget.setDropTargetBar(this);
        mUninstallDropTarget.setDropTargetBar(this);
    }

    @Override
    public void setup(Launcher launcher, DragController dragController) {
        dragController.addDragListener(this);
        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);

        dragController.addDragListener(mInfoDropTarget);
        dragController.addDragListener(mDeleteDropTarget);
        dragController.addDragListener(mUninstallDropTarget);

        dragController.addDropTarget(mInfoDropTarget);
        dragController.addDropTarget(mDeleteDropTarget);
        dragController.addDropTarget(mUninstallDropTarget);

        mInfoDropTarget.setLauncher(launcher);
        mDeleteDropTarget.setLauncher(launcher);
        mUninstallDropTarget.setLauncher(launcher);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        // Get the individual components
        mDropTargetBar = findViewById(R.id.drag_target_bar);
        mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
        mUninstallDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.uninstall_target_text);

        mInfoDropTarget.setSearchDropTargetBar(this);
        mDeleteDropTarget.setSearchDropTargetBar(this);
        mUninstallDropTarget.setSearchDropTargetBar(this);

        // Create the various fade animations
        mDropTargetBar.setAlpha(0f);
        mDropTargetBarAnimator = new LauncherViewPropertyAnimator(mDropTargetBar);
        mDropTargetBarAnimator.setInterpolator(sAccelerateInterpolator);
        mDropTargetBarAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                // Ensure that the view is visible for the animation
                mDropTargetBar.setVisibility(View.VISIBLE);
    public void showDropTarget() {
        animateToState(State.DROP_TARGET, DEFAULT_DRAG_FADE_DURATION);
    }

    @Override
            public void onAnimationEnd(Animator animation) {
                if (mDropTargetBar != null) {
                    AlphaUpdateListener.updateVisibility(mDropTargetBar, mAccessibilityEnabled);
                }
            }
        });
    public void hideDropTarget() {
        animateToState(State.SEARCH_BAR, DEFAULT_DRAG_FADE_DURATION);
    }

    public void setQsbSearchBar(View qsb) {
        mQSB = qsb;
        if (mQSB != null) {
            // Update the search ber animation
            // Update the search bar animation
            mQSBSearchBarAnimator = new LauncherViewPropertyAnimator(mQSB);
            mQSBSearchBarAnimator.setInterpolator(sAccelerateInterpolator);
            mQSBSearchBarAnimator.addListener(new AnimatorListenerAdapter() {
@@ -182,51 +159,6 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
        }
    }

    /**
     * Convenience method to animate the alpha of a view using hardware layers.
     */
    private void animateViewAlpha(LauncherViewPropertyAnimator animator, View v, float alpha,
            int duration) {
        if (v == null) {
            return;
        }

        animator.cancel();
        if (Float.compare(v.getAlpha(), alpha) != 0) {
            if (duration > 0) {
                animator.alpha(alpha).withLayer().setDuration(duration).start();
            } else {
                v.setAlpha(alpha);
                AlphaUpdateListener.updateVisibility(v, mAccessibilityEnabled);
            }
        }
    }

    /*
     * DragController.DragListener implementation
     */
    @Override
    public void onDragStart(DragSource source, ItemInfo info, int dragAction) {
        animateToState(State.DROP_TARGET, DEFAULT_DRAG_FADE_DURATION);
    }

    /**
     * This is called to defer hiding the delete drop target until the drop animation has completed,
     * instead of hiding immediately when the drag has ended.
     */
    public void deferOnDragEnd() {
        mDeferOnDragEnd = true;
    }

    @Override
    public void onDragEnd() {
        if (!mDeferOnDragEnd) {
            animateToState(State.SEARCH_BAR, DEFAULT_DRAG_FADE_DURATION);
        } else {
            mDeferOnDragEnd = false;
        }
    }

    /**
     * @return the bounds of the QSB search bar.
     */
@@ -246,11 +178,11 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
        }
    }

    @Override
    public void enableAccessibleDrag(boolean enable) {
        if (mQSB != null) {
            mQSB.setVisibility(enable ? View.GONE : View.VISIBLE);
        }
        mInfoDropTarget.enableAccessibleDrag(enable);
        mDeleteDropTarget.enableAccessibleDrag(enable);
        mUninstallDropTarget.enableAccessibleDrag(enable);
    }