diff options
author | Jason Sams <rjsams@android.com> | 2010-03-11 12:38:48 -0800 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2010-03-11 12:41:55 -0800 |
commit | dd8cd8b41481957f6ef3c21a40e96f0732f95ca3 (patch) | |
tree | cbeac4b6b75050130ea4a7ef157b2f7696dfebc9 /src/com | |
parent | e74daedc3b41d958315f7d5bf69deb232ca89468 (diff) | |
download | android_packages_apps_Trebuchet-dd8cd8b41481957f6ef3c21a40e96f0732f95ca3.tar.gz android_packages_apps_Trebuchet-dd8cd8b41481957f6ef3c21a40e96f0732f95ca3.tar.bz2 android_packages_apps_Trebuchet-dd8cd8b41481957f6ef3c21a40e96f0732f95ca3.zip |
Unbind root script around load activities to prevent commands from being delayed due to swap buffers.
Change-Id: I9720fbe936d3cd336ca39235d0a1bba9e10d137a
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/launcher2/AllApps3D.java | 388 |
1 files changed, 200 insertions, 188 deletions
diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java index e59fa6cb1..d97788568 100644 --- a/src/com/android/launcher2/AllApps3D.java +++ b/src/com/android/launcher2/AllApps3D.java @@ -88,7 +88,7 @@ public class AllApps3D extends RSSurfaceView private static RenderScriptGL mRS; private static RolloRS mRollo; - + /** * True when we are using arrow keys or trackball to drive navigation */ @@ -100,21 +100,21 @@ public class AllApps3D extends RSSurfaceView * One of the SELECTION_ constants. */ private int mLastSelection; - + /** * Used to keep track of the selection when AllAppsView loses window focus */ private int mLastSelectedIcon; - + private VelocityTracker mVelocityTracker; private int mTouchTracking; private int mMotionDownRawX; private int mMotionDownRawY; private int mDownIconIndex = -1; private int mCurrentIconIndex = -1; - + private boolean mShouldGainFocus; - + private boolean mHaveSurface = false; private boolean mZoomDirty = false; private boolean mAnimateNextZoom; @@ -123,7 +123,7 @@ public class AllApps3D extends RSSurfaceView private float mPosX; private float mVelocity; private AAMessage mMessageProc; - + private int mColumnsPerPage; private int mRowsPerPage; private boolean mSurrendered; @@ -135,22 +135,22 @@ public class AllApps3D extends RSSurfaceView public static final int ALLOC_ICON_IDS = 3; public static final int ALLOC_LABEL_IDS = 4; public static final int ALLOC_VP_CONSTANTS = 5; - + public static final int COLUMNS_PER_PAGE_PORTRAIT = 4; public static final int ROWS_PER_PAGE_PORTRAIT = 4; - + public static final int COLUMNS_PER_PAGE_LANDSCAPE = 6; public static final int ROWS_PER_PAGE_LANDSCAPE = 3; - + public static final int ICON_WIDTH_PX = 64; public static final int ICON_TEXTURE_WIDTH_PX = 74; public static final int SELECTION_TEXTURE_WIDTH_PX = 74 + 20; - + public static final int ICON_HEIGHT_PX = 64; public static final int ICON_TEXTURE_HEIGHT_PX = 74; public static final int SELECTION_TEXTURE_HEIGHT_PX = 74 + 20; } - + public AllApps3D(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); @@ -159,12 +159,12 @@ public class AllApps3D extends RSSurfaceView final ViewConfiguration config = ViewConfiguration.get(context); mSlop = config.getScaledTouchSlop(); mMaxFlingVelocity = config.getScaledMaximumFlingVelocity(); - + setOnClickListener(this); setOnLongClickListener(this); setZOrderOnTop(true); getHolder().setFormat(PixelFormat.TRANSLUCENT); - + if (mRS == null) { mRS = createRenderScript(true); } else { @@ -184,12 +184,12 @@ public class AllApps3D extends RSSurfaceView mRollo.mInitialize = true; } } - + @SuppressWarnings({"UnusedDeclaration"}) public AllApps3D(Context context, AttributeSet attrs, int defStyle) { this(context, attrs); } - + public void surrender() { mRS.contextSetSurface(0, 0, null); mRS.mMessageCallback = null; @@ -207,7 +207,7 @@ public class AllApps3D extends RSSurfaceView mRS = null; } } - + /** * If you have an attached click listener, View always plays the click sound!?!? * Deal with sound effects by hand. @@ -218,11 +218,11 @@ public class AllApps3D extends RSSurfaceView playSoundEffect(sound); setSoundEffectsEnabled(old); } - + public void setLauncher(Launcher launcher) { mLauncher = launcher; } - + @Override public void surfaceDestroyed(SurfaceHolder holder) { super.surfaceDestroyed(holder); @@ -235,17 +235,17 @@ public class AllApps3D extends RSSurfaceView mZoomDirty = true; mHaveSurface = false; } - + @Override public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { //long startTime = SystemClock.uptimeMillis(); - + super.surfaceChanged(holder, format, w, h); - + if (mSurrendered) return; - + mHaveSurface = true; - + if (mRollo == null) { mRollo = new RolloRS(this); mRollo.init(getResources(), w, h); @@ -261,14 +261,14 @@ public class AllApps3D extends RSSurfaceView mRollo.initTouchState(w, h); mRollo.mInitialize = false; } - + mRollo.dirtyCheck(); mRollo.resize(w, h); - + if (mRS != null) { mRS.mMessageCallback = mMessageProc = new AAMessage(); } - + if (mRollo.mUniformAlloc != null) { float tf[] = new float[] {72.f, 72.f, 120.f, 120.f, 0.f, 0.f, @@ -281,20 +281,20 @@ public class AllApps3D extends RSSurfaceView tf[10] = -((float)w / 2) - 0.25f; tf[11] = -((float)h / 2) - 0.25f; } - + mRollo.mUniformAlloc.data(tf); } - + //long endTime = SystemClock.uptimeMillis(); //Log.d(TAG, "surfaceChanged took " + (endTime-startTime) + "ms"); } - + @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (mSurrendered) return; - + if (mArrowNavigation) { if (!hasWindowFocus) { // Clear selection when we lose window focus @@ -315,7 +315,7 @@ public class AllApps3D extends RSSurfaceView (mColumnsPerPage * mRowsPerPage)) { selection = firstIcon; } - + // Select the first icon when we gain window focus mRollo.selectIcon(selection, SELECTED_FOCUSED); mRollo.mState.save(); @@ -327,15 +327,15 @@ public class AllApps3D extends RSSurfaceView } } } - + @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); - + if (!isVisible() || mSurrendered) { return; } - + if (gainFocus) { if (mRollo != null) { gainFocus(); @@ -356,7 +356,7 @@ public class AllApps3D extends RSSurfaceView } } } - + private void gainFocus() { if (!mArrowNavigation && mRollo.mState.iconCount > 0) { // Select the first icon when we gain keyboard focus @@ -366,17 +366,17 @@ public class AllApps3D extends RSSurfaceView mRollo.mState.save(); } } - + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - + boolean handled = false; - + if (!isVisible()) { return false; } final int iconCount = mRollo.mState.iconCount; - + if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { if (mArrowNavigation) { if (mLastSelection == SELECTION_HOME) { @@ -392,22 +392,22 @@ public class AllApps3D extends RSSurfaceView } } } - + if (iconCount > 0) { mArrowNavigation = true; - + int currentSelection = mRollo.mState.selectedIconIndex; int currentTopRow = Math.round(mPosX); - + // The column of the current selection, in the range 0..COLUMNS_PER_PAGE_PORTRAIT-1 final int currentPageCol = currentSelection % mColumnsPerPage; - + // The row of the current selection, in the range 0..ROWS_PER_PAGE_PORTRAIT-1 final int currentPageRow = (currentSelection - (currentTopRow* mColumnsPerPage)) / mRowsPerPage; - + int newSelection = currentSelection; - + switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: if (mLastSelection == SELECTION_HOME) { @@ -440,7 +440,7 @@ public class AllApps3D extends RSSurfaceView } handled = true; break; - + case KeyEvent.KEYCODE_DPAD_DOWN: { final int rowCount = iconCount / mColumnsPerPage + (iconCount % mColumnsPerPage == 0 ? 0 : 1); @@ -496,25 +496,25 @@ public class AllApps3D extends RSSurfaceView } return handled; } - + @Override public boolean onTouchEvent(MotionEvent ev) { mArrowNavigation = false; - + if (!isVisible()) { return true; } - + if (mLocks != 0) { return true; } - + super.onTouchEvent(ev); - + int x = (int)ev.getX(); int y = (int)ev.getY(); - + final boolean isPortrait = getWidth() < getHeight(); int action = ev.getAction(); switch (action) { @@ -527,13 +527,13 @@ public class AllApps3D extends RSSurfaceView mCurrentIconIndex = -1; } else { mTouchTracking = TRACKING_FLING; - + mMotionDownRawX = (int)ev.getRawX(); mMotionDownRawY = (int)ev.getRawY(); - + mRollo.mState.newPositionX = ev.getRawY() / getHeight(); mRollo.mState.newTouchDown = 1; - + if (!mRollo.checkClickOK()) { mRollo.clearSelectedIcon(); } else { @@ -563,7 +563,7 @@ public class AllApps3D extends RSSurfaceView int rawY = (int)ev.getRawY(); int slop; slop = Math.abs(rawY - mMotionDownRawY); - + if (!mStartedScrolling && slop < mSlop) { // don't update anything so when we do start scrolling // below, we get the right delta. @@ -582,7 +582,7 @@ public class AllApps3D extends RSSurfaceView mRollo.mState.newPositionX = ev.getRawY() / getHeight(); mRollo.mState.newTouchDown = 1; mRollo.move(); - + mStartedScrolling = true; mRollo.clearSelectedIcon(); mVelocityTracker.addMovement(ev); @@ -606,13 +606,13 @@ public class AllApps3D extends RSSurfaceView } else if (mTouchTracking == TRACKING_FLING) { mRollo.mState.newTouchDown = 0; mRollo.mState.newPositionX = ev.getRawY() / getHeight(); - + mVelocityTracker.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity); mRollo.mState.flingVelocity = mVelocityTracker.getYVelocity() / getHeight(); mRollo.clearSelectedIcon(); mRollo.mState.save(); mRollo.fling(); - + if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; @@ -621,10 +621,10 @@ public class AllApps3D extends RSSurfaceView mTouchTracking = TRACKING_NONE; break; } - + return true; } - + public void onClick(View v) { if (mLocks != 0 || !isVisible()) { return; @@ -636,7 +636,7 @@ public class AllApps3D extends RSSurfaceView mLauncher.startActivitySafely(app.intent); } } - + public boolean onLongClick(View v) { if (mLocks != 0 || !isVisible()) { return true; @@ -644,23 +644,23 @@ public class AllApps3D extends RSSurfaceView if (mRollo.checkClickOK() && mCurrentIconIndex == mDownIconIndex && mCurrentIconIndex >= 0 && mCurrentIconIndex < mAllAppsList.size()) { ApplicationInfo app = mAllAppsList.get(mCurrentIconIndex); - + Bitmap bmp = app.iconBitmap; final int w = bmp.getWidth(); final int h = bmp.getHeight(); - + // We don't really have an accurate location to use. This will do. int screenX = mMotionDownRawX - (w / 2); int screenY = mMotionDownRawY - h; - + mDragController.startDrag(bmp, screenX, screenY, 0, 0, w, h, this, app, DragController.DRAG_ACTION_COPY); - + mLauncher.closeAllApps(true); } return true; } - + @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SELECTED) { @@ -697,14 +697,14 @@ public class AllApps3D extends RSSurfaceView } return false; } - + public void setDragController(DragController dragger) { mDragController = dragger; } - + public void onDropCompleted(View target, boolean success) { } - + /** * Zoom to the specifed level. * @@ -723,15 +723,15 @@ public class AllApps3D extends RSSurfaceView mRollo.setZoom(zoom, animate); } } - + public boolean isVisible() { return mZoom > 0.001f; } - + public boolean isOpaque() { return mZoom > 0.999f; } - + public void setApps(ArrayList<ApplicationInfo> list) { if (mRS == null) { // We've been removed from the window. Don't bother with all this. @@ -752,14 +752,14 @@ public class AllApps3D extends RSSurfaceView } } } - + mAllAppsList = list; if (mRollo != null && reload) { mRollo.setApps(list); } mLocks &= ~LOCK_ICONS_PENDING; } - + public void addApps(ArrayList<ApplicationInfo> list) { if (mAllAppsList == null) { // Not done loading yet. We'll find out about it later. @@ -769,12 +769,13 @@ public class AllApps3D extends RSSurfaceView // We've been removed from the window. Don't bother with all this. return; } - + final int N = list.size(); if (mRollo != null) { + mRollo.pause(); mRollo.reallocAppsList(mRollo.mState.iconCount + N); } - + for (int i=0; i<N; i++) { final ApplicationInfo item = list.get(i); int index = Collections.binarySearch(mAllAppsList, item, @@ -787,18 +788,22 @@ public class AllApps3D extends RSSurfaceView mRollo.addApp(index, item); } } - + if (mRollo != null) { mRollo.saveAppsList(); + mRollo.resume(); } } - + public void removeApps(ArrayList<ApplicationInfo> list) { if (mAllAppsList == null) { // Not done loading yet. We'll find out about it later. return; } - + + if (mRollo != null) { + mRollo.pause(); + } final int N = list.size(); for (int i=0; i<N; i++) { final ApplicationInfo item = list.get(i); @@ -813,18 +818,19 @@ public class AllApps3D extends RSSurfaceView // Try to recover. This should keep us from crashing for now. } } - + if (mRollo != null) { mRollo.saveAppsList(); + mRollo.resume(); } } - + public void updateApps(ArrayList<ApplicationInfo> list) { // Just remove and add, because they may need to be re-sorted. removeApps(list); addApps(list); } - + private static int findAppByComponent(ArrayList<ApplicationInfo> list, ApplicationInfo item) { ComponentName component = item.intent.getComponent(); final int N = list.size(); @@ -836,7 +842,7 @@ public class AllApps3D extends RSSurfaceView } return -1; } - + /* private static int countPages(int iconCount) { int iconsPerPage = getColumnsCount() * Defines.ROWS_PER_PAGE_PORTRAIT; @@ -856,12 +862,12 @@ public class AllApps3D extends RSSurfaceView mZoomDirty = false; } } - + public static class RolloRS { // Allocations ====== private int mWidth; private int mHeight; - + private Resources mRes; private Script mScript; private Script.Invokable mInvokeMove; @@ -869,7 +875,7 @@ public class AllApps3D extends RSSurfaceView private Script.Invokable mInvokeFling; private Script.Invokable mInvokeResetWAR; private Script.Invokable mInvokeSetZoom; - + private ProgramStore mPSIcons; private ProgramFragment mPFTexMip; private ProgramFragment mPFTexMipAlpha; @@ -878,48 +884,56 @@ public class AllApps3D extends RSSurfaceView private ProgramVertex mPVCurve; private SimpleMesh mMesh; private ProgramVertex.MatrixAllocation mPVA; - + private Allocation mUniformAlloc; - + private Allocation mHomeButtonNormal; private Allocation mHomeButtonFocused; private Allocation mHomeButtonPressed; - + private Allocation[] mIcons; private int[] mIconIds; private Allocation mAllocIconIds; - + private Allocation[] mLabels; private int[] mLabelIds; private Allocation mAllocLabelIds; private Allocation mSelectedIcon; - + private int[] mTouchYBorders; private int[] mTouchXBorders; - + private Bitmap mSelectionBitmap; private Canvas mSelectionCanvas; - + Params mParams; State mState; - + AllApps3D mAllApps; boolean mInitialize; class BaseAlloc { Allocation mAlloc; Type mType; - + void save() { mAlloc.data(this); } } - + private boolean checkClickOK() { return (Math.abs(mAllApps.mVelocity) < 0.4f) && (Math.abs(mAllApps.mPosX - Math.round(mAllApps.mPosX)) < 0.4f); } - + + void pause() { + mRS.contextBindRootScript(null); + } + + void resume() { + mRS.contextBindRootScript(mScript); + } + class Params extends BaseAlloc { Params() { mType = Type.createFromClass(mRS, Params.class, 1, "ParamsClass"); @@ -930,13 +944,13 @@ public class AllApps3D extends RSSurfaceView public int bubbleHeight; public int bubbleBitmapWidth; public int bubbleBitmapHeight; - + public int homeButtonWidth; public int homeButtonHeight; public int homeButtonTextureWidth; public int homeButtonTextureHeight; } - + class State extends BaseAlloc { public float newPositionX; public int newTouchDown; @@ -947,18 +961,18 @@ public class AllApps3D extends RSSurfaceView public float zoomTarget; public int homeButtonId; public float targetPos; - + State() { mType = Type.createFromClass(mRS, State.class, 1, "StateClass"); mAlloc = Allocation.createTyped(mRS, mType); save(); } } - + public RolloRS(AllApps3D allApps) { mAllApps = allApps; } - + public void init(Resources res, int width, int height) { mRes = res; mWidth = width; @@ -971,10 +985,10 @@ public class AllApps3D extends RSSurfaceView initTouchState(width, height); initRs(); } - + public void initMesh() { SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(mRS, 2, 0); - + for (int ct=0; ct < 16; ct++) { float pos = (1.f / (16.f - 1)) * ct; tm.addVertex(0.0f, pos); @@ -987,55 +1001,55 @@ public class AllApps3D extends RSSurfaceView mMesh = tm.create(); mMesh.setName("SMCell"); } - + void resize(int w, int h) { mPVA.setupProjectionNormalized(w, h); mWidth = w; mHeight = h; } - + private void initProgramVertex() { mPVA = new ProgramVertex.MatrixAllocation(mRS); resize(mWidth, mHeight); - + ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null); pvb.setTextureMatrixEnable(true); mPV = pvb.create(); mPV.setName("PV"); mPV.bindAllocation(mPVA); - + Element.Builder eb = new Element.Builder(mRS); eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "ImgSize"); eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 4), "Position"); eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "BendPos"); eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 4), "ScaleOffset"); Element e = eb.create(); - + mUniformAlloc = Allocation.createSized(mRS, e, 1); - + initMesh(); ProgramVertex.ShaderBuilder sb = new ProgramVertex.ShaderBuilder(mRS); String t = "void main() {\n" + // Animation " float ani = UNI_Position.z;\n" + - + " float bendY1 = UNI_BendPos.x;\n" + " float bendY2 = UNI_BendPos.y;\n" + " float bendAngle = 47.0 * (3.14 / 180.0);\n" + " float bendDistance = bendY1 * 0.4;\n" + " float distanceDimLevel = 0.6;\n" + - + " float bendStep = (bendAngle / bendDistance) * (bendAngle * 0.5);\n" + " float aDy = cos(bendAngle);\n" + " float aDz = sin(bendAngle);\n" + - + " float scale = (2.0 / 480.0);\n" + " float x = UNI_Position.x + UNI_ImgSize.x * (1.0 - ani) * (ATTRIB_position.x - 0.5);\n" + " float ys= UNI_Position.y + UNI_ImgSize.y * (1.0 - ani) * ATTRIB_position.y;\n" + " float y = 0.0;\n" + " float z = 0.0;\n" + " float lum = 1.0;\n" + - + " float cv = min(ys, bendY1 - bendDistance) - (bendY1 - bendDistance);\n" + " y += cv * aDy;\n" + " z += -cv * aDz;\n" + @@ -1043,7 +1057,7 @@ public class AllApps3D extends RSSurfaceView " lum += cv / bendDistance * distanceDimLevel;\n" + " y += cv * cos(cv * bendStep);\n" + " z += cv * sin(cv * bendStep);\n" + - + " cv = max(ys, bendY2 + bendDistance) - (bendY2 + bendDistance);\n" + " y += cv * aDy;\n" + " z += cv * aDz;\n" + @@ -1051,20 +1065,20 @@ public class AllApps3D extends RSSurfaceView " lum -= cv / bendDistance * distanceDimLevel;\n" + " y += cv * cos(cv * bendStep);\n" + " z += cv * sin(cv * bendStep);\n" + - + " y += clamp(ys, bendY1, bendY2);\n" + - + " vec4 pos;\n" + " pos.x = (x + UNI_ScaleOffset.z) * UNI_ScaleOffset.x;\n" + " pos.y = (y + UNI_ScaleOffset.w) * UNI_ScaleOffset.x;\n" + " pos.z = z * UNI_ScaleOffset.x;\n" + " pos.w = 1.0;\n" + - + " pos.x *= 1.0 + ani * 4.0;\n" + " pos.y *= 1.0 + ani * 4.0;\n" + " pos.z -= ani * 1.5;\n" + " lum *= 1.0 - ani;\n" + - + " gl_Position = UNI_MVP * pos;\n" + " varColor.rgba = vec4(lum, lum, lum, 1.0);\n" + " varTex0.xy = ATTRIB_position;\n" + @@ -1078,10 +1092,10 @@ public class AllApps3D extends RSSurfaceView mPVCurve.setName("PVCurve"); mPVCurve.bindAllocation(mPVA); mPVCurve.bindConstants(mUniformAlloc, 1); - + mRS.contextBindProgramVertex(mPV); } - + private void initProgramFragment() { Sampler.Builder sb = new Sampler.Builder(mRS); sb.setMin(Sampler.Value.LINEAR_MIP_LINEAR); @@ -1089,30 +1103,30 @@ public class AllApps3D extends RSSurfaceView sb.setWrapS(Sampler.Value.CLAMP); sb.setWrapT(Sampler.Value.CLAMP); Sampler linear = sb.create(); - + sb.setMin(Sampler.Value.NEAREST); sb.setMag(Sampler.Value.NEAREST); Sampler nearest = sb.create(); - + ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS); bf.setTexture(ProgramFragment.Builder.EnvMode.MODULATE, ProgramFragment.Builder.Format.RGBA, 0); mPFTexMip = bf.create(); mPFTexMip.setName("PFTexMip"); mPFTexMip.bindSampler(linear, 0); - + mPFTexNearest = bf.create(); mPFTexNearest.setName("PFTexNearest"); mPFTexNearest.bindSampler(nearest, 0); - + bf.setTexture(ProgramFragment.Builder.EnvMode.MODULATE, ProgramFragment.Builder.Format.ALPHA, 0); mPFTexMipAlpha = bf.create(); mPFTexMipAlpha.setName("PFTexMipAlpha"); mPFTexMipAlpha.bindSampler(linear, 0); - + } - + private void initProgramStore() { ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null); bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); @@ -1123,23 +1137,23 @@ public class AllApps3D extends RSSurfaceView mPSIcons = bs.create(); mPSIcons.setName("PSIcons"); } - + private void initGl() { mTouchXBorders = new int[mAllApps.mColumnsPerPage + 1]; mTouchYBorders = new int[mAllApps.mRowsPerPage + 1]; } - + private void initData() { mParams = new Params(); mState = new State(); - + final Utilities.BubbleText bubble = new Utilities.BubbleText(mAllApps.getContext()); - + mParams.bubbleWidth = bubble.getBubbleWidth(); mParams.bubbleHeight = bubble.getMaxBubbleHeight(); mParams.bubbleBitmapWidth = bubble.getBitmapWidth(); mParams.bubbleBitmapHeight = bubble.getBitmapHeight(); - + mHomeButtonNormal = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.home_button_normal, Element.RGBA_8888(mRS), false); mHomeButtonNormal.uploadToTexture(0); @@ -1153,19 +1167,19 @@ public class AllApps3D extends RSSurfaceView mParams.homeButtonHeight = 68; mParams.homeButtonTextureWidth = 128; mParams.homeButtonTextureHeight = 128; - + mState.homeButtonId = mHomeButtonNormal.getID(); - + mParams.save(); mState.save(); - + mSelectionBitmap = Bitmap.createBitmap(Defines.SELECTION_TEXTURE_WIDTH_PX, Defines.SELECTION_TEXTURE_HEIGHT_PX, Bitmap.Config.ARGB_8888); mSelectionCanvas = new Canvas(mSelectionBitmap); - + setApps(null); } - + private void initRs() { ScriptC.Builder sb = new ScriptC.Builder(mRS); sb.setScript(mRes, R.raw.allapps); @@ -1186,32 +1200,33 @@ public class AllApps3D extends RSSurfaceView mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS); mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS); mScript.bindAllocation(mUniformAlloc, Defines.ALLOC_VP_CONSTANTS); - + mRS.contextBindRootScript(mScript); } - + void dirtyCheck() { if (mAllApps.mZoomDirty) { setZoom(mAllApps.mNextZoom, mAllApps.mAnimateNextZoom); } } - + @SuppressWarnings({"ConstantConditions"}) private void setApps(ArrayList<ApplicationInfo> list) { + mRollo.pause(); final int count = list != null ? list.size() : 0; int allocCount = count; if (allocCount < 1) { allocCount = 1; } - + mIcons = new Allocation[count]; mIconIds = new int[allocCount]; mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount); - + mLabels = new Allocation[count]; mLabelIds = new int[allocCount]; mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount); - + mState.iconCount = count; for (int i=0; i < mState.iconCount; i++) { createAppIconAllocations(i, list.get(i)); @@ -1220,8 +1235,9 @@ public class AllApps3D extends RSSurfaceView uploadAppIcon(i, list.get(i)); } saveAppsList(); + mRollo.resume(); } - + private void setZoom(float zoom, boolean animate) { mRollo.clearSelectedIcon(); mRollo.setHomeSelected(SELECTED_NONE); @@ -1235,7 +1251,7 @@ public class AllApps3D extends RSSurfaceView mRollo.mInvokeSetZoom.execute(); } } - + private void createAppIconAllocations(int index, ApplicationInfo item) { mIcons[index] = Allocation.createFromBitmap(mRS, item.iconBitmap, Element.RGBA_8888(mRS), false); @@ -1244,7 +1260,7 @@ public class AllApps3D extends RSSurfaceView mIconIds[index] = mIcons[index].getID(); mLabelIds[index] = mLabels[index].getID(); } - + private void uploadAppIcon(int index, ApplicationInfo item) { if (mIconIds[index] != mIcons[index].getID()) { throw new IllegalStateException("uploadAppIcon index=" + index @@ -1255,7 +1271,7 @@ public class AllApps3D extends RSSurfaceView mIcons[index].uploadToTexture(true, 0); mLabels[index].uploadToTexture(true, 0); } - + /** * Puts the empty spaces at the end. Updates mState.iconCount. You must * fill in the values and call saveAppsList(). @@ -1264,88 +1280,84 @@ public class AllApps3D extends RSSurfaceView Allocation[] icons = new Allocation[count]; int[] iconIds = new int[count]; mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count); - + Allocation[] labels = new Allocation[count]; int[] labelIds = new int[count]; mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count); - + final int oldCount = mRollo.mState.iconCount; - + System.arraycopy(mIcons, 0, icons, 0, oldCount); System.arraycopy(mIconIds, 0, iconIds, 0, oldCount); System.arraycopy(mLabels, 0, labels, 0, oldCount); System.arraycopy(mLabelIds, 0, labelIds, 0, oldCount); - + mIcons = icons; mIconIds = iconIds; mLabels = labels; mLabelIds = labelIds; } - + /** * Handle the allocations for the new app. Make sure you call saveAppsList when done. */ private void addApp(int index, ApplicationInfo item) { final int count = mState.iconCount - index; final int dest = index + 1; - + System.arraycopy(mIcons, index, mIcons, dest, count); System.arraycopy(mIconIds, index, mIconIds, dest, count); System.arraycopy(mLabels, index, mLabels, dest, count); System.arraycopy(mLabelIds, index, mLabelIds, dest, count); - + createAppIconAllocations(index, item); uploadAppIcon(index, item); mRollo.mState.iconCount++; } - + /** * Handle the allocations for the removed app. Make sure you call saveAppsList when done. */ private void removeApp(int index) { final int count = mState.iconCount - index - 1; final int src = index + 1; - + System.arraycopy(mIcons, src, mIcons, index, count); System.arraycopy(mIconIds, src, mIconIds, index, count); System.arraycopy(mLabels, src, mLabels, index, count); System.arraycopy(mLabelIds, src, mLabelIds, index, count); - + mRollo.mState.iconCount--; final int last = mState.iconCount; - + mIcons[last] = null; mIconIds[last] = 0; mLabels[last] = null; mLabelIds[last] = 0; } - + /** * Send the apps list structures to RS. */ private void saveAppsList() { // WTF: how could mScript be not null but mAllocIconIds null b/2460740. if (mScript != null && mAllocIconIds != null) { - mRS.contextBindRootScript(null); - mAllocIconIds.data(mIconIds); mAllocLabelIds.data(mLabelIds); - + mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS); mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS); - + mState.save(); - + // Note: mScript may be null if we haven't initialized it yet. // In that case, this is a no-op. if (mInvokeResetWAR != null) { mInvokeResetWAR.execute(); } - - mRS.contextBindRootScript(mScript); } } - + void initTouchState(int width, int height) { boolean isPortrait = width < height; @@ -1356,7 +1368,7 @@ public class AllApps3D extends RSSurfaceView if (!isPortrait) centerY += cellHeight / 2; int half = (int) Math.floor((mAllApps.mRowsPerPage + 1) / 2); int end = mTouchYBorders.length - (half + 1); - + for (int i = -half; i <= end; i++) { mTouchYBorders[i + half] = centerY + i * cellHeight; } @@ -1369,25 +1381,25 @@ public class AllApps3D extends RSSurfaceView x += columnWidth; } } - + void fling() { mInvokeFling.execute(); } - + void move() { mInvokeMove.execute(); } - + void moveTo(float row) { mState.targetPos = row; mState.save(); mInvokeMoveTo.execute(); } - + int chooseTappedIcon(int x, int y, float pos) { // Adjust for scroll position if not zero. y += (pos - ((int)pos)) * (mTouchYBorders[1] - mTouchYBorders[0]); - + int col = -1; int row = -1; final int columnsCount = mAllApps.mColumnsPerPage; @@ -1404,20 +1416,20 @@ public class AllApps3D extends RSSurfaceView break; } } - + if (row < 0 || col < 0) { return -1; } - + int index = (((int)pos) * columnsCount) + (row * columnsCount) + col; - + if (index >= mState.iconCount) { return -1; } else { return index; } } - + /** * You need to call save() on mState on your own after calling this. * @@ -1428,7 +1440,7 @@ public class AllApps3D extends RSSurfaceView selectIcon(index, pressed); return index; } - + /** * Select the icon at the given index. * @@ -1446,22 +1458,22 @@ public class AllApps3D extends RSSurfaceView if (pressed == SELECTED_FOCUSED) { mAllApps.mLastSelection = SELECTION_ICONS; } - + int prev = mState.selectedIconIndex; mState.selectedIconIndex = index; - + ApplicationInfo info = appsList.get(index); Bitmap selectionBitmap = mSelectionBitmap; - + Utilities.drawSelectedAllAppsBitmap(mSelectionCanvas, selectionBitmap.getWidth(), selectionBitmap.getHeight(), pressed == SELECTED_PRESSED, info.iconBitmap); - + mSelectedIcon = Allocation.createFromBitmap(mRS, selectionBitmap, Element.RGBA_8888(mRS), false); mSelectedIcon.uploadToTexture(0); mState.selectedIconTexture = mSelectedIcon.getID(); - + if (prev != index) { if (info.title != null && info.title.length() > 0) { //setContentDescription(info.title); @@ -1470,14 +1482,14 @@ public class AllApps3D extends RSSurfaceView } } } - + /** * You need to call save() on mState on your own after calling this. */ void clearSelectedIcon() { mState.selectedIconIndex = -1; } - + void setHomeSelected(int mode) { final int prev = mAllApps.mLastSelection; switch (mode) { @@ -1496,7 +1508,7 @@ public class AllApps3D extends RSSurfaceView break; } } - + public void dumpState() { Log.d(TAG, "mRollo.mWidth=" + mWidth); Log.d(TAG, "mRollo.mHeight=" + mHeight); @@ -1533,7 +1545,7 @@ public class AllApps3D extends RSSurfaceView Log.d(TAG, "mRollo.mParams.homeButtonTextureHeight=" + mParams.homeButtonTextureHeight); } } - + public void dumpState() { Log.d(TAG, "mRS=" + mRS); Log.d(TAG, "mRollo=" + mRollo); |