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; 205b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyalimport android.graphics.Bitmap; 21c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyalimport android.os.CancellationSignal; 2229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.util.AttributeSet; 233f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport android.util.Log; 24ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellorimport android.view.MotionEvent; 25ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohenimport android.view.View; 265b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyalimport android.view.View.OnLayoutChangeListener; 2765513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyalimport android.view.ViewGroup; 28f00d02b254d94eeaf52742e0640e9eacd63fafcaHyunyoung Songimport android.view.ViewPropertyAnimator; 2929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.LinearLayout; 3029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.TextView; 3129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 32278359539c02ca160caf1df54ce96053a2a2ef59Sunny Goyalimport com.android.launcher3.BaseActivity; 333f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.DeviceProfile; 343f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.R; 35c13403c612748bfdf06436510600230c4c4b55ecSunny Goyalimport com.android.launcher3.SimpleOnStylusPressListener; 36ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellorimport com.android.launcher3.StylusEventHelper; 373f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songimport com.android.launcher3.WidgetPreviewLoader; 38a2441e88ff862714d823d6c786b2d563047f75fcSunny Goyalimport com.android.launcher3.graphics.DrawableFactory; 394ddc40130aa0460924364eab3557088421eebe0cSunny Goyalimport com.android.launcher3.model.WidgetItem; 40ffe83f13319cdb833a25596d47cf1af098cc4c60Sunny Goyal 4129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/** 42f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * Represents the individual cell of the widget inside the widget tray. The preview is drawn 43f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * horizontally centered, and scaled down if needed. 44f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * 45f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * This view does not support padding. Since the image is scaled down to fit the view, padding will 46f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * further decrease the scaling factor. Drag-n-drop uses the view bounds for showing a smooth 47f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * transition from the view to drag view, so when adding padding support, DnD would need to 48f52abd7758b8f245522936e941336e574debabf5Sunny Goyal * consider the appropriate scaling factor. 4929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */ 503f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Songpublic class WidgetCell extends LinearLayout implements OnLayoutChangeListener { 5129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 524e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song private static final String TAG = "WidgetCell"; 533f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song private static final boolean DEBUG = false; 543f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 55f17a1c9ad99d46a65de797422fd439382114b348Hyunyoung Song private static final int FADE_IN_DURATION_MS = 90; 564b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song 574b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song /** Widget cell width is calculated by multiplying this factor to grid cell width. */ 585cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song private static final float WIDTH_SCALE = 2.6f; 594b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song 604b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song /** Widget preview width is calculated by multiplying this factor to the widget cell width. */ 615cd1d92f6c40b47eff12859d4e13b6431aa778c0Hyunyoung Song private static final float PREVIEW_SCALE = 0.8f; 624b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song 63c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal protected int mPresetPreviewSize; 6465513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal private int mCellSize; 653f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 66f52abd7758b8f245522936e941336e574debabf5Sunny Goyal private WidgetImageView mWidgetImage; 67b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song private TextView mWidgetName; 68b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song private TextView mWidgetDims; 695b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal 70c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal protected WidgetItem mItem; 715b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal 723f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka private WidgetPreviewLoader mWidgetPreviewLoader; 73ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor private StylusEventHelper mStylusEventHelper; 740499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 75c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal protected CancellationSignal mActiveRequest; 7650e5165b78c75ccb022f0954699f49c579547115Tony Wickham private boolean mAnimatePreview = true; 77c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal 78c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal protected final BaseActivity mActivity; 792e6da1539bc7286336b3c24d96ab76434939ce4dAdam Cohen 803f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public WidgetCell(Context context) { 8129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, null); 8229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 8329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 843f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public WidgetCell(Context context, AttributeSet attrs) { 8529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, attrs, 0); 8629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 8729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 883f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song public WidgetCell(Context context, AttributeSet attrs, int defStyle) { 8929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super(context, attrs, defStyle); 9029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 91278359539c02ca160caf1df54ce96053a2a2ef59Sunny Goyal mActivity = BaseActivity.fromContext(context); 92bb83520a620919a8f19472ba4426585d007d1abaMady Mellor mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); 9359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 944b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song setContainerWidth(); 9529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setWillNotDraw(false); 9629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setClipToPadding(false); 97278359539c02ca160caf1df54ce96053a2a2ef59Sunny Goyal setAccessibilityDelegate(mActivity.getAccessibilityDelegate()); 984b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song } 993f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song 1004b69f2ca91d63a59dfa921ba965b92de7f604f5aHyunyoung Song private void setContainerWidth() { 101278359539c02ca160caf1df54ce96053a2a2ef59Sunny Goyal DeviceProfile profile = mActivity.getDeviceProfile(); 10265513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal mCellSize = (int) (profile.cellWidthPx * WIDTH_SCALE); 10365513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal mPresetPreviewSize = (int) (mCellSize * PREVIEW_SCALE); 10429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 10529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 106c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung @Override 107c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung protected void onFinishInflate() { 108c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung super.onFinishInflate(); 109c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung 110f52abd7758b8f245522936e941336e574debabf5Sunny Goyal mWidgetImage = (WidgetImageView) findViewById(R.id.widget_preview); 111b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song mWidgetName = ((TextView) findViewById(R.id.widget_name)); 112b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song mWidgetDims = ((TextView) findViewById(R.id.widget_dims)); 1134e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song } 1144e8fb91cf19b7d621de8cbed2bde2c8dac734121Hyunyoung Song 115559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song /** 116559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song * Called to clear the view and free attached resources. (e.g., {@link Bitmap} 117559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song */ 118559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song public void clear() { 119559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song if (DEBUG) { 120559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song Log.d(TAG, "reset called on:" + mWidgetName.getText()); 121559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song } 1222d58471e8d3da621e209cec58a43d159778f8a0eWinson Chung mWidgetImage.animate().cancel(); 123a2441e88ff862714d823d6c786b2d563047f75fcSunny Goyal mWidgetImage.setBitmap(null, null); 124b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song mWidgetName.setText(null); 125b99ff3e83270e113f6182e337c4f7b0223bad92bHyunyoung Song mWidgetDims.setText(null); 126f17a1c9ad99d46a65de797422fd439382114b348Hyunyoung Song 127559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song if (mActiveRequest != null) { 128c65a0085d77edd8e8821254f081eb94e9dcc5e75Sunny Goyal mActiveRequest.cancel(); 129559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song mActiveRequest = null; 130559d90d0dafbac1d97a1e6f18062309831a25d51Hyunyoung Song } 131099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung } 132099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung 1334ddc40130aa0460924364eab3557088421eebe0cSunny Goyal public void applyFromCellItem(WidgetItem item, WidgetPreviewLoader loader) { 1344ddc40130aa0460924364eab3557088421eebe0cSunny Goyal mItem = item; 1354ddc40130aa0460924364eab3557088421eebe0cSunny Goyal mWidgetName.setText(mItem.label); 1364ddc40130aa0460924364eab3557088421eebe0cSunny Goyal mWidgetDims.setText(getContext().getString(R.string.widget_dims_format, 1374ddc40130aa0460924364eab3557088421eebe0cSunny Goyal mItem.spanX, mItem.spanY)); 1386c61323998edccbc28dc9f31602594e4f32e1215Jon Miranda mWidgetDims.setContentDescription(getContext().getString( 1396c61323998edccbc28dc9f31602594e4f32e1215Jon Miranda R.string.widget_accessible_dims_format, mItem.spanX, mItem.spanY)); 140d31dcbcc7c7901959c65c4e635e59274a1d4c334Hyunyoung Song mWidgetPreviewLoader = loader; 141d31dcbcc7c7901959c65c4e635e59274a1d4c334Hyunyoung Song 1424ddc40130aa0460924364eab3557088421eebe0cSunny Goyal if (item.activityInfo != null) { 1434ddc40130aa0460924364eab3557088421eebe0cSunny Goyal setTag(new PendingAddShortcutInfo(item.activityInfo)); 1444ddc40130aa0460924364eab3557088421eebe0cSunny Goyal } else { 145a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal setTag(new PendingAddWidgetInfo(item.widgetInfo)); 1464ddc40130aa0460924364eab3557088421eebe0cSunny Goyal } 147b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 1480499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 149b38fab75735c601b61765ecae61494c8637aaef4Sunny Goyal public WidgetImageView getWidgetView() { 150b38fab75735c601b61765ecae61494c8637aaef4Sunny Goyal return mWidgetImage; 151038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka } 152038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka 15350e5165b78c75ccb022f0954699f49c579547115Tony Wickham public void setAnimatePreview(boolean shouldAnimate) { 15450e5165b78c75ccb022f0954699f49c579547115Tony Wickham mAnimatePreview = shouldAnimate; 15550e5165b78c75ccb022f0954699f49c579547115Tony Wickham } 15650e5165b78c75ccb022f0954699f49c579547115Tony Wickham 1575b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal public void applyPreview(Bitmap bitmap) { 15826b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham applyPreview(bitmap, true); 15926b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham } 16026b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham 16126b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham public void applyPreview(Bitmap bitmap, boolean animate) { 162f52abd7758b8f245522936e941336e574debabf5Sunny Goyal if (bitmap != null) { 163a2441e88ff862714d823d6c786b2d563047f75fcSunny Goyal mWidgetImage.setBitmap(bitmap, 164a2441e88ff862714d823d6c786b2d563047f75fcSunny Goyal DrawableFactory.get(getContext()).getBadgeForUser(mItem.user, getContext())); 16550e5165b78c75ccb022f0954699f49c579547115Tony Wickham if (mAnimatePreview) { 16650e5165b78c75ccb022f0954699f49c579547115Tony Wickham mWidgetImage.setAlpha(0f); 16750e5165b78c75ccb022f0954699f49c579547115Tony Wickham ViewPropertyAnimator anim = mWidgetImage.animate(); 16850e5165b78c75ccb022f0954699f49c579547115Tony Wickham anim.alpha(1.0f).setDuration(FADE_IN_DURATION_MS); 16950e5165b78c75ccb022f0954699f49c579547115Tony Wickham } else { 17050e5165b78c75ccb022f0954699f49c579547115Tony Wickham mWidgetImage.setAlpha(1f); 17150e5165b78c75ccb022f0954699f49c579547115Tony Wickham } 172ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 173ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 174ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 1755b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal public void ensurePreview() { 17626b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham ensurePreview(true); 17726b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham } 17826b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham 17926b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham public void ensurePreview(boolean animate) { 1805b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal if (mActiveRequest != null) { 1815b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal return; 1825b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal } 183b38fab75735c601b61765ecae61494c8637aaef4Sunny Goyal mActiveRequest = mWidgetPreviewLoader.getPreview( 18426b1746593851e239bfff65ae7a69b809ad87b99Tony Wickham mItem, mPresetPreviewSize, mPresetPreviewSize, this, animate); 1855b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal } 1865b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal 1875b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal @Override 1885b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, 1895b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal int oldTop, int oldRight, int oldBottom) { 1905b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal removeOnLayoutChangeListener(this); 1915b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal ensurePreview(); 1925b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal } 1935b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal 194ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor @Override 195ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor public boolean onTouchEvent(MotionEvent ev) { 196ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor boolean handled = super.onTouchEvent(ev); 197bb83520a620919a8f19472ba4426585d007d1abaMady Mellor if (mStylusEventHelper.onMotionEvent(ev)) { 198ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor return true; 199ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor } 200ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor return handled; 201ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor } 202ef044dd380ac3abf354027750efdc16d5d48ac70Mady Mellor 2033f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song /** 2043f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song * Helper method to get the string info of the tag. 2053f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song */ 2063f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song private String getTagToString() { 20782b016cb56540fe26213e817dd0dd668099c8e20Winson Chung if (getTag() instanceof PendingAddWidgetInfo || 20882b016cb56540fe26213e817dd0dd668099c8e20Winson Chung getTag() instanceof PendingAddShortcutInfo) { 20982b016cb56540fe26213e817dd0dd668099c8e20Winson Chung return getTag().toString(); 2103f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song } 2113f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song return ""; 2123f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song } 2136d02c7a0337d37e5b1c596a4acec0c292a9b7f93Sunny Goyal 2146d02c7a0337d37e5b1c596a4acec0c292a9b7f93Sunny Goyal @Override 21565513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal public void setLayoutParams(ViewGroup.LayoutParams params) { 21665513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal params.width = params.height = mCellSize; 21765513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal super.setLayoutParams(params); 21865513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal } 21965513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal 22065513ba58c7d22bae2db82be6a2bfd243d844be9Sunny Goyal @Override 2216d02c7a0337d37e5b1c596a4acec0c292a9b7f93Sunny Goyal public CharSequence getAccessibilityClassName() { 2226d02c7a0337d37e5b1c596a4acec0c292a9b7f93Sunny Goyal return WidgetCell.class.getName(); 2236d02c7a0337d37e5b1c596a4acec0c292a9b7f93Sunny Goyal } 22429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung} 225