Loading res/layout/user_folder.xml +12 −9 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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 src/com/android/launcher3/Folder.java +46 −3 Original line number Diff line number Diff line Loading @@ -90,6 +90,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(); Loading Loading @@ -211,10 +213,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; Loading Loading @@ -547,6 +546,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. Loading Loading @@ -823,6 +852,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 Loading Loading @@ -1200,6 +1237,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 Loading @@ -1214,6 +1256,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 Loading src/com/android/launcher3/FolderInfo.java +5 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading src/com/android/launcher3/FolderPagedView.java +32 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. */ Loading @@ -70,7 +74,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); Loading @@ -93,7 +97,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); } /** Loading Loading @@ -330,11 +334,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() { Loading Loading @@ -624,4 +625,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; } } Loading
res/layout/user_folder.xml +12 −9 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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
src/com/android/launcher3/Folder.java +46 −3 Original line number Diff line number Diff line Loading @@ -90,6 +90,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(); Loading Loading @@ -211,10 +213,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; Loading Loading @@ -547,6 +546,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. Loading Loading @@ -823,6 +852,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 Loading Loading @@ -1200,6 +1237,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 Loading @@ -1214,6 +1256,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 Loading
src/com/android/launcher3/FolderInfo.java +5 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading
src/com/android/launcher3/FolderPagedView.java +32 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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. */ Loading @@ -70,7 +74,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); Loading @@ -93,7 +97,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); } /** Loading Loading @@ -330,11 +334,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() { Loading Loading @@ -624,4 +625,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; } }