100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam/*
200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Copyright (C) 2016 The Android Open Source Project
300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam *
400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Licensed under the Apache License, Version 2.0 (the "License");
500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * you may not use this file except in compliance with the License.
600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * You may obtain a copy of the License at
700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam *
800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam *      http://www.apache.org/licenses/LICENSE-2.0
900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam *
1000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Unless required by applicable law or agreed to in writing, software
1100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * distributed under the License is distributed on an "AS IS" BASIS,
1200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * See the License for the specific language governing permissions and
1400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * limitations under the License.
1500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam */
1600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
1700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lampackage com.android.setupwizardlib.items;
1800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
192831318df83781bb5bada256e35726612d225052Maurice Lamimport android.annotation.SuppressLint;
2000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.content.Context;
2100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.content.res.TypedArray;
2200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.util.AttributeSet;
2300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.view.ContextThemeWrapper;
242831318df83781bb5bada256e35726612d225052Maurice Lamimport android.view.LayoutInflater;
2500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.view.View;
2600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.view.ViewGroup;
2700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.widget.Button;
2800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
2900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport com.android.setupwizardlib.R;
3000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
3100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam/**
3200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Description of a button inside {@link com.android.setupwizardlib.items.ButtonBarItem}. This item
3300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * will not be bound by the adapter, and must be a child of {@code ButtonBarItem}.
3400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam */
3500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lampublic class ButtonItem extends AbstractItem implements View.OnClickListener {
3600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
3700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public interface OnClickListener {
3800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        void onClick(ButtonItem item);
3900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
4000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
4100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    private boolean mEnabled = true;
4200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    private CharSequence mText;
4300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    private int mTheme = R.style.SuwButtonItem;
4400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    private OnClickListener mListener;
4500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
4600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    private Button mButton;
4700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
4800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public ButtonItem() {
4900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        super();
5000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
5100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
5200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public ButtonItem(Context context, AttributeSet attrs) {
5300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        super(context, attrs);
5400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuwButtonItem);
5500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mEnabled = a.getBoolean(R.styleable.SuwButtonItem_android_enabled, true);
5600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mText = a.getText(R.styleable.SuwButtonItem_android_text);
5700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mTheme = a.getResourceId(R.styleable.SuwButtonItem_android_theme, R.style.SuwButtonItem);
5800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        a.recycle();
5900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
6000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
6100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public void setOnClickListener(OnClickListener listener) {
6200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mListener = listener;
6300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
6400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
6500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public void setText(CharSequence text) {
6600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mText = text;
6700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
6800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
6900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public CharSequence getText() {
7000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        return mText;
7100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
7200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
7300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    /**
7400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     * The theme to use for this button. This can be used to create button of a particular style
7500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     * (e.g. a colored or borderless button). Typically {@code android:buttonStyle} will be set in
7600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     * the theme to change the style applied by the button.
7700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     *
7800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     * @param theme Resource ID of the theme
7900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     */
8000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public void setTheme(int theme) {
8100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mTheme = theme;
8200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mButton = null;
8300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
8400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
8500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    /**
8600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     * @return Resource ID of the theme used by this button.
8700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     */
8800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public int getTheme() {
8900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        return mTheme;
9000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
9100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
9200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public void setEnabled(boolean enabled) {
9300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mEnabled = enabled;
9400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
9500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
9600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    @Override
9700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public int getCount() {
9800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        return 0;
9900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
10000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
10100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    @Override
10200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public boolean isEnabled() {
10300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        return mEnabled;
10400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
10500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
10600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    @Override
10700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public int getLayoutResource() {
10800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        return 0;
10900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
11000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
11100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    /**
11200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     * Do not use this since ButtonItem is not directly part of a list.
11300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam     */
11400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    @Override
11500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public final void onBindView(View view) {
11600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        throw new UnsupportedOperationException("Cannot bind to ButtonItem's view");
11700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
11800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
119a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam    /**
120a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam     * Create a button according to this button item.
121a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam     *
122a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam     * @param parent The parent of the button, used to retrieve the theme and context for this
123a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam     *               button.
124a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam     * @return A button that can be added to the parent.
125a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam     */
12600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    protected Button createButton(ViewGroup parent) {
12700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        if (mButton == null) {
12800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam            Context context = parent.getContext();
12900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam            if (mTheme != 0) {
13000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam                context = new ContextThemeWrapper(context, mTheme);
13100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam            }
1322831318df83781bb5bada256e35726612d225052Maurice Lam            mButton = createButton(context);
13300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam            mButton.setOnClickListener(this);
134a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam        } else {
135a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam            if (mButton.getParent() instanceof ViewGroup) {
136a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam                // A view cannot be added to a different parent if one already exists. Remove this
137a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam                // button from its parent before returning.
138a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam                ((ViewGroup) mButton.getParent()).removeView(mButton);
139a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam            }
14000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        }
14100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mButton.setEnabled(mEnabled);
14200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        mButton.setText(mText);
14305acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur        mButton.setId(getViewId());
14400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        return mButton;
14500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
14600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam
14700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    @Override
14800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    public void onClick(View v) {
14900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        if (mListener != null) {
15000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam            mListener.onClick(this);
15100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam        }
15200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam    }
1532831318df83781bb5bada256e35726612d225052Maurice Lam
1542831318df83781bb5bada256e35726612d225052Maurice Lam    @SuppressLint("InflateParams")  // This is used similar to Button(Context), so it's OK to not
1552831318df83781bb5bada256e35726612d225052Maurice Lam                                    // specify the parent.
1562831318df83781bb5bada256e35726612d225052Maurice Lam    private Button createButton(Context context) {
1572831318df83781bb5bada256e35726612d225052Maurice Lam        // Inflate a single button from XML, so that when using support lib, it will take advantage
1582831318df83781bb5bada256e35726612d225052Maurice Lam        // of the injected layout inflater and give us AppCompatButton instead.
1592831318df83781bb5bada256e35726612d225052Maurice Lam        return (Button) LayoutInflater.from(context).inflate(R.layout.suw_button, null, false);
1602831318df83781bb5bada256e35726612d225052Maurice Lam    }
16100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam}
162