summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/Folder.java
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2013-06-06 21:27:03 -0700
committerAdam Cohen <adamcohen@google.com>2013-06-06 21:28:57 -0700
commitf0f4eda31841f41d892bf18847c1acdc45d2cd64 (patch)
tree591b09ebbd03d34bf8a60e99cf60c4f5a32f9620 /src/com/android/launcher3/Folder.java
parente441bbc7d2baee03e96897b80f55db5ce2aa7e1f (diff)
downloadandroid_packages_apps_Trebuchet-f0f4eda31841f41d892bf18847c1acdc45d2cd64.tar.gz
android_packages_apps_Trebuchet-f0f4eda31841f41d892bf18847c1acdc45d2cd64.tar.bz2
android_packages_apps_Trebuchet-f0f4eda31841f41d892bf18847c1acdc45d2cd64.zip
Making folders scrollable
Change-Id: Id6c9ec62acc6d86dc627d20abad3e2d92010f539
Diffstat (limited to 'src/com/android/launcher3/Folder.java')
-rw-r--r--src/com/android/launcher3/Folder.java161
1 files changed, 142 insertions, 19 deletions
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index a7b5c5c54..347a1d428 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -20,6 +20,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
+import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.PointF;
@@ -42,6 +43,7 @@ import android.view.accessibility.AccessibilityManager;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout;
+import android.widget.ScrollView;
import android.widget.TextView;
import com.android.launcher3.R;
@@ -70,15 +72,20 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
private int mExpandDuration;
protected CellLayout mContent;
+ private ScrollView mScrollView;
private final LayoutInflater mInflater;
private final IconCache mIconCache;
private int mState = STATE_NONE;
private static final int REORDER_ANIMATION_DURATION = 230;
+ private static final int REORDER_DELAY = 250;
private static final int ON_EXIT_CLOSE_DELAY = 800;
private boolean mRearrangeOnClose = false;
private FolderIcon mFolderIcon;
private int mMaxCountX;
private int mMaxCountY;
+ private int mMaxVisibleX;
+ private int mMaxVisibleY;
+ private int mMaxContentAreaHeight = 0;
private int mMaxNumItems;
private ArrayList<View> mItemsInReadingOrder = new ArrayList<View>();
private Drawable mIconDrawable;
@@ -101,12 +108,21 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
private float mFolderIconPivotX;
private float mFolderIconPivotY;
+ private static final int SCROLL_CUT_OFF_AMOUNT = 60;
+ private static final int SCROLL_BAND_HEIGHT = 110;
+
private boolean mIsEditingName = false;
private InputMethodManager mInputMethodManager;
private static String sDefaultFolderName;
private static String sHintText;
+ private int DRAG_MODE_NONE = 0;
+ private int DRAG_MODE_REORDER = 1;
+ private int DRAG_MODE_SCROLL_UP = 2;
+ private int DRAG_MODE_SCROLL_DOWN = 3;
+ private int mDragMode = DRAG_MODE_NONE;
+
private boolean mDestroyed;
/**
@@ -122,13 +138,33 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mIconCache = ((LauncherApplication)context.getApplicationContext()).getIconCache();
Resources res = getResources();
- mMaxCountX = res.getInteger(R.integer.folder_max_count_x);
- mMaxCountY = res.getInteger(R.integer.folder_max_count_y);
+ mMaxCountX = mMaxVisibleX = res.getInteger(R.integer.folder_max_count_x);
+ mMaxCountY = mMaxVisibleY = res.getInteger(R.integer.folder_max_count_y);
mMaxNumItems = res.getInteger(R.integer.folder_max_num_items);
- if (mMaxCountX < 0 || mMaxCountY < 0 || mMaxNumItems < 0) {
- mMaxCountX = LauncherModel.getCellCountX();
- mMaxCountY = LauncherModel.getCellCountY();
+
+ if (mMaxCountY == -1) {
+ // -2 indicates unlimited
+ mMaxCountY = Integer.MAX_VALUE;
+ mMaxVisibleX = LauncherModel.getCellCountX() + 1;
+ }
+ if (mMaxNumItems == -1) {
+ // -2 indicates unlimited
+ mMaxNumItems = Integer.MAX_VALUE;
+ mMaxVisibleY = LauncherModel.getCellCountY() + 1;
+ }
+ if (mMaxCountX == 0) {
+ mMaxCountX = mMaxVisibleX = LauncherModel.getCellCountX();
+ mMaxVisibleX++;
+ }
+ if (mMaxCountY == 0) {
+ mMaxCountY = mMaxVisibleY = LauncherModel.getCellCountY();
+ mMaxVisibleY++;
+ }
+ if (mMaxNumItems == 0) {
mMaxNumItems = mMaxCountX * mMaxCountY;
+ if (mMaxNumItems < 0) {
+ mMaxNumItems = Integer.MAX_VALUE;
+ }
}
mInputMethodManager = (InputMethodManager)
@@ -152,7 +188,13 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
@Override
protected void onFinishInflate() {
super.onFinishInflate();
+ mScrollView = (ScrollView) findViewById(R.id.scroll_view);
mContent = (CellLayout) findViewById(R.id.folder_content);
+
+ // Beyond this height, the area scrolls
+ mContent.setGridSize(mMaxVisibleX, mMaxVisibleY);
+ mMaxContentAreaHeight = mContent.getDesiredHeight() - SCROLL_CUT_OFF_AMOUNT;
+
mContent.setGridSize(0, 0);
mContent.getShortcutsAndWidgets().setMotionEventSplittingEnabled(false);
mContent.setInvertIfRtl(true);
@@ -617,19 +659,72 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
}
public void onDragOver(DragObject d) {
+ int scrollOffset = mScrollView.getScrollY();
+
float[] r = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset, d.dragView, null);
- mTargetCell = mContent.findNearestArea((int) r[0], (int) r[1], 1, 1, mTargetCell);
+ r[0] -= getPaddingLeft();
+ r[1] -= getPaddingTop();
+
+ mTargetCell = mContent.findNearestArea((int) r[0], (int) r[1] + scrollOffset,
+ 1, 1, mTargetCell);
if (isLayoutRtl()) {
mTargetCell[0] = mContent.getCountX() - mTargetCell[0] - 1;
}
- if (mTargetCell[0] != mPreviousTargetCell[0] || mTargetCell[1] != mPreviousTargetCell[1]) {
+ if (r[1] < SCROLL_BAND_HEIGHT && mScrollView.getScrollY() > 0) {
+ // Scroll up
+ if (mDragMode != DRAG_MODE_SCROLL_UP) {
+ mDragMode = DRAG_MODE_SCROLL_UP;
+ scrollUp();
+ }
+ mReorderAlarm.cancelAlarm();
+ } else if (r[1] > (getFolderHeight() - SCROLL_BAND_HEIGHT) && mScrollView.getScrollY() <
+ (mContent.getMeasuredHeight() - mScrollView.getMeasuredHeight())) {
+ if (mDragMode != DRAG_MODE_SCROLL_DOWN) {
+ mDragMode = DRAG_MODE_SCROLL_DOWN;
+ scrollDown();
+ }
+ mReorderAlarm.cancelAlarm();
+ } else if (mTargetCell[0] != mPreviousTargetCell[0] || mTargetCell[1] != mPreviousTargetCell[1]) {
mReorderAlarm.cancelAlarm();
mReorderAlarm.setOnAlarmListener(mReorderAlarmListener);
- mReorderAlarm.setAlarm(150);
+ mReorderAlarm.setAlarm(REORDER_DELAY);
mPreviousTargetCell[0] = mTargetCell[0];
mPreviousTargetCell[1] = mTargetCell[1];
+ mDragMode = DRAG_MODE_REORDER;
+ } else {
+ mDragMode = DRAG_MODE_NONE;
+ }
+ }
+
+ Runnable mScrollUpRunnable = new Runnable() {
+ @Override
+ public void run() {
+ scrollUp();
+ }
+ };
+
+ Runnable mScrollDownRunnable = new Runnable() {
+ @Override
+ public void run() {
+ scrollDown();
+ }
+ };
+
+ private void scrollUp() {
+ if (mDragMode == DRAG_MODE_SCROLL_UP) {
+ mScrollView.setScrollY(mScrollView.getScrollY() - 7);
+ invalidate();
+ post(mScrollUpRunnable);
+ }
+ }
+
+ private void scrollDown() {
+ if (mDragMode == DRAG_MODE_SCROLL_DOWN) {
+ mScrollView.setScrollY(mScrollView.getScrollY() + 7);
+ invalidate();
+ post(mScrollDownRunnable);
}
}
@@ -681,6 +776,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mOnExitAlarm.setAlarm(ON_EXIT_CLOSE_DELAY);
}
mReorderAlarm.cancelAlarm();
+ mDragMode = DRAG_MODE_NONE;
}
public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete,
@@ -704,7 +800,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
completeDragExit();
}
}
-
mDeleteFolderOnDropCompleted = false;
mDragInProgress = false;
mItemAddedBackToSelfViaIcon = false;
@@ -714,7 +809,7 @@ 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.
- updateItemLocationsInDatabase();
+ updateItemLocationsInDatabaseBatch();
}
@Override
@@ -741,6 +836,18 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
}
}
+ private void updateItemLocationsInDatabaseBatch() {
+ ArrayList<View> list = getItemsInReadingOrder();
+ ArrayList<ItemInfo> items = new ArrayList<ItemInfo>();
+ for (int i = 0; i < list.size(); i++) {
+ View v = list.get(i);
+ ItemInfo info = (ItemInfo) v.getTag();
+ items.add(info);
+ }
+
+ LauncherModel.moveItemsInDatabase(mLauncher, items, mInfo.id, 0);
+ }
+
public void notifyDrop() {
if (mDragInProgress) {
mItemAddedBackToSelfViaIcon = true;
@@ -792,8 +899,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
int width = getPaddingLeft() + getPaddingRight() + mContent.getDesiredWidth();
- int height = getPaddingTop() + getPaddingBottom() + mContent.getDesiredHeight()
- + mFolderNameHeight;
+ int height = getFolderHeight();
DragLayer parent = (DragLayer) mLauncher.findViewById(R.id.drag_layer);
float scale = parent.getDescendantRectRelativeToSelf(mFolderIcon, mTempRect);
@@ -862,18 +968,35 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
centerAboutIcon();
}
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int width = getPaddingLeft() + getPaddingRight() + mContent.getDesiredWidth();
- int height = getPaddingTop() + getPaddingBottom() + mContent.getDesiredHeight()
+ private int getFolderHeight() {
+ int contentAreaHeight = mContent.getDesiredHeight();
+ if (contentAreaHeight >= mMaxContentAreaHeight) {
+ // Subtract a bit so the user can see that it's scrollable.
+ contentAreaHeight = mMaxContentAreaHeight;
+ }
+ int height = getPaddingTop() + getPaddingBottom() + contentAreaHeight
+ mFolderNameHeight;
+ return height;
+ }
+
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int contentWidthSpec = MeasureSpec.makeMeasureSpec(mContent.getDesiredWidth(),
+ int contentAreaHeight = mContent.getDesiredHeight();
+ if (contentAreaHeight >= mMaxContentAreaHeight) {
+ // Subtract a bit so the user can see that it's scrollable.
+ contentAreaHeight = mMaxContentAreaHeight;
+ }
+
+ int width = getPaddingLeft() + getPaddingRight() + mContent.getDesiredWidth();
+ int height = getFolderHeight();
+ int contentAreaWidthSpec = MeasureSpec.makeMeasureSpec(mContent.getDesiredWidth(),
MeasureSpec.EXACTLY);
- int contentHeightSpec = MeasureSpec.makeMeasureSpec(mContent.getDesiredHeight(),
+ int contentAreaHeightSpec = MeasureSpec.makeMeasureSpec(contentAreaHeight,
MeasureSpec.EXACTLY);
- mContent.measure(contentWidthSpec, contentHeightSpec);
- mFolderName.measure(contentWidthSpec,
+ mContent.setFixedSize(mContent.getDesiredWidth(), mContent.getDesiredHeight());
+ mScrollView.measure(contentAreaWidthSpec, contentAreaHeightSpec);
+ mFolderName.measure(contentAreaWidthSpec,
MeasureSpec.makeMeasureSpec(mFolderNameHeight, MeasureSpec.EXACTLY));
setMeasuredDimension(width, height);
}