diff --git a/src/api-impl/android/widget/Button.java b/src/api-impl/android/widget/Button.java index 4e7508b2..9cf8ce4b 100644 --- a/src/api-impl/android/widget/Button.java +++ b/src/api-impl/android/widget/Button.java @@ -8,13 +8,21 @@ import android.util.AttributeSet; public class Button extends TextView { public Button(Context context) { - super(context); + this(context, null); } public Button(Context context, AttributeSet attributeSet) { - super(context, attributeSet); + this(context, attributeSet, 0); + } - TypedArray a = context.obtainStyledAttributes(attributeSet, com.android.internal.R.styleable.TextView, 0, 0); + public Button(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextView, 0, 0); if (a.hasValue(com.android.internal.R.styleable.TextView_text)) { setText(a.getText(com.android.internal.R.styleable.TextView_text)); } diff --git a/src/api-impl/android/widget/CompoundButton.java b/src/api-impl/android/widget/CompoundButton.java index 0e542af6..ec1f3362 100644 --- a/src/api-impl/android/widget/CompoundButton.java +++ b/src/api-impl/android/widget/CompoundButton.java @@ -7,14 +7,22 @@ import android.util.AttributeSet; public abstract class CompoundButton extends Button implements Checkable { Drawable button_drawable = null; - public Drawable mButtonDrawable; // directly accessed by androidx + public Drawable mButtonDrawable; // directly accessed by androidx public CompoundButton(Context context) { - super(context); + this(context, null); } public CompoundButton(Context context, AttributeSet attributeSet) { - super(context, attributeSet); + this(context, attributeSet, 0); + } + + public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); } @Override diff --git a/src/api-impl/android/widget/ImageView.java b/src/api-impl/android/widget/ImageView.java index 72c562d2..15cfeb8a 100644 --- a/src/api-impl/android/widget/ImageView.java +++ b/src/api-impl/android/widget/ImageView.java @@ -20,14 +20,14 @@ public class ImageView extends View { private Drawable drawable = null; private ColorFilter colorFilter = null; - public ImageView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - public ImageView(Context context) { this(context, null); } + public ImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + public ImageView(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index e56e4ddc..322b119f 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -43,7 +43,7 @@ public class TextView extends View { } public TextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr); + super(context, attrs, defStyleAttr, defStyleRes); TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextView, defStyleAttr, 0); try { diff --git a/src/api-impl/android/widget/ToggleButton.java b/src/api-impl/android/widget/ToggleButton.java new file mode 100644 index 00000000..2c52e2df --- /dev/null +++ b/src/api-impl/android/widget/ToggleButton.java @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.widget; + +//import android.annotation.FloatRange; +import android.annotation.NonNull; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.util.AttributeSet; +//import android.view.inspector.InspectableProperty; +import com.android.internal.R; + +/** + * Displays checked/unchecked states as a button + * with a "light" indicator and by default accompanied with the text "ON" or "OFF". + * + *
See the Toggle Buttons + * guide.
+ * + * @attr ref android.R.styleable#ToggleButton_textOn + * @attr ref android.R.styleable#ToggleButton_textOff + * @attr ref android.R.styleable#ToggleButton_disabledAlpha + */ +public class ToggleButton extends CompoundButton { + private CharSequence mTextOn; + private CharSequence mTextOff; + + private Drawable mIndicatorDrawable; + + private static final int NO_ALPHA = 0xFF; + private float mDisabledAlpha; + + public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + final TypedArray a = context.obtainStyledAttributes( + attrs, com.android.internal.R.styleable.ToggleButton, defStyleAttr, defStyleRes); + saveAttributeDataForStyleable(context, com.android.internal.R.styleable.ToggleButton, + attrs, a, defStyleAttr, defStyleRes); + mTextOn = a.getText(com.android.internal.R.styleable.ToggleButton_textOn); + mTextOff = a.getText(com.android.internal.R.styleable.ToggleButton_textOff); + mDisabledAlpha = a.getFloat(com.android.internal.R.styleable.ToggleButton_disabledAlpha, 0.5f); + //syncTextSState(); + // Default state is derived from on/off-text, so state has to be updated when on/off-text + // are updated. + //setDefaultStateDescription(); + a.recycle(); + } + + public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public ToggleButton(Context context, AttributeSet attrs) { + this(context, attrs, com.android.internal.R.attr.buttonStyleToggle); + } + + public ToggleButton(Context context) { + this(context, null); + } + + @Override + public void setChecked(boolean checked) { + super.setChecked(checked); + + syncTextState(); + } + + private void syncTextState() { + boolean checked = isChecked(); + if (checked && mTextOn != null) { + setText(mTextOn); + } else if (!checked && mTextOff != null) { + setText(mTextOff); + } + } + + /** + * Returns the text for when the button is in the checked state. + * + * @return The text. + */ + //@InspectableProperty + public CharSequence getTextOn() { + return mTextOn; + } + + /** + * Sets the text for when the button is in the checked state. + * + * @param textOn The text. + */ + public void setTextOn(CharSequence textOn) { + mTextOn = textOn; + // Default state is derived from on/off-text, so state has to be updated when on/off-text + // are updated. + //setDefaultStateDescription(); + } + + /** + * Returns the text for when the button is not in the checked state. + * + * @return The text. + */ + //@InspectableProperty + public CharSequence getTextOff() { + return mTextOff; + } + + /** + * Sets the text for when the button is not in the checked state. + * + * @param textOff The text. + */ + public void setTextOff(CharSequence textOff) { + mTextOff = textOff; + // Default state is derived from on/off-text, so state has to be updated when on/off-text + // are updated. + //setDefaultStateDescription(); + } + + /** + * Returns the alpha value of the button when it is disabled + * + * @return the alpha value, 0.0-1.0 + */ + //@InspectableProperty + //@FloatRange(from = 0.0, to = 1.0) + public float getDisabledAlpha() { + return mDisabledAlpha; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + updateReferenceToIndicatorDrawable(getBackground()); + } + + @Override + public void setBackgroundDrawable(Drawable d) { + super.setBackgroundDrawable(d); + + updateReferenceToIndicatorDrawable(d); + } + + private void updateReferenceToIndicatorDrawable(Drawable backgroundDrawable) { + if (backgroundDrawable instanceof LayerDrawable) { + LayerDrawable layerDrawable = (LayerDrawable)backgroundDrawable; + mIndicatorDrawable = + layerDrawable.findDrawableByLayerId(com.android.internal.R.id.toggle); + } else { + mIndicatorDrawable = null; + } + } + + /*@Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + + if (mIndicatorDrawable != null) { + mIndicatorDrawable.setAlpha(isEnabled() ? NO_ALPHA : (int)(NO_ALPHA * mDisabledAlpha)); + } + }*/ + + /*@Override + public CharSequence getAccessibilityClassName() { + return ToggleButton.class.getName(); + }*/ + + /** + * @hide * + */ + /*@Override + @NonNull + protected CharSequence getButtonStateDescription() { + if (isChecked()) { + return mTextOn == null ? getResources().getString(R.string.capital_on) : mTextOn; + } else { + return mTextOff == null ? getResources().getString(R.string.capital_off) : mTextOff; + } + }*/ +} diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index e475f959..463c5046 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -592,6 +592,7 @@ srcs = [ 'android/widget/TableRow.java', 'android/widget/TextView.java', 'android/widget/Toast.java', + 'android/widget/ToggleButton.java', 'android/widget/Toolbar.java', 'android/widget/ViewAnimator.java', 'android/widget/ZoomButton.java',