1ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes/*
2ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * Copyright (C) 2016 The Android Open Source Project
3ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes *
4ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * you may not use this file except in compliance with the License.
6ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * You may obtain a copy of the License at
7ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes *
8ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes *
10ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * Unless required by applicable law or agreed to in writing, software
11ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * See the License for the specific language governing permissions and
14ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * limitations under the License.
15ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes */
16ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
17ddf46923b9487ac3a021f01b55d96136d811e8beChris Banespackage android.support.design.widget;
18ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
21ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.content.Context;
22c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
23ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.AccessibilityDelegateCompat;
24ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.ViewCompat;
25ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.accessibility.AccessibilityEventCompat;
26ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
27ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v7.widget.AppCompatImageButton;
28ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.util.AttributeSet;
29ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.view.View;
30ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.view.accessibility.AccessibilityEvent;
31ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.widget.Checkable;
32ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
33ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes/**
34ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * @hide
35ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes */
368e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP)
37ddf46923b9487ac3a021f01b55d96136d811e8beChris Banespublic class CheckableImageButton extends AppCompatImageButton implements Checkable {
38ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
39ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    private static final int[] DRAWABLE_STATE_CHECKED = new int[]{android.R.attr.state_checked};
40ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
41ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    private boolean mChecked;
42ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
43ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public CheckableImageButton(Context context) {
44ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        this(context, null);
45ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
46ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
47ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public CheckableImageButton(Context context, AttributeSet attrs) {
48ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        this(context, attrs, android.support.v7.appcompat.R.attr.imageButtonStyle);
49ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
50ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
51ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public CheckableImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
52ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        super(context, attrs, defStyleAttr);
53ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
54ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() {
55ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            @Override
56ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
57ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                super.onInitializeAccessibilityEvent(host, event);
58ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                event.setChecked(isChecked());
59ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            }
60ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
61ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            @Override
62ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            public void onInitializeAccessibilityNodeInfo(View host,
63ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                    AccessibilityNodeInfoCompat info) {
64ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                super.onInitializeAccessibilityNodeInfo(host, info);
65ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                info.setCheckable(true);
66ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                info.setChecked(isChecked());
67ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            }
68ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        });
69ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
70ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
71ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    @Override
72ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public void setChecked(boolean checked) {
73ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        if (mChecked != checked) {
74ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            mChecked = checked;
75ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            refreshDrawableState();
76ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            sendAccessibilityEvent(
77ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                    AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
78ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        }
79ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
80ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
81ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    @Override
82ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public boolean isChecked() {
83ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        return mChecked;
84ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
85ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
86ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    @Override
87ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public void toggle() {
88ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        setChecked(!mChecked);
89ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
90ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes
91ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    @Override
92ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    public int[] onCreateDrawableState(int extraSpace) {
93ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        if (mChecked) {
94ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            return mergeDrawableStates(
95ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                    super.onCreateDrawableState(extraSpace + DRAWABLE_STATE_CHECKED.length),
96ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes                    DRAWABLE_STATE_CHECKED);
97ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        } else {
98ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes            return super.onCreateDrawableState(extraSpace);
99ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes        }
100ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes    }
101ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes}
102