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