blob: 0d97293bd812dd4b041bfb6edee16be8ea184e83 [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.chassis.car.ui.plugin.toolbar;
import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.android.car.ui.plugin.oemapis.toolbar.MenuItemOEMV1;
import com.chassis.car.ui.plugin.R;
import com.chassis.car.ui.plugin.uxr.DrawableStateView;
class MenuItemView extends FrameLayout {
private static final int[] RESTRICTED_STATE = new int[] {R.attr.state_ux_restricted};
private static final int[] ENABLED_STATE = new int[] {android.R.attr.state_enabled};
private final MenuItemOEMV1 mMenuItem;
private final View mIconContainer;
private final ImageView mIconView;
private final Switch mSwitch;
private final TextView mTextView;
private final TextView mTextWithIconView;
private final int mMenuItemIconSize;
MenuItemView(
@NonNull Context context,
MenuItemOEMV1 menuItem) {
super(context);
mMenuItemIconSize = getResources().getDimensionPixelSize(R.dimen.primary_icon_size);
setVisibility(View.GONE);
LayoutInflater.from(getContext()).inflate(menuItem.isPrimary()
? R.layout.toolbar_menu_item_primary
: R.layout.toolbar_menu_item, this, true);
mIconContainer = requireViewById(R.id.car_ui_toolbar_menu_item_icon_container);
mIconView = requireViewById(R.id.car_ui_toolbar_menu_item_icon);
mSwitch = requireViewById(R.id.car_ui_toolbar_menu_item_switch);
mTextView = requireViewById(R.id.car_ui_toolbar_menu_item_text);
mTextWithIconView = requireViewById(R.id.car_ui_toolbar_menu_item_text_with_icon);
mMenuItem = menuItem;
onMenuItemUpdated(mMenuItem);
}
public void onMenuItemUpdated(MenuItemOEMV1 menuItem) {
boolean hasIcon = mMenuItem.getIcon() != null;
boolean hasText = !TextUtils.isEmpty(mMenuItem.getTitle());
boolean textAndIcon = mMenuItem.isShowingIconAndTitle();
boolean checkable = mMenuItem.isCheckable();
if (!mMenuItem.isVisible() || (!checkable && !hasIcon && !hasText)) {
setVisibility(View.GONE);
return;
}
setVisibility(View.VISIBLE);
setContentDescription(mMenuItem.getTitle());
View clickTarget;
if (checkable) {
mSwitch.setChecked(mMenuItem.isChecked());
clickTarget = mSwitch;
} else if (hasText && hasIcon && textAndIcon) {
mMenuItem.getIcon().setBounds(0, 0, mMenuItemIconSize, mMenuItemIconSize);
mTextWithIconView.setCompoundDrawables(mMenuItem.getIcon(), null, null, null);
mTextWithIconView.setText(mMenuItem.getTitle());
clickTarget = mTextWithIconView;
} else if (hasIcon) {
mIconView.setImageDrawable(mMenuItem.getIcon());
clickTarget = mIconContainer;
} else { // hasText will be true
mTextView.setText(mMenuItem.getTitle());
clickTarget = mTextView;
}
mIconContainer.setVisibility(clickTarget == mIconContainer ? View.VISIBLE : View.GONE);
mTextView.setVisibility(clickTarget == mTextView ? View.VISIBLE : View.GONE);
mTextWithIconView.setVisibility(clickTarget == mTextWithIconView
? View.VISIBLE : View.GONE);
mSwitch.setVisibility(clickTarget == mSwitch ? View.VISIBLE : View.GONE);
if (!mMenuItem.isTinted() && hasIcon) {
mMenuItem.getIcon().setTintList(null);
}
recursiveSetEnabledAndDrawableState(this);
setActivated(mMenuItem.isActivated());
Runnable onClickListener = mMenuItem.getOnClickListener();
if (onClickListener != null) {
clickTarget.setOnClickListener(v -> {
if (mMenuItem.isEnabled()) {
onClickListener.run();
}
});
} else {
clickTarget.setOnClickListener(null);
clickTarget.setClickable(false);
}
}
private void recursiveSetEnabledAndDrawableState(View view) {
int[] drawableState = mMenuItem.isRestricted() ? RESTRICTED_STATE : null;
int[] drawableStateToRemove = mMenuItem.isEnabled() ? null : ENABLED_STATE;
if (view instanceof DrawableStateView) {
((DrawableStateView) view).setExtraDrawableState(drawableState, drawableStateToRemove);
}
if (view instanceof ViewGroup) {
ViewGroup viewGroup = ((ViewGroup) view);
for (int i = 0; i < viewGroup.getChildCount(); i++) {
recursiveSetEnabledAndDrawableState(viewGroup.getChildAt(i));
}
}
}
}