/* * Copyright (C) 2022 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 com.android.settingslib.widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import androidx.annotation.GravityInt; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import com.android.settingslib.widget.preference.button.R; /** * A preference handled a button */ public class ButtonPreference extends Preference { private static final int ICON_SIZE = 24; private View.OnClickListener mClickListener; private Button mButton; private CharSequence mTitle; private Drawable mIcon; @GravityInt private int mGravity; /** * Constructs a new LayoutPreference with the given context's theme, the supplied * attribute set, and default style attribute. * * @param context The Context the view is running in, through which it can * access the current theme, resources, etc. * @param attrs The attributes of the XML tag that is inflating the view. * @param defStyleAttr An attribute in the current theme that contains a * reference to a style resource that supplies default * values for the view. Can be 0 to not look for * defaults. */ public ButtonPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } /** * Constructs a new LayoutPreference with the given context's theme and the supplied * attribute set. * * @param context The Context the view is running in, through which it can * access the current theme, resources, etc. * @param attrs The attributes of the XML tag that is inflating the view. */ public ButtonPreference(Context context, AttributeSet attrs) { this(context, attrs, 0 /* defStyleAttr */); } /** * Constructs a new LayoutPreference with the given context's theme and a customized view. * * @param context The Context the view is running in, through which it can * access the current theme, resources, etc. */ public ButtonPreference(Context context) { this(context, null); } private void init(Context context, AttributeSet attrs, int defStyleAttr) { setLayoutResource(R.layout.settingslib_button_layout); if (attrs != null) { TypedArray a = context.obtainStyledAttributes(attrs, androidx.preference.R.styleable.Preference, defStyleAttr, 0 /*defStyleRes*/); mTitle = a.getText( androidx.preference.R.styleable.Preference_android_title); mIcon = a.getDrawable( androidx.preference.R.styleable.Preference_android_icon); a.recycle(); a = context.obtainStyledAttributes(attrs, R.styleable.ButtonPreference, defStyleAttr, 0 /*defStyleRes*/); mGravity = a.getInt(R.styleable.ButtonPreference_android_gravity, Gravity.START); a.recycle(); } } @Override public void onBindViewHolder(PreferenceViewHolder holder) { mButton = (Button) holder.findViewById(R.id.settingslib_button); setTitle(mTitle); setIcon(mIcon); setGravity(mGravity); setOnClickListener(mClickListener); if (mButton != null) { final boolean selectable = isSelectable(); mButton.setFocusable(selectable); mButton.setClickable(selectable); mButton.setEnabled(isEnabled()); } holder.setDividerAllowedAbove(false); holder.setDividerAllowedBelow(false); } @Override public void setTitle(CharSequence title) { mTitle = title; if (mButton != null) { mButton.setText(title); } } @Override public CharSequence getTitle() { return mTitle; } @Override public void setIcon(Drawable icon) { mIcon = icon; if (mButton == null || icon == null) { return; } //get pixel from dp int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ICON_SIZE, getContext().getResources().getDisplayMetrics()); icon.setBounds(0, 0, size, size); //set drawableStart mButton.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null/* top */, null/* end */, null/* bottom */); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (mButton != null) { mButton.setEnabled(enabled); } } /** * Return Button */ public Button getButton() { return mButton; } /** * Set a listener for button click */ public void setOnClickListener(View.OnClickListener listener) { mClickListener = listener; if (mButton != null) { mButton.setOnClickListener(listener); } } /** * Set the gravity of button * * @param gravity The {@link Gravity} supported CENTER_HORIZONTAL * and the default value is START */ public void setGravity(@GravityInt int gravity) { if (gravity == Gravity.CENTER_HORIZONTAL || gravity == Gravity.CENTER_VERTICAL || gravity == Gravity.CENTER) { mGravity = Gravity.CENTER_HORIZONTAL; } else { mGravity = Gravity.START; } if (mButton != null) { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mButton.getLayoutParams(); lp.gravity = mGravity; mButton.setLayoutParams(lp); } } }