| /* |
| * 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; |
| |
| /** |
| * 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); |
| } |
| } |
| } |