summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2/PagedView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher2/PagedView.java')
-rw-r--r--src/com/android/launcher2/PagedView.java71
1 files changed, 67 insertions, 4 deletions
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 5052a59..8e0203b 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -19,7 +19,6 @@ package com.android.launcher2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
-
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -27,6 +26,8 @@ import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
+import android.util.Log;
+import android.view.ActionMode;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
@@ -36,6 +37,7 @@ import android.view.ViewParent;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
+import android.widget.Checkable;
import android.widget.Scroller;
import com.android.launcher.R;
@@ -51,6 +53,7 @@ public abstract class PagedView extends ViewGroup {
// the min drag distance for a fling to register, to prevent random page shifts
private static final int MIN_LENGTH_FOR_FLING = 50;
+ private static final int PAGE_SNAP_ANIMATION_DURATION = 1000;
protected static final float NANOTIME_DIV = 1000000000.0f;
// the velocity at which a fling gesture will cause us to snap to the next page
@@ -96,6 +99,14 @@ public abstract class PagedView extends ViewGroup {
private ArrayList<Boolean> mDirtyPageContent;
private boolean mDirtyPageAlpha;
+ // choice modes
+ protected static final int CHOICE_MODE_NONE = 0;
+ protected static final int CHOICE_MODE_SINGLE = 1;
+ // Multiple selection mode is not supported by all Launcher actions atm
+ protected static final int CHOICE_MODE_MULTIPLE = 2;
+ private int mChoiceMode;
+ private ActionMode mActionMode;
+
protected PagedViewIconCache mPageViewIconCache;
// If true, syncPages and syncPageItems will be called to refresh pages
@@ -153,6 +164,7 @@ public abstract class PagedView extends ViewGroup {
public PagedView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
+ mChoiceMode = CHOICE_MODE_NONE;
setHapticFeedbackEnabled(false);
init();
@@ -530,7 +542,14 @@ public abstract class PagedView extends ViewGroup {
* otherwise don't. mScroller.isFinished should be false when
* being flinged.
*/
- mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;
+ final int xDist = (mScroller.getFinalX() - mScroller.getCurrX());
+ final boolean finishedScrolling = (mScroller.isFinished() || xDist < mTouchSlop);
+ if (finishedScrolling) {
+ mTouchState = TOUCH_STATE_REST;
+ mScroller.abortAnimation();
+ } else {
+ mTouchState = TOUCH_STATE_SCROLLING;
+ }
// check if this can be the beginning of a tap on the side of the pages
// to scroll the current page
@@ -819,7 +838,7 @@ public abstract class PagedView extends ViewGroup {
minDistanceFromScreenCenterIndex = i;
}
}
- snapToPage(minDistanceFromScreenCenterIndex, 1000);
+ snapToPage(minDistanceFromScreenCenterIndex, PAGE_SNAP_ANIMATION_DURATION);
}
protected void snapToPageWithVelocity(int whichPage, int velocity) {
@@ -829,7 +848,7 @@ public abstract class PagedView extends ViewGroup {
}
protected void snapToPage(int whichPage) {
- snapToPage(whichPage, 1000);
+ snapToPage(whichPage, PAGE_SNAP_ANIMATION_DURATION);
}
protected void snapToPage(int whichPage, int duration) {
@@ -982,6 +1001,50 @@ public abstract class PagedView extends ViewGroup {
}
}
+ protected void startChoiceMode(int mode, ActionMode.Callback callback) {
+ // StartActionMode may call through toendChoiceMode, so we should do this first
+ mActionMode = startActionMode(callback);
+ mChoiceMode = mode;
+ }
+
+ protected void endChoiceMode() {
+ if (!isChoiceMode(CHOICE_MODE_NONE)) {
+ mActionMode.finish();
+ mActionMode = null;
+ mChoiceMode = CHOICE_MODE_NONE;
+ resetCheckedGrandchildren();
+ }
+ }
+
+ protected boolean isChoiceMode(int mode) {
+ return mChoiceMode == mode;
+ }
+
+ protected ArrayList<Checkable> getCheckedGrandchildren() {
+ ArrayList<Checkable> checked = new ArrayList<Checkable>();
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; ++i) {
+ final PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(i);
+ final int grandChildCount = layout.getChildCount();
+ for (int j = 0; j < grandChildCount; ++j) {
+ final View v = layout.getChildAt(j);
+ if (v instanceof Checkable) {
+ checked.add((Checkable) v);
+ }
+ }
+ }
+ return checked;
+ }
+
+ protected void resetCheckedGrandchildren() {
+ // loop through children, and set all of their children to _not_ be checked
+ final ArrayList<Checkable> checked = getCheckedGrandchildren();
+ for (int i = 0; i < checked.size(); ++i) {
+ final Checkable c = checked.get(i);
+ c.setChecked(false);
+ }
+ }
+
/**
* This method is called ONLY to synchronize the number of pages that the paged view has.
* To actually fill the pages with information, implement syncPageItems() below. It is