diff options
-rw-r--r-- | src/com/android/launcher2/AllAppsView.java | 197 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 3 |
2 files changed, 170 insertions, 30 deletions
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java index 4cd017b0b..732bce33c 100644 --- a/src/com/android/launcher2/AllAppsView.java +++ b/src/com/android/launcher2/AllAppsView.java @@ -20,6 +20,8 @@ import java.io.Writer; import java.util.ArrayList; import java.util.concurrent.Semaphore; import java.lang.Float; +import java.util.Collections; +import java.util.Comparator; import android.renderscript.RSSurfaceView; import android.renderscript.RenderScript; @@ -307,7 +309,7 @@ public class AllAppsView extends RSSurfaceView return true; } int index = mRollo.mState.selectedIconIndex; - Log.d(TAG, "long click! velocity=" + mRollo.mMessageProc.mVelocity + " index=" + index); + if (mRollo.checkClickOK() && index >= 0 && index < mAllAppsList.size()) { ApplicationInfo app = mAllAppsList.get(index); @@ -381,14 +383,77 @@ public class AllAppsView extends RSSurfaceView mRollo.setApps(list); } mPageCount = countPages(list.size()); - Log.d(TAG, "setApps mRollo=" + mRollo + " list=" + list); mLocks &= ~LOCK_ICONS_PENDING; } - private void invokeIcon(int index) { - Log.d(TAG, "launch it!!!! index=" + index); + public void addApps(ArrayList<ApplicationInfo> list) { + final int N = list.size(); + if (mRollo != null) { + 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, mAppNameComp); + if (index < 0) { + index = -(index+1); + } + mAllAppsList.add(index, item); + if (mRollo != null) { + mRollo.addApp(index, item); + mRollo.mState.iconCount++; + } + } + + if (mRollo != null) { + mRollo.saveAppsList(); + } + } + + public void removeApps(ArrayList<ApplicationInfo> list) { + final int N = list.size(); + for (int i=0; i<N; i++) { + final ApplicationInfo item = list.get(i); + int index = Collections.binarySearch(mAllAppsList, item, mAppIntentComp); + if (index >= 0) { + mAllAppsList.remove(index); + if (mRollo != null) { + mRollo.removeApp(index); + mRollo.mState.iconCount--; + } + } else { + Log.e(TAG, "couldn't find a match for item \"" + item + "\""); + // Try to recover. This should keep us from crashing for now. + } + } + + if (mRollo != null) { + mRollo.saveAppsList(); + } + } + + public void updateApps(String packageName, ArrayList<ApplicationInfo> list) { + // Just remove and add, because they may need to be re-sorted. + removeApps(list); + addApps(list); } + private Comparator<ApplicationInfo> mAppNameComp = new Comparator<ApplicationInfo>() { + public int compare(ApplicationInfo a, ApplicationInfo b) { + int result = a.title.toString().compareTo(b.toString()); + if (result != 0) { + return result; + } + return a.intent.getComponent().compareTo(b.intent.getComponent()); + } + }; + + private Comparator<ApplicationInfo> mAppIntentComp = new Comparator<ApplicationInfo>() { + public int compare(ApplicationInfo a, ApplicationInfo b) { + return a.intent.getComponent().compareTo(b.intent.getComponent()); + } + }; + private static int countPages(int iconCount) { int iconsPerPage = Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE; int pages = iconCount / iconsPerPage; @@ -425,11 +490,11 @@ public class AllAppsView extends RSSurfaceView private Allocation[] mIcons; private int[] mIconIds; - private Allocation mAllocIconID; + private Allocation mAllocIconIds; private Allocation[] mLabels; private int[] mLabelIds; - private Allocation mAllocLabelID; + private Allocation mAllocLabelIds; private Allocation mSelectedIcon; private int[] mTouchYBorders; @@ -678,7 +743,6 @@ public class AllAppsView extends RSSurfaceView Defines.ICON_TEXTURE_HEIGHT_PX, Bitmap.Config.ARGB_8888); mSelectionCanvas = new Canvas(mSelectionBitmap); - Log.d(TAG, "initData calling mRollo.setApps"); setApps(null); } @@ -698,8 +762,8 @@ public class AllAppsView extends RSSurfaceView mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS); mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE); - mScript.bindAllocation(mAllocIconID, Defines.ALLOC_ICON_IDS); - mScript.bindAllocation(mAllocLabelID, Defines.ALLOC_LABEL_IDS); + mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS); + mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS); mScript.bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS); mScript.bindAllocation(mAllocTouchYBorders, Defines.ALLOC_Y_BORDERS); @@ -711,48 +775,123 @@ public class AllAppsView extends RSSurfaceView private void setApps(ArrayList<ApplicationInfo> list) { final int count = list != null ? list.size() : 0; int allocCount = count; - if(allocCount < 1) { + if (allocCount < 1) { allocCount = 1; } mIcons = new Allocation[count]; mIconIds = new int[allocCount]; - mAllocIconID = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount); + mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount); mLabels = new Allocation[count]; mLabelIds = new int[allocCount]; - mAllocLabelID = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount); + mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount); Element ie8888 = Element.RGBA_8888(mRS); Utilities.BubbleText bubble = new Utilities.BubbleText(getContext()); for (int i=0; i<count; i++) { - final ApplicationInfo item = list.get(i); + uploadAppIcon(i, list.get(i)); + } - mIcons[i] = Allocation.createFromBitmap(mRS, item.iconBitmap, - Element.RGBA_8888(mRS), false); - mLabels[i] = Allocation.createFromBitmap(mRS, item.titleBitmap, - Element.RGBA_8888(mRS), false); + mState.iconCount = count; - mIcons[i].uploadToTexture(0); - mLabels[i].uploadToTexture(0); + saveAppsList(); + } - mIconIds[i] = mIcons[i].getID(); - mLabelIds[i] = mLabels[i].getID(); - } + private void uploadAppIcon(int index, ApplicationInfo item) { + mIcons[index] = Allocation.createFromBitmap(mRS, item.iconBitmap, + Element.RGBA_8888(mRS), false); + mLabels[index] = Allocation.createFromBitmap(mRS, item.titleBitmap, + Element.RGBA_8888(mRS), false); - mAllocIconID.data(mIconIds); - mAllocLabelID.data(mLabelIds); + mIcons[index].uploadToTexture(0); + mLabels[index].uploadToTexture(0); - mState.iconCount = count; + mIconIds[index] = mIcons[index].getID(); + mLabelIds[index] = mLabels[index].getID(); + } + + /** + * Puts the empty spaces at the end. Updates mState.iconCount. You must + * fill in the values and call saveAppsList(). + */ + private void reallocAppsList(int count) { + 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 = mIcons.length; + + 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; - if (mScript != null) { // wtf - mScript.bindAllocation(mAllocIconID, Defines.ALLOC_ICON_IDS); - mScript.bindAllocation(mAllocLabelID, Defines.ALLOC_LABEL_IDS); + 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); + + uploadAppIcon(index, item); + } + + /** + * 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); + + final int last = mState.iconCount - 1; + mIcons[last] = null; + mIconIds[last] = 0; + mLabels[last] = null; + mLabelIds[last] = 0; + } + + /** + * Send the apps list structures to RS. + */ + private void saveAppsList() { + mRS.contextBindRootScript(null); + + mAllocIconIds.data(mIconIds); + mAllocLabelIds.data(mLabelIds); + + if (mScript != null) { // this happens when we init it + 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. + mRS.contextBindRootScript(mScript); } void initTouchState() { @@ -823,7 +962,6 @@ public class AllAppsView extends RSSurfaceView } void selectIcon(int index) { - Log.d(TAG, "selectIcon index=" + index); int iconCount = mAllAppsList.size(); if (index < 0 || index >= iconCount) { mState.selectedIconIndex = -1; @@ -850,6 +988,7 @@ public class AllAppsView extends RSSurfaceView void clearSelectedIcon() { mState.selectedIconIndex = -1; } + } } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 8f0340238..b8ad189a6 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -1927,6 +1927,7 @@ public final class Launcher extends Activity */ public void bindPackageAdded(ArrayList<ApplicationInfo> apps) { removeDialog(DIALOG_CREATE_SHORTCUT); + mAllAppsGrid.addApps(apps); } /** @@ -1947,6 +1948,6 @@ public final class Launcher extends Activity public void bindPackageRemoved(String packageName, ArrayList<ApplicationInfo> apps) { removeDialog(DIALOG_CREATE_SHORTCUT); mWorkspace.removeShortcutsForPackage(packageName); + mAllAppsGrid.removeApps(apps); } - } |