1b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung/*
2b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * Copyright (C) 2010 The Android Open Source Project
3b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung *
4b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * you may not use this file except in compliance with the License.
6b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * You may obtain a copy of the License at
7b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung *
8b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung *
10b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * Unless required by applicable law or agreed to in writing, software
11b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * See the License for the specific language governing permissions and
14b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * limitations under the License.
15b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung */
16b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung
17b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chungpackage com.android.launcher2;
18b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung
19b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chungimport android.content.Context;
20b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chungimport android.graphics.Bitmap;
21b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chungimport android.util.AttributeSet;
224c4c001a85d8e1533c8df38a0c0d27bb959ebc70Michael Jurkaimport android.widget.TextView;
23c84001ec67236c070875324fb77f04ce63b46885Winson Chung
24b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung/**
25b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
26b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung * drawables on the top).
27b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung */
2882369a16126a1030c1c9203dc62b33c2598add89Michael Jurkapublic class PagedViewIcon extends TextView {
29e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    /** A simple callback interface to allow a PagedViewIcon to notify when it has been pressed */
30e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    public static interface PressedCallback {
31e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        void iconPressed(PagedViewIcon icon);
32e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    }
33e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung
343a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka    @SuppressWarnings("unused")
35b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung    private static final String TAG = "PagedViewIcon";
36e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    private static final float PRESS_ALPHA = 0.4f;
37e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung
38e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    private PagedViewIcon.PressedCallback mPressedCallback;
393b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung    private boolean mLockDrawableState = false;
40b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung
410620bec8406c0f247a1f8d16c9963d08addbb9a2Michael Jurka    private Bitmap mIcon;
42b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung
43b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung    public PagedViewIcon(Context context) {
44b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung        this(context, null);
45b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung    }
46b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung
47b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung    public PagedViewIcon(Context context, AttributeSet attrs) {
48b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung        this(context, attrs, 0);
49b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung    }
50b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung
51b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung    public PagedViewIcon(Context context, AttributeSet attrs, int defStyle) {
52b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung        super(context, attrs, defStyle);
538245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
548245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
55e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    public void applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp,
56e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            PagedViewIcon.PressedCallback cb) {
57c9a961952d1a057029874f8426b90181f6876034Michael Jurka        mIcon = info.iconBitmap;
58e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        mPressedCallback = cb;
590620bec8406c0f247a1f8d16c9963d08addbb9a2Michael Jurka        setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
60241c3b451d7841ba08247beea784953eca4e8582Winson Chung        setText(info.title);
61241c3b451d7841ba08247beea784953eca4e8582Winson Chung        setTag(info);
62241c3b451d7841ba08247beea784953eca4e8582Winson Chung    }
63e3517d01ecb844b498d5862df07bc2177861806aMichael Jurka
643b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung    public void lockDrawableState() {
653b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung        mLockDrawableState = true;
663b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung    }
673b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung
68e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    public void resetDrawableState() {
693b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung        mLockDrawableState = false;
70e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        post(new Runnable() {
71e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            @Override
72e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            public void run() {
73e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung                refreshDrawableState();
74e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            }
75e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        });
76e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung    }
77e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung
78e3517d01ecb844b498d5862df07bc2177861806aMichael Jurka    protected void drawableStateChanged() {
79e3517d01ecb844b498d5862df07bc2177861806aMichael Jurka        super.drawableStateChanged();
80e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung
81e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        // We keep in the pressed state until resetDrawableState() is called to reset the press
82e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        // feedback
83e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        if (isPressed()) {
84e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            setAlpha(PRESS_ALPHA);
85e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            if (mPressedCallback != null) {
86e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung                mPressedCallback.iconPressed(this);
87e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            }
883b187b88baf80e520f6bd32d60abe6460d28a040Winson Chung        } else if (!mLockDrawableState) {
89e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung            setAlpha(1f);
90e4e506660ba93ae2c4f1cb0b41378cf148c85e2bWinson Chung        }
91e3517d01ecb844b498d5862df07bc2177861806aMichael Jurka    }
92b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung}
93