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