summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
diff options
context:
space:
mode:
authorPeter Schiller <peterschiller@google.com>2016-07-07 14:47:05 -0700
committerPeter Schiller <peterschiller@google.com>2016-07-08 15:02:03 -0700
commitc2a20ff0a87f58b2be66f067b0024db7ff5185d3 (patch)
treed49af77af6962200175d705c2dc8e9726c93c5cf /src/com/android/launcher3/allapps/AllAppsGridAdapter.java
parent723657c584976c627f44683471d71a39c78c1182 (diff)
downloadandroid_packages_apps_Trebuchet-c2a20ff0a87f58b2be66f067b0024db7ff5185d3.tar.gz
android_packages_apps_Trebuchet-c2a20ff0a87f58b2be66f067b0024db7ff5185d3.tar.bz2
android_packages_apps_Trebuchet-c2a20ff0a87f58b2be66f067b0024db7ff5185d3.zip
Consolidate all the dividers to provide same look and feel
Bug: 30017936 Change-Id: I072cb116dba1df555a63f3f67b730f7f9c3a235a
Diffstat (limited to 'src/com/android/launcher3/allapps/AllAppsGridAdapter.java')
-rw-r--r--src/com/android/launcher3/allapps/AllAppsGridAdapter.java133
1 files changed, 74 insertions, 59 deletions
diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
index d0b8abc60..7d856c04f 100644
--- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
@@ -56,17 +56,34 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
private static final boolean DEBUG = false;
// A section break in the grid
- public static final int SECTION_BREAK_VIEW_TYPE = 0;
+ public static final int VIEW_TYPE_SECTION_BREAK = 1 << 0;
// A normal icon
- public static final int ICON_VIEW_TYPE = 1;
+ public static final int VIEW_TYPE_ICON = 1 << 1;
// A prediction icon
- public static final int PREDICTION_ICON_VIEW_TYPE = 2;
+ public static final int VIEW_TYPE_PREDICTION_ICON = 1 << 2;
// The message shown when there are no filtered results
- public static final int EMPTY_SEARCH_VIEW_TYPE = 3;
+ public static final int VIEW_TYPE_EMPTY_SEARCH = 1 << 3;
// A divider that separates the apps list and the search market button
- public static final int SEARCH_MARKET_DIVIDER_VIEW_TYPE = 4;
- // The message to continue to a market search when there are no filtered results
- public static final int SEARCH_MARKET_VIEW_TYPE = 5;
+ public static final int VIEW_TYPE_SEARCH_MARKET = 1 << 4;
+
+ // We use various dividers for various purposes. They share enough attributes to reuse layouts,
+ // but differ in enough attributes to require different view types
+
+ // A divider that separates the apps list and the search market button
+ public static final int VIEW_TYPE_SEARCH_MARKET_DIVIDER = 1 << 5;
+ // The divider under the search field
+ public static final int VIEW_TYPE_SEARCH_DIVIDER = 1 << 6;
+ // The divider that separates prediction icons from the app list
+ public static final int VIEW_TYPE_PREDICTION_DIVIDER = 1 << 7;
+
+ // Common view type masks
+ public static final int VIEW_TYPE_MASK_DIVIDER = VIEW_TYPE_SEARCH_DIVIDER
+ | VIEW_TYPE_SEARCH_MARKET_DIVIDER
+ | VIEW_TYPE_PREDICTION_DIVIDER
+ | VIEW_TYPE_SECTION_BREAK;
+ public static final int VIEW_TYPE_MASK_ICON = VIEW_TYPE_ICON
+ | VIEW_TYPE_PREDICTION_ICON;
+
public interface BindViewCallback {
public void onBindView(ViewHolder holder);
@@ -128,11 +145,9 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
@Override
public int getSpanSize(int position) {
- switch (mApps.getAdapterItems().get(position).viewType) {
- case AllAppsGridAdapter.ICON_VIEW_TYPE:
- case AllAppsGridAdapter.PREDICTION_ICON_VIEW_TYPE:
- return 1;
- default:
+ if (isIconViewType(mApps.getAdapterItems().get(position).viewType)) {
+ return 1;
+ } else {
// Section breaks span the full width
return mAppsPerRow;
}
@@ -164,7 +179,6 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
}
List<AlphabeticalAppsList.AdapterItem> items = mApps.getAdapterItems();
- boolean hasDrawnPredictedAppsDivider = false;
boolean showSectionNames = mSectionNamesMargin > 0;
int childCount = parent.getChildCount();
int lastSectionTop = 0;
@@ -176,15 +190,7 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
continue;
}
- if (shouldDrawItemDivider(holder, items) && !hasDrawnPredictedAppsDivider) {
- // Draw the divider under the predicted apps
- int top = child.getTop() + child.getHeight() + mPredictionBarDividerOffset;
- c.drawLine(mBackgroundPadding.left, top,
- parent.getWidth() - mBackgroundPadding.right, top,
- mPredictedAppsDividerPaint);
- hasDrawnPredictedAppsDivider = true;
-
- } else if (showSectionNames && shouldDrawItemSection(holder, i, items)) {
+ if (showSectionNames && shouldDrawItemSection(holder, i, items)) {
// At this point, we only draw sections for each section break;
int viewTopOffset = (2 * child.getPaddingTop());
int pos = holder.getPosition();
@@ -210,7 +216,7 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
int sectionBaseline = (int) (viewTopOffset + sectionBounds.y);
int x = mIsRtl ?
parent.getWidth() - mBackgroundPadding.left - mSectionNamesMargin :
- mBackgroundPadding.left;
+ mBackgroundPadding.left;
x += (int) ((mSectionNamesMargin - sectionBounds.x) / 2f);
int y = child.getTop() + sectionBaseline;
@@ -295,15 +301,6 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
}
/**
- * Returns whether to draw the divider for a given child.
- */
- private boolean shouldDrawItemDivider(ViewHolder holder,
- List<AlphabeticalAppsList.AdapterItem> items) {
- int pos = holder.getPosition();
- return items.get(pos).viewType == AllAppsGridAdapter.PREDICTION_ICON_VIEW_TYPE;
- }
-
- /**
* Returns whether to draw the section for the given child.
*/
private boolean shouldDrawItemSection(ViewHolder holder, int childIndex,
@@ -312,12 +309,12 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
AlphabeticalAppsList.AdapterItem item = items.get(pos);
// Ensure it's an icon
- if (item.viewType != AllAppsGridAdapter.ICON_VIEW_TYPE) {
+ if (item.viewType != AllAppsGridAdapter.VIEW_TYPE_ICON) {
return false;
}
// Draw the section header for the first item in each section
return (childIndex == 0) ||
- (items.get(pos - 1).viewType == AllAppsGridAdapter.SECTION_BREAK_VIEW_TYPE);
+ (items.get(pos - 1).viewType == AllAppsGridAdapter.VIEW_TYPE_SECTION_BREAK);
}
}
@@ -337,9 +334,8 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
private final int mSectionNamesMargin;
private final int mSectionHeaderOffset;
private final Paint mSectionTextPaint;
- private final Paint mPredictedAppsDividerPaint;
+ private int mAccentColor;
- private final int mPredictionBarDividerOffset;
private int mAppsPerRow;
private BindViewCallback mBindViewCallback;
@@ -351,8 +347,8 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
// The intent to send off to the market app, updated each time the search query changes.
private Intent mMarketSearchIntent;
- public AllAppsGridAdapter(Launcher launcher, AlphabeticalAppsList apps,
- View.OnClickListener iconClickListener, View.OnLongClickListener iconLongClickListener) {
+ public AllAppsGridAdapter(Launcher launcher, AlphabeticalAppsList apps, View.OnClickListener
+ iconClickListener, View.OnLongClickListener iconLongClickListener) {
Resources res = launcher.getResources();
mLauncher = launcher;
mApps = apps;
@@ -368,17 +364,24 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
mSectionHeaderOffset = res.getDimensionPixelSize(R.dimen.all_apps_grid_section_y_offset);
mIsRtl = Utilities.isRtl(res);
+ mAccentColor = Utilities.getColorAccent(launcher);
+
mSectionTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSectionTextPaint.setTextSize(res.getDimensionPixelSize(
R.dimen.all_apps_grid_section_text_size));
- mSectionTextPaint.setColor(Utilities.getColorAccent(launcher));
-
- mPredictedAppsDividerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mPredictedAppsDividerPaint.setStrokeWidth(Utilities.pxFromDp(1f, res.getDisplayMetrics()));
- mPredictedAppsDividerPaint.setColor(0x1E000000);
- mPredictionBarDividerOffset =
- (-res.getDimensionPixelSize(R.dimen.all_apps_prediction_icon_bottom_padding) +
- res.getDimensionPixelSize(R.dimen.all_apps_icon_top_bottom_padding)) / 2;
+ mSectionTextPaint.setColor(mAccentColor);
+ }
+
+ public static boolean isDividerViewType(int viewType) {
+ return isViewType(viewType, VIEW_TYPE_MASK_DIVIDER);
+ }
+
+ public static boolean isIconViewType(int viewType) {
+ return isViewType(viewType, VIEW_TYPE_MASK_ICON);
+ }
+
+ public static boolean isViewType(int viewType, int viewTypeMask) {
+ return (viewType & viewTypeMask) != 0;
}
/**
@@ -440,12 +443,13 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
- case SECTION_BREAK_VIEW_TYPE:
+ case VIEW_TYPE_SECTION_BREAK:
return new ViewHolder(new View(parent.getContext()));
- case ICON_VIEW_TYPE:
- case PREDICTION_ICON_VIEW_TYPE: {
+ case VIEW_TYPE_ICON:
+ /* falls through */
+ case VIEW_TYPE_PREDICTION_ICON: {
BubbleTextView icon = (BubbleTextView) mLayoutInflater.inflate(
- viewType == ICON_VIEW_TYPE ? R.layout.all_apps_icon :
+ viewType == VIEW_TYPE_ICON ? R.layout.all_apps_icon :
R.layout.all_apps_prediction_bar_icon, parent, false);
icon.setOnClickListener(mIconClickListener);
icon.setOnLongClickListener(mIconLongClickListener);
@@ -454,13 +458,10 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
icon.setOnFocusChangeListener(mIconFocusListener);
return new ViewHolder(icon);
}
- case EMPTY_SEARCH_VIEW_TYPE:
+ case VIEW_TYPE_EMPTY_SEARCH:
return new ViewHolder(mLayoutInflater.inflate(R.layout.all_apps_empty_search,
parent, false));
- case SEARCH_MARKET_DIVIDER_VIEW_TYPE:
- return new ViewHolder(mLayoutInflater.inflate(R.layout.all_apps_search_market_divider,
- parent, false));
- case SEARCH_MARKET_VIEW_TYPE:
+ case VIEW_TYPE_SEARCH_MARKET:
View searchMarketView = mLayoutInflater.inflate(R.layout.all_apps_search_market,
parent, false);
searchMarketView.setOnClickListener(new View.OnClickListener() {
@@ -470,6 +471,20 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
}
});
return new ViewHolder(searchMarketView);
+ case VIEW_TYPE_SEARCH_DIVIDER:
+ final View searchDivider =
+ mLayoutInflater.inflate(R.layout.all_apps_divider, parent, false);
+ searchDivider.setBackgroundColor(mAccentColor);
+ final GridLayoutManager.LayoutParams searchDividerParams =
+ (GridLayoutManager.LayoutParams) searchDivider.getLayoutParams();
+ searchDividerParams.topMargin = 0;
+ searchDivider.setLayoutParams(searchDividerParams);
+ return new ViewHolder(searchDivider);
+ case VIEW_TYPE_PREDICTION_DIVIDER:
+ /* falls through */
+ case VIEW_TYPE_SEARCH_MARKET_DIVIDER:
+ return new ViewHolder(mLayoutInflater.inflate(
+ R.layout.all_apps_divider, parent, false));
default:
throw new RuntimeException("Unexpected view type");
}
@@ -478,7 +493,7 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
- case ICON_VIEW_TYPE: {
+ case VIEW_TYPE_ICON: {
AppInfo info = mApps.getAdapterItems().get(position).appInfo;
BubbleTextView icon = (BubbleTextView) holder.mContent;
icon.applyFromApplicationInfo(info);
@@ -489,7 +504,7 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
icon.setAccessibilityDelegate(mLauncher.getAccessibilityDelegate());
break;
}
- case PREDICTION_ICON_VIEW_TYPE: {
+ case VIEW_TYPE_PREDICTION_ICON: {
AppInfo info = mApps.getAdapterItems().get(position).appInfo;
BubbleTextView icon = (BubbleTextView) holder.mContent;
icon.applyFromApplicationInfo(info);
@@ -500,13 +515,13 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter.
icon.setAccessibilityDelegate(mLauncher.getAccessibilityDelegate());
break;
}
- case EMPTY_SEARCH_VIEW_TYPE:
+ case VIEW_TYPE_EMPTY_SEARCH:
TextView emptyViewText = (TextView) holder.mContent;
emptyViewText.setText(mEmptySearchMessage);
emptyViewText.setGravity(mApps.hasNoFilteredResults() ? Gravity.CENTER :
Gravity.START | Gravity.CENTER_VERTICAL);
break;
- case SEARCH_MARKET_VIEW_TYPE:
+ case VIEW_TYPE_SEARCH_MARKET:
TextView searchView = (TextView) holder.mContent;
if (mMarketSearchIntent != null) {
searchView.setVisibility(View.VISIBLE);