summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2/CustomizePagedView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher2/CustomizePagedView.java')
-rw-r--r--src/com/android/launcher2/CustomizePagedView.java189
1 files changed, 175 insertions, 14 deletions
diff --git a/src/com/android/launcher2/CustomizePagedView.java b/src/com/android/launcher2/CustomizePagedView.java
index 8fb3025c0..ead258c8c 100644
--- a/src/com/android/launcher2/CustomizePagedView.java
+++ b/src/com/android/launcher2/CustomizePagedView.java
@@ -59,7 +59,8 @@ public class CustomizePagedView extends PagedView
WidgetCustomization,
FolderCustomization,
ShortcutCustomization,
- WallpaperCustomization
+ WallpaperCustomization,
+ ApplicationCustomization
}
/**
@@ -109,9 +110,14 @@ public class CustomizePagedView extends PagedView
private List<ResolveInfo> mFolderList;
private List<ResolveInfo> mShortcutList;
private List<ResolveInfo> mWallpaperList;
-
- private static final int sCellCountX = 8;
- private static final int sCellCountY = 4;
+ private List<ApplicationInfo> mApps;
+
+ private int mCellCountX;
+ private int mCellCountY;
+ private int mPageLayoutPaddingTop;
+ private int mPageLayoutPaddingBottom;
+ private int mPageLayoutPaddingLeft;
+ private int mPageLayoutPaddingRight;
private static final int sMinWidgetCellHSpan = 2;
private static final int sMaxWidgetCellHSpan = 4;
@@ -132,14 +138,27 @@ public class CustomizePagedView extends PagedView
public CustomizePagedView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomizePagedView,
+ TypedArray a;
+ a = context.obtainStyledAttributes(attrs, R.styleable.CustomizePagedView,
defStyle, 0);
+ mMaxWidgetsCellHSpan = a.getInt(R.styleable.CustomizePagedView_widgetCellCountX, 8);
+ a.recycle();
+ a = context.obtainStyledAttributes(attrs, R.styleable.PagedView, defStyle, 0);
+ mCellCountX = a.getInt(R.styleable.PagedView_cellCountX, 7);
+ mCellCountY = a.getInt(R.styleable.PagedView_cellCountY, 4);
+ mPageLayoutPaddingTop = a.getDimensionPixelSize(
+ R.styleable.PagedView_pageLayoutPaddingTop, 10);
+ mPageLayoutPaddingBottom = a.getDimensionPixelSize(
+ R.styleable.PagedView_pageLayoutPaddingBottom, 10);
+ mPageLayoutPaddingLeft = a.getDimensionPixelSize(
+ R.styleable.PagedView_pageLayoutPaddingLeft, 10);
+ mPageLayoutPaddingRight = a.getDimensionPixelSize(
+ R.styleable.PagedView_pageLayoutPaddingRight, 10);
+ a.recycle();
mCustomizationType = CustomizationType.WidgetCustomization;
mWidgetPages = new ArrayList<ArrayList<AppWidgetProviderInfo>>();
mWorkspaceWidgetLayout = new PagedViewCellLayout(context);
mInflater = LayoutInflater.from(context);
- mMaxWidgetsCellHSpan = a.getInt(R.styleable.CustomizePagedView_widgetCellCountX, 8);
- a.recycle();
setVisibility(View.GONE);
setSoundEffectsEnabled(false);
@@ -152,6 +171,93 @@ public class CustomizePagedView extends PagedView
mPackageManager = context.getPackageManager();
}
+ /**
+ * Sets the list of applications that launcher has loaded.
+ */
+ public void setApps(ArrayList<ApplicationInfo> list) {
+ mApps = list;
+ Collections.sort(mApps, LauncherModel.APP_NAME_COMPARATOR);
+ mPageViewIconCache.clear();
+ invalidatePageData();
+ }
+
+ /**
+ * Convenience function to add new items to the set of applications that were previously loaded.
+ * Called by both updateApps() and setApps().
+ */
+ private void addAppsWithoutInvalidate(ArrayList<ApplicationInfo> list) {
+ // we add it in place, in alphabetical order
+ final int count = list.size();
+ for (int i = 0; i < count; ++i) {
+ final ApplicationInfo info = list.get(i);
+ final int index = Collections.binarySearch(mApps, info, LauncherModel.APP_NAME_COMPARATOR);
+ if (index < 0) {
+ mApps.add(-(index + 1), info);
+ }
+ }
+ }
+
+ /**
+ * Adds new applications to the loaded list, and notifies the paged view to update itself.
+ */
+ public void addApps(ArrayList<ApplicationInfo> list) {
+ addAppsWithoutInvalidate(list);
+ invalidatePageData();
+ }
+
+ /**
+ * Convenience function to remove items to the set of applications that were previously loaded.
+ * Called by both updateApps() and removeApps().
+ */
+ private void removeAppsWithoutInvalidate(ArrayList<ApplicationInfo> list) {
+ // loop through all the apps and remove apps that have the same component
+ final int length = list.size();
+ for (int i = 0; i < length; ++i) {
+ final ApplicationInfo info = list.get(i);
+ int removeIndex = findAppByComponent(mApps, info);
+ if (removeIndex > -1) {
+ mApps.remove(removeIndex);
+ mPageViewIconCache.removeOutline(info);
+ }
+ }
+ }
+
+ /**
+ * Removes applications from the loaded list, and notifies the paged view to update itself.
+ */
+ public void removeApps(ArrayList<ApplicationInfo> list) {
+ removeAppsWithoutInvalidate(list);
+ invalidatePageData();
+ }
+
+ /**
+ * Updates a set of applications from the loaded list, and notifies the paged view to update
+ * itself.
+ */
+ public void updateApps(ArrayList<ApplicationInfo> list) {
+ // We remove and re-add the updated applications list because it's properties may have
+ // changed (ie. the title), and this will ensure that the items will be in their proper
+ // place in the list.
+ removeAppsWithoutInvalidate(list);
+ addAppsWithoutInvalidate(list);
+ invalidatePageData();
+ }
+
+ /**
+ * Convenience function to find matching ApplicationInfos for removal.
+ */
+ private int findAppByComponent(List<ApplicationInfo> list, ApplicationInfo item) {
+ ComponentName removeComponent = item.intent.getComponent();
+ final int length = list.size();
+ for (int i = 0; i < length; ++i) {
+ ApplicationInfo info = list.get(i);
+ if (info.intent.getComponent().equals(removeComponent)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
public void update() {
Context context = getContext();
@@ -312,6 +418,13 @@ public class CustomizePagedView extends PagedView
}
});
return true;
+ case ApplicationCustomization:
+ // Pick up the application for dropping
+ ApplicationInfo app = (ApplicationInfo) v.getTag();
+ app = new ApplicationInfo(app);
+
+ mDragController.startDrag(v, this, app, DragController.DRAG_ACTION_COPY);
+ return true;
}
return false;
}
@@ -417,12 +530,13 @@ public class CustomizePagedView extends PagedView
}
private void setupPage(PagedViewCellLayout layout) {
- layout.setCellCount(sCellCountX, sCellCountY);
- layout.setPadding(20, 10, 20, 0);
+ layout.setCellCount(mCellCountX, mCellCountY);
+ layout.setPadding(mPageLayoutPaddingLeft, mPageLayoutPaddingTop, mPageLayoutPaddingRight,
+ mPageLayoutPaddingBottom);
}
private void setupWorkspaceLayout() {
- mWorkspaceWidgetLayout.setCellCount(sCellCountX, sCellCountY);
+ mWorkspaceWidgetLayout.setCellCount(mCellCountX, mCellCountY);
mWorkspaceWidgetLayout.setPadding(20, 10, 20, 0);
mMaxWidgetWidth = mWorkspaceWidgetLayout.estimateCellWidth(sMaxWidgetCellHSpan);
@@ -486,7 +600,7 @@ public class CustomizePagedView extends PagedView
removeAllViews();
// ensure that we have the right number of pages
- int numPages = (int) Math.ceil((float) list.size() / (sCellCountX * sCellCountY));
+ int numPages = (int) Math.ceil((float) list.size() / (mCellCountX * mCellCountY));
for (int i = 0; i < numPages; ++i) {
PagedViewCellLayout layout = new PagedViewCellLayout(getContext());
setupPage(layout);
@@ -496,7 +610,7 @@ public class CustomizePagedView extends PagedView
private void syncListPageItems(int page, List<ResolveInfo> list) {
// ensure that we have the right number of items on the pages
- int numCells = sCellCountX * sCellCountY;
+ int numCells = mCellCountX * mCellCountY;
int startIndex = page * numCells;
int endIndex = Math.min(startIndex + numCells, list.size());
PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(page);
@@ -514,8 +628,48 @@ public class CustomizePagedView extends PagedView
}
final int index = i - startIndex;
- final int x = index % sCellCountX;
- final int y = index / sCellCountX;
+ final int x = index % mCellCountX;
+ final int y = index / mCellCountX;
+ setupPage(layout);
+ layout.addViewToCellLayout(icon, -1, i, new PagedViewCellLayout.LayoutParams(x,y, 1,1));
+ }
+ }
+
+ private void syncAppPages() {
+ if (mApps == null) return;
+
+ // We need to repopulate with PagedViewCellLayouts
+ removeAllViews();
+
+ // Ensure that we have the right number of pages
+ int numPages = (int) Math.ceil((float) mApps.size() / (mCellCountX * mCellCountY));
+ for (int i = 0; i < numPages; ++i) {
+ PagedViewCellLayout layout = new PagedViewCellLayout(getContext());
+ setupPage(layout);
+ addView(layout);
+ }
+ }
+
+ private void syncAppPageItems(int page) {
+ if (mApps == null) return;
+
+ // ensure that we have the right number of items on the pages
+ int numCells = mCellCountX * mCellCountY;
+ int startIndex = page * numCells;
+ int endIndex = Math.min(startIndex + numCells, mApps.size());
+ PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(page);
+ // TODO: we can optimize by just re-applying to existing views
+ layout.removeAllViews();
+ for (int i = startIndex; i < endIndex; ++i) {
+ final ApplicationInfo info = mApps.get(i);
+ PagedViewIcon icon = (PagedViewIcon) mInflater.inflate(
+ R.layout.all_apps_paged_view_application, layout, false);
+ icon.applyFromApplicationInfo(info, mPageViewIconCache);
+ icon.setOnLongClickListener(this);
+
+ final int index = i - startIndex;
+ final int x = index % mCellCountX;
+ final int y = index / mCellCountX;
setupPage(layout);
layout.addViewToCellLayout(icon, -1, i, new PagedViewCellLayout.LayoutParams(x,y, 1,1));
}
@@ -540,6 +694,10 @@ public class CustomizePagedView extends PagedView
syncListPages(mWallpaperList);
centerPagedViewCellLayouts = true;
break;
+ case ApplicationCustomization:
+ syncAppPages();
+ centerPagedViewCellLayouts = false;
+ break;
default:
removeAllViews();
setCurrentPage(0);
@@ -579,6 +737,9 @@ public class CustomizePagedView extends PagedView
case WallpaperCustomization:
syncListPageItems(page, mWallpaperList);
break;
+ case ApplicationCustomization:
+ syncAppPageItems(page);
+ break;
}
}