diff --git a/res/layout/widget_cell.xml b/res/layout/widget_cell.xml index ab23b842ed..196dfca666 100644 --- a/res/layout/widget_cell.xml +++ b/res/layout/widget_cell.xml @@ -19,10 +19,11 @@ android:layout_width="@dimen/widget_preview_container_width" android:layout_height="@dimen/widget_cell_height" android:layout_weight="1" - android:layout_marginRight="@dimen/widget_row_divider" + android:layout_marginEnd="@dimen/widget_row_divider" android:orientation="vertical" android:background="@color/widgets_cell_color" - android:focusable="true"> + android:focusable="true" + android:gravity="center_horizontal"> - - + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 0d066bb7a2..5447371a4f 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -88,7 +88,7 @@ 8dp - 120dp + 130dp 8dp 8dp 8dp @@ -100,10 +100,10 @@ 16dp - 136dp + 146dp 150dp 8dp - 1dp + 2dp 0dp diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 918517ebd3..c1dd85961f 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -80,12 +80,11 @@ public class DeviceProfile { int defaultLayoutId; boolean isLandscape; - boolean isTablet; - boolean isLargeTablet; + public boolean isTablet; + public boolean isLargeTablet; public boolean isLayoutRtl; boolean transposeLayoutWithOrientation; - int desiredWorkspaceLeftRightMarginPx; public int edgeMarginPx; Rect defaultWidgetPadding; diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index 27b7e6df5d..877937151b 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -49,7 +49,16 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { private static final boolean DEBUG = false; private static final int FADE_IN_DURATION_MS = 90; - private int mPresetPreviewSize; + + /** Widget cell width is calculated by multiplying this factor to grid cell width. */ + private static final float WIDTH_SCALE = 2.8f; + + /** Widget preview width is calculated by multiplying this factor to the widget cell width. */ + private static final float PREVIEW_SCALE = 0.9f; + + private static int mPresetPreviewSize; + private static int mSize; + private static int mDividerWidth; private ImageView mWidgetImage; private TextView mWidgetName; @@ -76,12 +85,22 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { final Resources r = context.getResources(); mDimensionsFormatString = r.getString(R.string.widget_dims_format); - mPresetPreviewSize = r.getDimensionPixelSize(R.dimen.widget_preview_size); + setContainerWidth(); setWillNotDraw(false); setClipToPadding(false); setAccessibilityDelegate(LauncherAppState.getInstance().getAccessibilityDelegate()); + } + private void setContainerWidth() { + // Do nothing if already set + if (mSize > 0) { + return; + } + DeviceProfile profile = LauncherAppState.getInstance().getDynamicGrid().getDeviceProfile(); + mSize = (int) (profile.cellWidthPx * WIDTH_SCALE); + mPresetPreviewSize = (int) (profile.cellWidthPx * WIDTH_SCALE * PREVIEW_SCALE); + mDividerWidth = getResources().getDimensionPixelSize(R.dimen.widget_row_divider); } @Override @@ -98,6 +117,12 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { mWidgetDims = ((TextView) findViewById(R.id.widget_dims)); } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(mSize, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(mSize, MeasureSpec.EXACTLY)); + } + /** * Called to clear the view and free attached resources. (e.g., {@link Bitmap} */ @@ -108,6 +133,7 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { mWidgetImage.setImageDrawable(null); mWidgetName.setText(null); mWidgetDims.setText(null); + setSeparator(true); if (mActiveRequest != null) { mActiveRequest.cleanup(); @@ -228,4 +254,11 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { } return ""; } + + public void setSeparator(boolean enable) { + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams(); + lp.setMarginEnd(enable? mDividerWidth : 0); + setLayoutParams(lp); + requestLayout(); + } } diff --git a/src/com/android/launcher3/widget/WidgetRowView.java b/src/com/android/launcher3/widget/WidgetRowView.java new file mode 100644 index 0000000000..05760ae48d --- /dev/null +++ b/src/com/android/launcher3/widget/WidgetRowView.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 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. + */ + +package com.android.launcher3.widget; + +import android.content.Context; +import android.content.res.Resources; +import android.util.AttributeSet; +import android.widget.LinearLayout; + + +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.DynamicGrid; +import com.android.launcher3.LauncherAppState; + +/** + * Represents the individual cell of the widget inside the widget tray. + */ +public class WidgetRowView extends LinearLayout { + + private static final int PRESET_INDENT_SIZE_TABLET = 56; + + /** Widget row width is calculated by multiplying this factor to grid cell width. */ + private static final float HEIGHT_SCALE = 2.8f; + + static int sIndent = 0; + static int sHeight = 0; + + public WidgetRowView(Context context) { + this(context, null); + } + + public WidgetRowView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public WidgetRowView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setContainerHeight(); + setWillNotDraw(false); + setClipToPadding(false); + setAccessibilityDelegate(LauncherAppState.getInstance().getAccessibilityDelegate()); + } + + /** + * Sets the widget cell container size based on the physical dimension of the device. + */ + private void setContainerHeight() { + // Do nothing if already set + if (sHeight > 0) { + return; + } + + Resources r = getResources(); + DeviceProfile profile = LauncherAppState.getInstance().getDynamicGrid().getDeviceProfile(); + if (profile.isLargeTablet || profile.isTablet) { + sIndent = DynamicGrid.pxFromDp(PRESET_INDENT_SIZE_TABLET, r.getDisplayMetrics()); + } + sHeight = (int) (profile.cellWidthPx * HEIGHT_SCALE); + } +} diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java index a7728a11b7..8b0a43b2f4 100644 --- a/src/com/android/launcher3/widget/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java @@ -23,6 +23,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import com.android.launcher3.IconCache; @@ -105,6 +106,10 @@ public class WidgetsListAdapter extends Adapter { // set up touch. widget.setOnClickListener(mIconClickListener); widget.setOnLongClickListener(mIconLongClickListener); + // Add a devider if it is not the last item. + if (i == diff - 1) { + widget.setSeparator(false); + } row.addView(widget); } } else if (diff < 0) { @@ -156,6 +161,11 @@ public class WidgetsListAdapter extends Adapter { ViewGroup container = (ViewGroup) mLayoutInflater.inflate( R.layout.widgets_list_row_view, parent, false); + WidgetRowView row = (WidgetRowView) container.findViewById(R.id.widget_row); + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) row.getLayoutParams(); + lp.setMarginStart(WidgetRowView.sIndent); + lp.height = WidgetRowView.sHeight; + row.setLayoutParams(lp); return new WidgetsRowViewHolder(container); }