summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2/AllAppsView.java
diff options
context:
space:
mode:
authorJoe Onorato <joeo@android.com>2009-10-06 19:25:30 -0700
committerJoe Onorato <joeo@android.com>2009-10-06 19:28:53 -0700
commita8138d5fa184681cbfeb0f489c84d11c21a8a0a3 (patch)
tree34978259cd0c10871f0c4609d717d4af94ca5d13 /src/com/android/launcher2/AllAppsView.java
parent2c2693281842f9ccf68305f149e6a4dec76ad67c (diff)
downloadandroid_packages_apps_Trebuchet-a8138d5fa184681cbfeb0f489c84d11c21a8a0a3.tar.gz
android_packages_apps_Trebuchet-a8138d5fa184681cbfeb0f489c84d11c21a8a0a3.tar.bz2
android_packages_apps_Trebuchet-a8138d5fa184681cbfeb0f489c84d11c21a8a0a3.zip
Launcher2 - make 3d all apps deal with new apps and deleted apps.
Diffstat (limited to 'src/com/android/launcher2/AllAppsView.java')
-rw-r--r--src/com/android/launcher2/AllAppsView.java197
1 files changed, 168 insertions, 29 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;
}
+
}
}