blob: 9d49b8cedf1f57f41e40643be63e257342756547 [file] [log] [blame]
/*
* Copyright (C) 2021 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.car.settings.common;
import static com.android.car.ui.utils.CarUiUtils.requireViewByRefId;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceViewHolder;
import com.android.car.settings.R;
import com.android.car.ui.preference.CarUiPreference;
/**
* A class for preferences that have a main click action along with up to three other actions.
*/
public class MultiActionPreference extends CarUiPreference
implements BaseActionItem.ActionItemInfoChangeListener {
/**
* Identifier enum for the three different action items.
*/
public enum ActionItem {
ACTION_ITEM1,
ACTION_ITEM2,
ACTION_ITEM3,
}
protected BaseActionItem[] mActionItemArray = new BaseActionItem[3];
public MultiActionPreference(Context context,
AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(attrs);
}
public MultiActionPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
public MultiActionPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public MultiActionPreference(Context context) {
super(context);
init(null);
}
/**
* Initialize styles and attributes, as well as what types of action items should be created.
*
* @param attrs Attribute set from which to read values
*/
@CallSuper
protected void init(@Nullable AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.MultiActionPreference);
try {
// Single case switch statement for now with the assumption more ActionItems will be
// added in the future
switch(a.getInt(
R.styleable.MultiActionPreference_action_item_one, -1)) {
case 0:
mActionItemArray[0] = new ToggleButtonActionItem(this);
break;
default:
break;
}
switch(a.getInt(
R.styleable.MultiActionPreference_action_item_two, -1)) {
case 0:
mActionItemArray[1] = new ToggleButtonActionItem(this);
break;
default:
break;
}
switch(a.getInt(
R.styleable.MultiActionPreference_action_item_three, -1)) {
case 0:
mActionItemArray[2] = new ToggleButtonActionItem(this);
break;
default:
break;
}
int[] actionItemVisibility = {
R.styleable.MultiActionPreference_action_item_one_shown,
R.styleable.MultiActionPreference_action_item_two_shown,
R.styleable.MultiActionPreference_action_item_three_shown};
int[] actionItemEnabled = {
R.styleable.MultiActionPreference_action_item_one_enabled,
R.styleable.MultiActionPreference_action_item_two_enabled,
R.styleable.MultiActionPreference_action_item_three_enabled};
for (int i = 0; i < mActionItemArray.length; i++) {
if (mActionItemArray[i] != null) {
mActionItemArray[i].setVisible(a.getBoolean(
actionItemVisibility[i], true));
mActionItemArray[i].setEnabled(a.getBoolean(
actionItemEnabled[i], true));
}
}
} finally {
a.recycle();
}
setLayoutResource(R.layout.multi_action_preference);
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
View actionContainer = requireViewByRefId(holder.itemView,
R.id.multi_action_preference_second_action_container);
FrameLayout container1 = requireViewByRefId(holder.itemView,
R.id.multi_action_preference_item_container1);
FrameLayout container2 = requireViewByRefId(holder.itemView,
R.id.multi_action_preference_item_container2);
FrameLayout container3 = requireViewByRefId(holder.itemView,
R.id.multi_action_preference_item_container3);
boolean isActionContainerVisible = false;
for (BaseActionItem baseActionItem: mActionItemArray) {
if (baseActionItem != null) {
baseActionItem.setPreference(this)
.setRestrictedOnClickListener(getOnClickWhileRestrictedListener());
if (baseActionItem.isVisible()) {
isActionContainerVisible = true;
}
}
}
actionContainer.setVisibility(isActionContainerVisible ? View.VISIBLE : View.GONE);
if (mActionItemArray[0] != null) {
mActionItemArray[0].bindViewHolder(container1);
}
if (mActionItemArray[1] != null) {
mActionItemArray[1].bindViewHolder(container2);
}
if (mActionItemArray[2] != null) {
mActionItemArray[2].bindViewHolder(container3);
}
}
@Override
public void onActionItemChange(BaseActionItem baseActionItem) {
notifyChanged();
}
/**
* Retrieve the specified BaseActionItem based on the index.
*/
public BaseActionItem getActionItem(ActionItem actionItem) {
switch (actionItem) {
case ACTION_ITEM1:
return mActionItemArray[0];
case ACTION_ITEM2:
return mActionItemArray[1];
case ACTION_ITEM3:
return mActionItemArray[2];
default:
throw new IllegalArgumentException("Invalid button requested");
}
}
}