Add the all apps button.
diff --git a/res/drawable-hdpi/all_apps_button.png b/res/drawable-hdpi/all_apps_button.png
new file mode 100644
index 0000000..945bf93
--- /dev/null
+++ b/res/drawable-hdpi/all_apps_button.png
Binary files differ
diff --git a/res/drawable-hdpi/all_apps_button_pow2.png b/res/drawable-hdpi/all_apps_button_pow2.png
new file mode 100644
index 0000000..ab93e94
--- /dev/null
+++ b/res/drawable-hdpi/all_apps_button_pow2.png
Binary files differ
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index d57d3a4..5b5c37c 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -49,21 +49,28 @@
</com.android.launcher2.Workspace>
- <com.android.launcher2.HandleView
- android:id="@+id/all_apps_button"
+ <LinearLayout
+ android:id="@+id/buttons"
android:layout_width="fill_parent"
android:layout_height="56dip"
android:layout_gravity="bottom"
- android:background="@drawable/handle"
+ android:gravity="right"
+ >
- android:focusable="true"
- android:clickable="true"
+ <com.android.launcher2.HandleView
+ android:id="@+id/all_apps_button"
+ android:layout_width="@dimen/button_bar_height"
+ android:layout_height="@dimen/button_bar_height"
- android:scaleType="center"
- android:src="@drawable/handle_icon"
+ android:focusable="true"
+ android:clickable="true"
- launcher:direction="horizontal" />
+ android:scaleType="center"
+ android:src="@drawable/all_apps_button"
+
+ launcher:direction="horizontal" />
+ </LinearLayout>
<com.android.launcher2.DeleteZone
android:id="@+id/delete_zone"
diff --git a/res/raw/rollo.c b/res/raw/rollo.c
index 216d761..f6097cf 100644
--- a/res/raw/rollo.c
+++ b/res/raw/rollo.c
@@ -12,6 +12,9 @@
#define PARAM_BUBBLE_HEIGHT 1
#define PARAM_BUBBLE_BITMAP_WIDTH 2
#define PARAM_BUBBLE_BITMAP_HEIGHT 3
+#define PARAM_SCROLL_HANDLE_ID 4
+#define PARAM_SCROLL_HANDLE_TEX_WIDTH 5
+#define PARAM_SCROLL_HANDLE_TEX_HEIGHT 6
// State ======
#define STATE_ICON_COUNT 0
@@ -26,14 +29,14 @@
#define STATE_FLING_DURATION 6
#define STATE_FLING_END_POS 7
+#define SCROLL_HANDLE_POS 8
+
// Scratch variables ======
#define SCRATCH_ADJUSTED_DECELERATION 0
// Drawing constants, should be parameters ======
#define SCREEN_WIDTH_PX 480
#define SCREEN_HEIGHT 854
-#define COLUMNS_PER_PAGE 4
-#define ROWS_PER_PAGE 4
#define PAGE_PADDING_TOP_PX 80
#define CELL_PADDING_TOP_PX 5
@@ -169,15 +172,15 @@
float iconLabelGutter = ICON_LABEL_GUTTER_PX * densityScale;
float scrollXPx = loadI32(ALLOC_STATE, STATE_SCROLL_X);
- float maxScrollX = -(pageCount-1) * SCREEN_WIDTH_PX;
+ float maxScrollXPx = -(pageCount-1) * SCREEN_WIDTH_PX;
int done = 0;
// Clamp -- because java doesn't know how big the icons are
if (scrollXPx > 0) {
scrollXPx = 0;
}
- if (scrollXPx < maxScrollX) {
- scrollXPx = maxScrollX;
+ if (scrollXPx < maxScrollXPx) {
+ scrollXPx = maxScrollXPx;
}
// If we've been given a velocity, start a fling
@@ -217,8 +220,8 @@
if (endPos > 0) {
endPos = 0;
}
- if (endPos < maxScrollX) {
- endPos = maxScrollX;
+ if (endPos < maxScrollXPx) {
+ endPos = maxScrollXPx;
}
float scrollOnPage = modf(endPos, SCREEN_WIDTH_PX);
int endPage = -endPos/SCREEN_WIDTH_PX;
@@ -279,8 +282,8 @@
if (scrollXPx > 0) {
scrollXPx = 0;
}
- if (scrollXPx < maxScrollX) {
- scrollXPx = maxScrollX;
+ if (scrollXPx < maxScrollXPx) {
+ scrollXPx = maxScrollXPx;
}
storeI32(ALLOC_STATE, STATE_CURRENT_SCROLL_X, scrollXPx);
@@ -290,6 +293,8 @@
storeF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION, 0);
}
+ // Draw the icons ========================================
+ bindProgramVertex(NAMED_PV);
bindProgramFragment(NAMED_PF);
bindProgramFragmentStore(NAMED_PFS);
@@ -307,6 +312,20 @@
draw_page(icon, lastIcon, -VIEW_ANGLE*currentPagePosition);
draw_page(icon+iconsPerPage, lastIcon, (-VIEW_ANGLE*currentPagePosition)+VIEW_ANGLE);
+
+ // Draw the scroll handle ========================================
+ /*
+ bindProgramVertex(NAMED_PVOrtho);
+ bindProgramFragment(NAMED_PFText);
+ bindProgramFragmentStore(NAMED_PFSText);
+
+ bindTexture(NAMED_PFText, 0, loadI32(ALLOC_PARAMS, PARAM_SCROLL_HANDLE_ID));
+ float handleLeft = 40 + (320 * (scrollXPx/(float)(maxScrollXPx)));
+ float handleTop = 680;
+ float handleWidth = loadI32(ALLOC_PARAMS, PARAM_SCROLL_HANDLE_TEX_WIDTH);
+ float handleHeight = loadI32(ALLOC_PARAMS, PARAM_SCROLL_HANDLE_TEX_HEIGHT);
+ drawRect(handleLeft, handleTop, handleLeft+handleWidth, handleTop+handleHeight, 0.0f);
+ */
return !done;
}
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index b802353..e0ca384 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -18,4 +18,5 @@
<dimen name="search_widget_inset">19dip</dimen>
<dimen name="gesture_thumbnail_inset">8dip</dimen>
<dimen name="gesture_thumbnail_size">64dip</dimen>
+ <dimen name="button_bar_height">56dip</dimen>
</resources>
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index cd66b4f..d8ac50b 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -66,11 +66,25 @@
private ArrayList<ApplicationInfo> mAllAppsList;
private ViewConfiguration mConfig;
+ private int mPageCount;
private VelocityTracker mVelocity;
private int mLastScrollX;
private int mLastMotionX;
private ApplicationsAdapter mAdapter;
+ private TouchHandler mTouchHandler;
+ private int mScrollHandleTop;
+ class Defines {
+ public static final int ALLOC_PARAMS = 0;
+ public static final int ALLOC_STATE = 1;
+ public static final int ALLOC_SCRATCH = 2;
+ public static final int ALLOC_ICON_IDS = 3;
+ public static final int ALLOC_LABEL_IDS = 4;
+
+ public static final int COLUMNS_PER_PAGE = 4;
+ public static final int ROWS_PER_PAGE = 4;
+
+ }
public AllAppsView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -103,6 +117,10 @@
if (mAllAppsList != null) {
mRollo.setApps(mAllAppsList);
}
+
+ Resources res = getContext().getResources();
+ int barHeight = (int)res.getDimension(R.dimen.button_bar_height);
+ mScrollHandleTop = h - barHeight;
}
@Override
@@ -115,44 +133,89 @@
@Override
public boolean onTouchEvent(MotionEvent ev)
{
- int x = (int)ev.getX();
- int deltaX;
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mLastMotionX = x;
- mRollo.mState.read();
- mRollo.mState.scrollX = mLastScrollX = mRollo.mState.currentScrollX;
- mRollo.mState.flingVelocityX = 0;
- mRollo.mState.adjustedDeceleration = 0;
- mRollo.mState.save();
- mVelocity = VelocityTracker.obtain();
- mVelocity.addMovement(ev);
- break;
- case MotionEvent.ACTION_MOVE:
- case MotionEvent.ACTION_OUTSIDE:
- deltaX = x - mLastMotionX;
- mVelocity.addMovement(ev);
- mRollo.mState.currentScrollX = mLastScrollX;
- mLastScrollX += deltaX;
- mRollo.mState.scrollX = mLastScrollX;
- mRollo.mState.save();
- mLastMotionX = x;
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mVelocity.computeCurrentVelocity(1000 /* px/sec */,
- mConfig.getScaledMaximumFlingVelocity());
- mRollo.mState.flingTimeMs = (int)SystemClock.uptimeMillis(); // TODO: use long
- mRollo.mState.flingVelocityX = (int)mVelocity.getXVelocity();
- mRollo.mState.save();
- mLastMotionX = -10000;
- mVelocity.recycle();
- mVelocity = null;
- break;
+ mTouchHandler = mFlingHandler;
+ /*
+ int action = ev.getAction();
+ if (action == MotionEvent.ACTION_DOWN) {
+ if (ev.getY() > mScrollHandleTop) {
+ mTouchHandler = mScrollHandler;
+ } else {
+ mTouchHandler = mFlingHandler;
+ }
}
- return true;
+ */
+ return mTouchHandler.onTouchEvent(ev);
}
+ private abstract class TouchHandler {
+ abstract boolean onTouchEvent(MotionEvent ev);
+ };
+
+ private TouchHandler mFlingHandler = new TouchHandler() {
+ @Override
+ public boolean onTouchEvent(MotionEvent ev)
+ {
+ int x = (int)ev.getX();
+ int deltaX;
+ switch (ev.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mLastMotionX = x;
+ mRollo.mState.read();
+ mRollo.mState.scrollX = mLastScrollX = mRollo.mState.currentScrollX;
+ mRollo.mState.flingVelocityX = 0;
+ mRollo.mState.adjustedDeceleration = 0;
+ mRollo.mState.save();
+ mVelocity = VelocityTracker.obtain();
+ mVelocity.addMovement(ev);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ case MotionEvent.ACTION_OUTSIDE:
+ deltaX = x - mLastMotionX;
+ mVelocity.addMovement(ev);
+ mRollo.mState.currentScrollX = mLastScrollX;
+ mLastScrollX += deltaX;
+ mRollo.mState.scrollX = mLastScrollX;
+ mRollo.mState.save();
+ mLastMotionX = x;
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mVelocity.computeCurrentVelocity(1000 /* px/sec */,
+ mConfig.getScaledMaximumFlingVelocity());
+ mRollo.mState.flingTimeMs = (int)SystemClock.uptimeMillis(); // TODO: use long
+ mRollo.mState.flingVelocityX = (int)mVelocity.getXVelocity();
+ mRollo.mState.save();
+ mLastMotionX = -10000;
+ mVelocity.recycle();
+ mVelocity = null;
+ break;
+ }
+ return true;
+ }
+ };
+
+ /*
+ private TouchHandler mScrollHandler = new TouchHandler() {
+ @Override
+ public boolean onTouchEvent(MotionEvent ev)
+ {
+ int x = (int)ev.getX();
+ int w = getWidth();
+
+ float percent = x / (float)w;
+
+ mRollo.mState.read();
+
+ mRollo.mState.scrollX = mLastScrollX = -(int)(mPageCount * w * percent);
+ mRollo.mState.flingVelocityX = 0;
+ mRollo.mState.adjustedDeceleration = 0;
+ mRollo.mState.save();
+
+ return true;
+ }
+ };
+ */
+
@Override
public boolean onTrackballEvent(MotionEvent ev)
{
@@ -177,6 +240,16 @@
if (mRollo != null) {
mRollo.setApps(list);
}
+ mPageCount = countPages(list.size());
+ }
+
+ private static int countPages(int iconCount) {
+ int iconsPerPage = Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE;
+ int pages = iconCount / iconsPerPage;
+ if (pages*iconsPerPage != iconCount) {
+ pages++;
+ }
+ return pages;
}
public class RolloRS {
@@ -200,6 +273,8 @@
private ProgramVertex mPVOrtho;
private ProgramVertex.MatrixAllocation mPVOrthoAlloc;
+ private Allocation mScrollHandle;
+
private Allocation[] mIcons;
private int[] mAllocIconIDBuf;
private Allocation mAllocIconID;
@@ -214,14 +289,6 @@
Params mParams;
State mState;
- class Defines {
- public static final int ALLOC_PARAMS = 0;
- public static final int ALLOC_STATE = 1;
- public static final int ALLOC_SCRATCH = 2;
- public static final int ALLOC_ICON_IDS = 3;
- public static final int ALLOC_LABEL_IDS = 4;
- }
-
class Params extends IntAllocation {
Params(RenderScript rs) {
super(rs);
@@ -230,6 +297,9 @@
@AllocationIndex(1) public int bubbleHeight;
@AllocationIndex(2) public int bubbleBitmapWidth;
@AllocationIndex(3) public int bubbleBitmapHeight;
+ @AllocationIndex(4) public int scrollHandleId;
+ @AllocationIndex(5) public int scrollHandleTextureWidth;
+ @AllocationIndex(6) public int scrollHandleTextureHeight;
}
class State extends IntAllocation {
@@ -244,6 +314,7 @@
@AllocationIndex(5) public int currentScrollX;
@AllocationIndex(6) public int flingDuration;
@AllocationIndex(7) public int flingEndPos;
+ @AllocationIndex(8) public int scrollHandlePos;
}
public RolloRS() {
@@ -338,19 +409,21 @@
mParams.bubbleBitmapWidth = bubble.getBitmapWidth();
mParams.bubbleBitmapHeight = bubble.getBitmapHeight();
+ mScrollHandle = Allocation.createFromBitmapResource(mRS, mRes,
+ R.drawable.all_apps_button_pow2, Element.RGBA_8888, true);
+ mScrollHandle.uploadToTexture(0);
+ mParams.scrollHandleId = mScrollHandle.getID();
+ Log.d(TAG, "mParams.scrollHandleId=" + mParams.scrollHandleId);
+ mParams.scrollHandleTextureWidth = 128;
+ mParams.scrollHandleTextureHeight = 128;
+ mState.scrollHandlePos = 0;
+
mParams.save();
mState.save();
setApps(null);
}
- Allocation makeTextBitmap(Utilities.BubbleText bubble, String label) {
- Bitmap b = bubble.createTextBitmap(label);
- Allocation a = Allocation.createFromBitmap(mRS, b, Element.RGBA_8888, true);
- b.recycle();
- return a;
- }
-
private void initRs() {
ScriptC.Builder sb = new ScriptC.Builder(mRS);
sb.setScript(mRes, R.raw.rollo);
@@ -415,4 +488,3 @@
}
-
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 40f4b39..e1b213e 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -528,8 +528,10 @@
mHandleView = (HandleView) findViewById(R.id.all_apps_button);
mHandleView.setLauncher(this);
mHandleView.setOnClickListener(this);
+ /* TODO
TransitionDrawable handleIcon = (TransitionDrawable) mHandleView.getDrawable();
- handleIcon.setCrossFadeEnabled(true);
+ handleIocon.setCrossFadeEnabled(true);
+ */
workspace.setOnLongClickListener(this);
workspace.setDragController(dragController);
diff --git a/src/com/android/launcher2/Utilities.java b/src/com/android/launcher2/Utilities.java
index 0c5dbbd..ca12a4d 100644
--- a/src/com/android/launcher2/Utilities.java
+++ b/src/com/android/launcher2/Utilities.java
@@ -274,6 +274,7 @@
textPaint.setTextSize(13*scale);
textPaint.setColor(0xffffffff);
textPaint.setAntiAlias(true);
+ //textPaint.setShadowLayer(8, 0, 0, 0xff000000);
float ascent = -textPaint.ascent();
float descent = textPaint.descent();