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