Initial changes to add Applications tab in the customization drawer for usability testing.

- Also adding padding attributes for the dynamic layouts created for each page.

Change-Id: I76a7b6b8f4d83329c506fd6055f910575d0c200f
This commit is contained in:
Winson Chung 2010-09-23 18:40:29 -07:00
parent dea9e93e4a
commit 5ffd8eafeb
9 changed files with 283 additions and 25 deletions

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.launcher2.AllAppsTabbed
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
android:background="#30000000"
android:paddingTop="?android:attr/actionBarSize">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:tabStripEnabled="false"
android:paddingBottom="10dp" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.android.launcher2.AllAppsPagedView
android:id="@+id/all_apps_paged_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:cellCountX="7"
launcher:cellCountY="4"
launcher:pageLayoutPaddingTop="10dp"
launcher:pageLayoutPaddingBottom="15dp"
launcher:pageLayoutPaddingLeft="20dp"
launcher:pageLayoutPaddingRight="20dp">
</com.android.launcher2.AllAppsPagedView>
</FrameLayout>
</LinearLayout>
</com.android.launcher2.AllAppsTabbed>

View File

@ -19,4 +19,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:widgetCellCountX="16" />
launcher:widgetCellCountX="16"
launcher:cellCountX="7"
launcher:cellCountY="4"
launcher:pageLayoutPaddingTop="10dp"
launcher:pageLayoutPaddingBottom="15dp"
launcher:pageLayoutPaddingLeft="20dp"
launcher:pageLayoutPaddingRight="20dp" />

View File

@ -38,7 +38,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:cellCountX="7"
launcher:cellCountY="4">
launcher:cellCountY="4"
launcher:pageLayoutPaddingTop="10dp"
launcher:pageLayoutPaddingBottom="10dp"
launcher:pageLayoutPaddingLeft="0dp"
launcher:pageLayoutPaddingRight="0dp">
</com.android.launcher2.AllAppsPagedView>
</FrameLayout>
</LinearLayout>

View File

@ -19,4 +19,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
launcher:widgetCellCountX="12" />
launcher:widgetCellCountX="12"
launcher:cellCountX="7"
launcher:cellCountY="4"
launcher:pageLayoutPaddingTop="10dp"
launcher:pageLayoutPaddingBottom="15dp"
launcher:pageLayoutPaddingLeft="0dp"
launcher:pageLayoutPaddingRight="0dp" />

View File

@ -75,6 +75,11 @@
<attr name="cellCountX" />
<!-- The number of vertical cells in a page -->
<attr name="cellCountY" />
<!-- The padding of the pages that are dynamically created per page -->
<attr name="pageLayoutPaddingTop" format="dimension" />
<attr name="pageLayoutPaddingBottom" format="dimension" />
<attr name="pageLayoutPaddingLeft" format="dimension" />
<attr name="pageLayoutPaddingRight" format="dimension" />
</declare-styleable>
<!-- CustomizePagedView specific attributes. These attributes are used to customize

View File

@ -50,9 +50,11 @@
<string name="folders_tab_label">Folders</string>
<!-- Title of tab containing all possible shortcuts (eg Contacts, Bookmarks) that can be
added to the home screen -->
<string name="shortcuts_tab_label">Shortcuts</string>
<string name="shortcuts_tab_label">More</string>
<!-- Title of tab for configuring wallpapers -->
<string name="wallpapers_tab_label">Wallpapers</string>
<!-- Title of tab for configuring applications -->
<string name="applications_tab_label">App Shortcuts</string>
<!-- Placeholder text, will be removed -->
<string name="wallpapers_temp_tab_text">This will be the wallpapers tab</string>
<!-- Labels for the tabs in All Apps -->

View File

@ -68,6 +68,10 @@ public class AllAppsPagedView extends PagedView
private int mCellCountX;
private int mCellCountY;
private int mPageLayoutPaddingTop;
private int mPageLayoutPaddingBottom;
private int mPageLayoutPaddingLeft;
private int mPageLayoutPaddingRight;
private final LayoutInflater mInflater;
@ -90,6 +94,14 @@ public class AllAppsPagedView extends PagedView
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PagedView, defStyle, 0);
mCellCountX = a.getInt(R.styleable.PagedView_cellCountX, 6);
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);
mInflater = LayoutInflater.from(context);
a.recycle();
setSoundEffectsEnabled(false);
@ -354,6 +366,8 @@ public class AllAppsPagedView extends PagedView
for (int i = curNumPages; i < numPages; ++i) {
PagedViewCellLayout layout = new PagedViewCellLayout(getContext());
layout.setCellCount(mCellCountX, mCellCountY);
layout.setPadding(mPageLayoutPaddingLeft, mPageLayoutPaddingTop,
mPageLayoutPaddingRight, mPageLayoutPaddingBottom);
addView(layout);
}

View File

@ -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 List<ApplicationInfo> mApps;
private static final int sCellCountX = 8;
private static final int sCellCountY = 4;
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;
}
}

View File

@ -177,6 +177,7 @@ public final class Launcher extends Activity
// tags for the customization tabs
private static final String WIDGETS_TAG = "widgets";
private static final String APPLICATIONS_TAG = "applications";
private static final String FOLDERS_TAG = "folders";
private static final String SHORTCUTS_TAG = "shortcuts";
private static final String WALLPAPERS_TAG = "wallpapers";
@ -292,15 +293,18 @@ public final class Launcher extends Activity
String widgetsLabel = getString(R.string.widgets_tab_label);
mHomeCustomizationDrawer.addTab(mHomeCustomizationDrawer.newTabSpec(WIDGETS_TAG)
.setIndicator(widgetsLabel).setContent(contentFactory));
String applicationsLabel = getString(R.string.applications_tab_label);
mHomeCustomizationDrawer.addTab(mHomeCustomizationDrawer.newTabSpec(APPLICATIONS_TAG)
.setIndicator(applicationsLabel).setContent(contentFactory));
String foldersLabel = getString(R.string.folders_tab_label);
mHomeCustomizationDrawer.addTab(mHomeCustomizationDrawer.newTabSpec(FOLDERS_TAG)
.setIndicator(foldersLabel).setContent(contentFactory));
String shortcutsLabel = getString(R.string.shortcuts_tab_label);
mHomeCustomizationDrawer.addTab(mHomeCustomizationDrawer.newTabSpec(SHORTCUTS_TAG)
.setIndicator(shortcutsLabel).setContent(contentFactory));
String wallpapersLabel = getString(R.string.wallpapers_tab_label);
mHomeCustomizationDrawer.addTab(mHomeCustomizationDrawer.newTabSpec(WALLPAPERS_TAG)
.setIndicator(wallpapersLabel).setContent(contentFactory));
String shortcutsLabel = getString(R.string.shortcuts_tab_label);
mHomeCustomizationDrawer.addTab(mHomeCustomizationDrawer.newTabSpec(SHORTCUTS_TAG)
.setIndicator(shortcutsLabel).setContent(contentFactory));
// TEMP: just styling the tab widget to be a bit nicer until we get the actual
// new assets
@ -327,20 +331,23 @@ public final class Launcher extends Activity
if (tag == WIDGETS_TAG) {
mCustomizePagedView.setCustomizationFilter(
CustomizePagedView.CustomizationType.WidgetCustomization);
} else if (tag == APPLICATIONS_TAG) {
mCustomizePagedView.setCustomizationFilter(
CustomizePagedView.CustomizationType.ApplicationCustomization);
} else if (tag == FOLDERS_TAG) {
mCustomizePagedView.setCustomizationFilter(
CustomizePagedView.CustomizationType.FolderCustomization);
} else if (tag == SHORTCUTS_TAG) {
mCustomizePagedView.setCustomizationFilter(
CustomizePagedView.CustomizationType.ShortcutCustomization);
} else if (tag == WALLPAPERS_TAG) {
mCustomizePagedView.setCustomizationFilter(
CustomizePagedView.CustomizationType.WallpaperCustomization);
} else if (tag == SHORTCUTS_TAG) {
mCustomizePagedView.setCustomizationFilter(
CustomizePagedView.CustomizationType.ShortcutCustomization);
}
final float alpha = mCustomizePagedView.getAlpha();
ValueAnimator alphaAnim = new ObjectAnimator(duration, mCustomizePagedView,
"alpha", alpha, 1.0f);
ValueAnimator alphaAnim = new ObjectAnimator(duration,
mCustomizePagedView, "alpha", alpha, 1.0f);
alphaAnim.start();
}
});
@ -2976,6 +2983,7 @@ public final class Launcher extends Activity
*/
public void bindAllApplications(ArrayList<ApplicationInfo> apps) {
mAllAppsGrid.setApps(apps);
mCustomizePagedView.setApps(apps);
updateAppMarketIcon();
}
@ -2987,6 +2995,7 @@ public final class Launcher extends Activity
public void bindAppsAdded(ArrayList<ApplicationInfo> apps) {
removeDialog(DIALOG_CREATE_SHORTCUT);
mAllAppsGrid.addApps(apps);
mCustomizePagedView.addApps(apps);
updateAppMarketIcon();
}
@ -2999,6 +3008,7 @@ public final class Launcher extends Activity
removeDialog(DIALOG_CREATE_SHORTCUT);
mWorkspace.updateShortcuts(apps);
mAllAppsGrid.updateApps(apps);
mCustomizePagedView.updateApps(apps);
updateAppMarketIcon();
}
@ -3013,6 +3023,7 @@ public final class Launcher extends Activity
mWorkspace.removeItems(apps);
}
mAllAppsGrid.removeApps(apps);
mCustomizePagedView.removeApps(apps);
updateAppMarketIcon();
}