WidgetCell.java revision 78b19667dad912ee6aadb9699c21e33c39ec550f
129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/*
23f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song * Copyright (C) 2015 The Android Open Source Project
329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung *
429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * you may not use this file except in compliance with the License.
629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * You may obtain a copy of the License at
729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung *
829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung *
1029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Unless required by applicable law or agreed to in writing, software
1129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
1229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * See the License for the specific language governing permissions and
1429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * limitations under the License.
1529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */
1629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
173f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songpackage com.android.launcher3.widget;
1829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
1929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.Context;
2029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.pm.PackageManager;
2129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.pm.ResolveInfo;
2259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungimport android.content.res.Resources;
235b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyalimport android.graphics.Bitmap;
24c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chungimport android.graphics.Rect;
2529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.util.AttributeSet;
263f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport android.util.Log;
27ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohenimport android.view.View;
285b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyalimport android.view.View.OnLayoutChangeListener;
2929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.ImageView;
3029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.LinearLayout;
3129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.TextView;
3229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
333f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.DeviceProfile;
343f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.FastBitmapDrawable;
353f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.ItemInfo;
363f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.LauncherAppState;
373f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.LauncherAppWidgetProviderInfo;
383f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.R;
393f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.WidgetPreviewLoader;
405b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyalimport com.android.launcher3.WidgetPreviewLoader.PreviewLoadRequest;
41ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyalimport com.android.launcher3.compat.AppWidgetManagerCompat;
42ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal
4329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/**
44b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song * Represents the individual cell of the widget inside the widget tray.
4529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */
463f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songpublic class WidgetCell extends LinearLayout implements OnLayoutChangeListener {
4729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
484e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song    private static final String TAG = "WidgetCell";
493f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    private static final boolean DEBUG = false;
503f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song
51f17a1c9ad99d46a65de797422fd439382114b348Hyunyoung Song    private static final int FADE_IN_DURATION_MS = 90;
524b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song
534b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song    /** Widget cell width is calculated by multiplying this factor to grid cell width. */
545cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song    private static final float WIDTH_SCALE = 2.6f;
554b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song
564b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song    /** Widget preview width is calculated by multiplying this factor to the widget cell width. */
575cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song    private static final float PREVIEW_SCALE = 0.8f;
584b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song
595cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song    private int mPresetPreviewSize;
605cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song    int cellSize;
613f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song
62b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song    private ImageView mWidgetImage;
63b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song    private TextView mWidgetName;
64b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song    private TextView mWidgetDims;
656babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song    private final Rect mOrigImgPadding = new Rect();
665b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal
675b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    private String mDimensionsFormatString;
685b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    private boolean mIsAppWidget;
6905713af127d765cc28a8b2fd548a90347c90d6cbMichael Jurka    private Object mInfo;
705b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal
713f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka    private WidgetPreviewLoader mWidgetPreviewLoader;
725b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    private PreviewLoadRequest mActiveRequest;
730499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
743f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public WidgetCell(Context context) {
7529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung        this(context, null);
7629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung    }
7729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
783f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public WidgetCell(Context context, AttributeSet attrs) {
7929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung        this(context, attrs, 0);
8029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung    }
8129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
823f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public WidgetCell(Context context, AttributeSet attrs, int defStyle) {
8329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung        super(context, attrs, defStyle);
8429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
8559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung        final Resources r = context.getResources();
8663257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung        mDimensionsFormatString = r.getString(R.string.widget_dims_format);
8759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung
884b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song        setContainerWidth();
8929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung        setWillNotDraw(false);
9029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung        setClipToPadding(false);
9171b5c0b988a64b3a0613ded5403749bc537ee8a5Sunny Goyal        setAccessibilityDelegate(LauncherAppState.getInstance().getAccessibilityDelegate());
924b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song    }
933f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song
944b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song    private void setContainerWidth() {
954b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song        DeviceProfile profile = LauncherAppState.getInstance().getDynamicGrid().getDeviceProfile();
965cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song        cellSize = (int) (profile.cellWidthPx * WIDTH_SCALE);
974b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song        mPresetPreviewSize = (int) (profile.cellWidthPx * WIDTH_SCALE * PREVIEW_SCALE);
9829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung    }
9929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
100c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung    @Override
101c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung    protected void onFinishInflate() {
102c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung        super.onFinishInflate();
103c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung
104b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetImage = (ImageView) findViewById(R.id.widget_preview);
1056babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song        mOrigImgPadding.left = mWidgetImage.getPaddingLeft();
1066babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song        mOrigImgPadding.top = mWidgetImage.getPaddingTop();
1076babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song        mOrigImgPadding.right = mWidgetImage.getPaddingRight();
1086babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song        mOrigImgPadding.bottom = mWidgetImage.getPaddingBottom();
109c58497ee619416c4949b16eb43486c11618b69e5Winson Chung
110b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetName = ((TextView) findViewById(R.id.widget_name));
111b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetDims = ((TextView) findViewById(R.id.widget_dims));
1124e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song    }
1134e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song
114559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song    /**
115559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song     * Called to clear the view and free attached resources. (e.g., {@link Bitmap}
116559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song     */
117559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song    public void clear() {
118559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song        if (DEBUG) {
119559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song            Log.d(TAG, "reset called on:" + mWidgetName.getText());
120559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song        }
121b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetImage.setImageDrawable(null);
122b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetName.setText(null);
123b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetDims.setText(null);
124f17a1c9ad99d46a65de797422fd439382114b348Hyunyoung Song
125559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song        if (mActiveRequest != null) {
126559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song            mActiveRequest.cleanup();
127559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song            mActiveRequest = null;
128559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song        }
129099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung    }
130099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung
131b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song    /**
132b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song     * Apply the widget provider info to the view.
133b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song     */
1345940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen    public void applyFromAppWidgetProviderInfo(LauncherAppWidgetProviderInfo info,
1355940042d39b576553c2499bcf3d0641281e6ad52Adam Cohen            int maxWidth, WidgetPreviewLoader loader) {
136892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung        LauncherAppState app = LauncherAppState.getInstance();
137892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung        DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
138892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung
139dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka        mIsAppWidget = true;
14005713af127d765cc28a8b2fd548a90347c90d6cbMichael Jurka        mInfo = info;
1414b576be59e58072cc03b5a8d36afb6a322513575Winson Chung        if (maxWidth > -1) {
142b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song            mWidgetImage.setMaxWidth(maxWidth);
14335d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung        }
144b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        // TODO(hyunyoungs): setup a cache for these labels.
145b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetName.setText(AppWidgetManagerCompat.getInstance(getContext()).loadLabel(info));
14678b19667dad912ee6aadb9699c21e33c39ec550fWinson Chung        int hSpan = Math.min(info.spanX, grid.numColumns);
14778b19667dad912ee6aadb9699c21e33c39ec550fWinson Chung        int vSpan = Math.min(info.spanY, grid.numRows);
148b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetDims.setText(String.format(mDimensionsFormatString, hSpan, vSpan));
1493f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka        mWidgetPreviewLoader = loader;
15029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung    }
15129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung
152b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song    /**
153b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song     * Apply the resolve info to the view.
154b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song     */
1553f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka    public void applyFromResolveInfo(
1563f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka            PackageManager pm, ResolveInfo info, WidgetPreviewLoader loader) {
157dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka        mIsAppWidget = false;
15805713af127d765cc28a8b2fd548a90347c90d6cbMichael Jurka        mInfo = info;
1596a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung        CharSequence label = info.loadLabel(pm);
160b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetName.setText(label);
161b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song        mWidgetDims.setText(String.format(mDimensionsFormatString, 1, 1));
1623f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka        mWidgetPreviewLoader = loader;
163b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung    }
1640499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung
165038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka    public int[] getPreviewSize() {
166038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka        int[] maxSize = new int[2];
1676babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song
1683f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        maxSize[0] = mPresetPreviewSize;
1693f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        maxSize[1] = mPresetPreviewSize;
170038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka        return maxSize;
171038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka    }
172038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka
1735b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    public void applyPreview(Bitmap bitmap) {
1745b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        FastBitmapDrawable preview = new FastBitmapDrawable(bitmap);
1756babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song
176e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung        if (preview != null) {
177b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song            mWidgetImage.setImageDrawable(preview);
1786babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song
179dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka            if (mIsAppWidget) {
180dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka                // center horizontally
181dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka                int[] imageSize = getPreviewSize();
182dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka                int centerAmount = (imageSize[0] - preview.getIntrinsicWidth()) / 2;
1836babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song                mWidgetImage.setPadding(mOrigImgPadding.left + centerAmount,
1846babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song                        mOrigImgPadding.top,
1856babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song                        mOrigImgPadding.right,
1866babf2e27e6260f02751413b8f7a55e46659af27Hyunyoung Song                        mOrigImgPadding.bottom);
187dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka            }
188b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song            mWidgetImage.setAlpha(0f);
189b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song            mWidgetImage.animate().alpha(1.0f).setDuration(FADE_IN_DURATION_MS);
190ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        }
191ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    }
192ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
1935b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    public void ensurePreview() {
1945b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        if (mActiveRequest != null) {
1955b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal            return;
1965b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        }
1975b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        int[] size = getPreviewSize();
1983f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        if (DEBUG) {
1993f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song            Log.d(TAG, String.format("[tag=%s] ensurePreview (%d, %d):",
2003f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song                    getTagToString(), size[0], size[1]));
2013f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        }
20278b19667dad912ee6aadb9699c21e33c39ec550fWinson Chung        mActiveRequest = mWidgetPreviewLoader.getPreview(mInfo, size[0], size[1], this);
2035b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    }
2045b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal
2055b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    @Override
2065b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
2075b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal            int oldTop, int oldRight, int oldBottom) {
2085b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        removeOnLayoutChangeListener(this);
2095b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        ensurePreview();
2105b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    }
2115b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal
2125b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    public int getActualItemWidth() {
2135b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        ItemInfo info = (ItemInfo) getTag();
2145b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        int[] size = getPreviewSize();
2155b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        int cellWidth = LauncherAppState.getInstance()
2165b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal                .getDynamicGrid().getDeviceProfile().cellWidthPx;
2175b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal
2185b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal        return Math.min(size[0], info.spanX * cellWidth);
2195b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal    }
2203f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song
2213f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    /**
2223f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song     * Helper method to get the string info of the tag.
2233f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song     */
2243f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    private String getTagToString() {
22582b016cb56540fe26213e817dd0dd668099c8e20Winson Chung        if (getTag() instanceof PendingAddWidgetInfo ||
22682b016cb56540fe26213e817dd0dd668099c8e20Winson Chung                getTag() instanceof PendingAddShortcutInfo) {
22782b016cb56540fe26213e817dd0dd668099c8e20Winson Chung            return getTag().toString();
2283f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        }
2293f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song        return "";
2303f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    }
23129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung}
232