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

Commit b7e15adc authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Animating the folder title & page indicator when a multi-page folder

is opened for the first time

Change-Id: I70f5fd942724251a5e863fbb78a0c24f440b0283
parent 4e267f4c
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -45,20 +45,16 @@
        android:id="@+id/folder_footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <include
            android:id="@+id/folder_page_indicator"
            android:layout_width="wrap_content"
            android:layout_height="12dp"
            android:layout_gravity="center_horizontal"
            layout="@layout/page_indicator" />
        android:orientation="horizontal"
        android:paddingLeft="8dp"
        android:paddingRight="8dp" >

        <com.android.launcher3.FolderEditText
            android:id="@+id/folder_name"
            android:layout_width="match_parent"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:background="#00000000"
            android:fontFamily="sans-serif-condensed"
            android:gravity="center_horizontal"
@@ -72,6 +68,13 @@
            android:textColorHint="#ff808080"
            android:textCursorDrawable="@null"
            android:textSize="14sp" />

        <include
            android:id="@+id/folder_page_indicator"
            android:layout_width="wrap_content"
            android:layout_height="12dp"
            android:layout_gravity="center_vertical"
            layout="@layout/page_indicator" />
    </LinearLayout>

</com.android.launcher3.Folder>
 No newline at end of file
+46 −3
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
     */
    private static final float ICON_OVERSCROLL_WIDTH_FACTOR = 0.45f;

    public static final int FOOTER_ANIMATION_DURATION = 200;

    private static final int REORDER_DELAY = 250;
    private static final int ON_EXIT_CLOSE_DELAY = 400;
    private static final Rect sTempRect = new Rect();
@@ -201,10 +203,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
                InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_FLAG_CAP_WORDS);

        mFooter = findViewById(R.id.folder_footer);
        updateFooterHeight();
    }

    public void updateFooterHeight() {
        // We find out how tall footer wants to be (it is set to wrap_content), so that
        // we can allocate the appropriate amount of space for it.
        int measureSpec = MeasureSpec.UNSPECIFIED;
@@ -529,6 +528,36 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
                mContent.setFocusOnFirstChild();
            }
        });

        // Footer animation
        if (mContent.getPageCount() > 1 && !mInfo.hasOption(FolderInfo.FLAG_MULTI_PAGE_ANIMATION)) {
            int footerWidth = mContent.getDesiredWidth()
                    - mFooter.getPaddingLeft() - mFooter.getPaddingRight();

            float textWidth =  mFolderName.getPaint().measureText(mFolderName.getText().toString());
            mFolderName.setTranslationX((footerWidth - textWidth) / 2);
            mContent.setMarkerScale(0);

            // Do not update the flag if we are in drag mode. The flag will be updated, when we
            // actually drop the icon.
            final boolean updateAnimationFlag = !mDragInProgress;
            openFolderAnim.addListener(new AnimatorListenerAdapter() {

                @Override
                public void onAnimationEnd(Animator animation) {
                    mFolderName.animate().setDuration(FOOTER_ANIMATION_DURATION).translationX(0);
                    mContent.animateMarkers();

                    if (updateAnimationFlag) {
                        mInfo.setOption(FolderInfo.FLAG_MULTI_PAGE_ANIMATION, true, mLauncher);
                    }
                }
            });
        } else {
            mFolderName.setTranslationX(0);
            mContent.setMarkerScale(1);
        }

        openFolderAnim.start();

        // Make sure the folder picks up the last drag move even if the finger doesn't move.
@@ -805,6 +834,14 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
        // Reordering may have occured, and we need to save the new item locations. We do this once
        // at the end to prevent unnecessary database operations.
        updateItemLocationsInDatabaseBatch();

        // Use the item count to check for multi-page as the folder UI may not have
        // been refreshed yet.
        if (getItemCount() <= mContent.itemsPerPage()) {
            // Show the animation, next time something is added to the folder.
            mInfo.setOption(FolderInfo.FLAG_MULTI_PAGE_ANIMATION, false, mLauncher);
        }

    }

    @Override
@@ -1183,6 +1220,11 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
        // Clear the drag info, as it is no longer being dragged.
        mCurrentDragInfo = null;
        mDragInProgress = false;

        if (mContent.getPageCount() > 1) {
            // The animation has already been shown while opening the folder.
            mInfo.setOption(FolderInfo.FLAG_MULTI_PAGE_ANIMATION, true, mLauncher);
        }
    }

    // This is used so the item doesn't immediately appear in the folder when added. In one case
@@ -1197,6 +1239,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
        v.setVisibility(VISIBLE);
    }

    @Override
    public void onAdd(ShortcutInfo item) {
        // If the item was dropped onto this open folder, we have done the work associated
        // with adding the item to the folder, as indicated by mSuppressOnAdd being set
+5 −0
Original line number Diff line number Diff line
@@ -41,6 +41,11 @@ public class FolderInfo extends ItemInfo {
     */
    public static final int FLAG_WORK_FOLDER = 0x00000002;

    /**
     * The multi-page animation has run for this folder
     */
    public static final int FLAG_MULTI_PAGE_ANIMATION = 0x00000004;

    /**
     * Whether this folder has been opened
     */
+32 −6
Original line number Diff line number Diff line
@@ -20,9 +20,11 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.OvershootInterpolator;

import com.android.launcher3.FocusHelper.PagedFolderKeyEventListener;
import com.android.launcher3.PageIndicator.PageMarkerResources;
@@ -44,6 +46,8 @@ public class FolderPagedView extends PagedView {
    private static final int START_VIEW_REORDER_DELAY = 30;
    private static final float VIEW_REORDER_DELAY_FACTOR = 0.9f;

    private static final int PAGE_INDICATOR_ANIMATION_DELAY = 150;

    /**
     * Fraction of the width to scroll when showing the next page hint.
     */
@@ -73,7 +77,7 @@ public class FolderPagedView extends PagedView {
    private FocusIndicatorView mFocusIndicatorView;
    private PagedFolderKeyEventListener mKeyListener;

    private View mPageIndicator;
    private PageIndicator mPageIndicator;

    public FolderPagedView(Context context, AttributeSet attrs) {
        super(context, attrs);
@@ -101,7 +105,7 @@ public class FolderPagedView extends PagedView {
        mFolder = folder;
        mFocusIndicatorView = (FocusIndicatorView) folder.findViewById(R.id.focus_indicator);
        mKeyListener = new PagedFolderKeyEventListener(folder);
        mPageIndicator = folder.findViewById(R.id.folder_page_indicator);
        mPageIndicator = (PageIndicator) folder.findViewById(R.id.folder_page_indicator);
    }

    /**
@@ -338,11 +342,8 @@ public class FolderPagedView extends PagedView {
        setEnableOverscroll(getPageCount() > 1);

        // Update footer
        int indicatorVisibility = mPageIndicator.getVisibility();
        mPageIndicator.setVisibility(getPageCount() > 1 ? View.VISIBLE : View.GONE);
        if (indicatorVisibility != mPageIndicator.getVisibility()) {
            mFolder.updateFooterHeight();
        }
        mFolder.mFolderName.setGravity(getPageCount() > 1 ? Gravity.START : Gravity.CENTER_HORIZONTAL);
    }

    public int getDesiredWidth() {
@@ -628,4 +629,29 @@ public class FolderPagedView extends PagedView {
            }
        }
    }

    public void setMarkerScale(float scale) {
        int count  = mPageIndicator.getChildCount();
        for (int i = 0; i < count; i++) {
            View marker = mPageIndicator.getChildAt(i);
            marker.animate().cancel();
            marker.setScaleX(scale);
            marker.setScaleY(scale);
        }
    }

    public void animateMarkers() {
        int count  = mPageIndicator.getChildCount();
        OvershootInterpolator interpolator = new OvershootInterpolator(4);
        for (int i = 0; i < count; i++) {
            mPageIndicator.getChildAt(i).animate().scaleX(1).scaleY(1)
                .setInterpolator(interpolator)
                .setDuration(Folder.FOOTER_ANIMATION_DURATION)
                .setStartDelay(PAGE_INDICATOR_ANIMATION_DELAY * i);
        }
    }

    public int itemsPerPage() {
        return mMaxItemsPerPage;
    }
}