blob: 329fd6fc2c423ff60bad79a40ad4310975850046 [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.google.car.ui.sharedlibrary.toolbar;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.car.ui.sharedlibrary.oemapis.toolbar.MenuItemOEMV1;
import com.android.car.ui.sharedlibrary.oemapis.toolbar.ProgressBarControllerOEMV1;
import com.android.car.ui.sharedlibrary.oemapis.toolbar.SearchItemOEMV1;
import com.android.car.ui.sharedlibrary.oemapis.toolbar.TabOEMV1;
import com.android.car.ui.sharedlibrary.oemapis.toolbar.ToolbarControllerOEMV1;
import com.google.car.ui.sharedlibrary.R;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
@SuppressWarnings("AndroidJdkLibsChecker")
class ToolbarControllerImpl implements ToolbarControllerOEMV1 {
private final Context mSharedLibraryContext;
private final ImageView mBackButtonView;
private final TextView mTitleView;
private final TextView mSubtitleView;
private final ImageView mLogo;
private final ImageView mLogoInNavIconSpace;
private final ProgressBarController mProgressBar;
private final TabLayout mTabContainer;
private Runnable mBackListener;
private int mNavButtonMode = ToolbarControllerOEMV1.NAV_BUTTON_MODE_BACK;
private boolean mBackButtonVisible = false;
private boolean mHasLogo = false;
ToolbarControllerImpl(View view, Context sharedLibraryContext) {
mSharedLibraryContext = sharedLibraryContext;
mBackButtonView = view.requireViewById(R.id.toolbar_nav_icon);
mTitleView = view.requireViewById(R.id.toolbar_title);
mSubtitleView = view.requireViewById(R.id.toolbar_subtitle);
mLogo = view.requireViewById(R.id.toolbar_title_logo);
mLogoInNavIconSpace = view.requireViewById(R.id.toolbar_logo);
mProgressBar = new ProgressBarController(
view.requireViewById(R.id.toolbar_progress_bar));
mTabContainer = view.requireViewById(R.id.toolbar_tabs);
}
@Override
public void setTitle(CharSequence title) {
boolean hadTitle = !TextUtils.isEmpty(getTitle());
mTitleView.setText(title);
boolean hasTitle = !TextUtils.isEmpty(getTitle());
if (hadTitle != hasTitle) {
update();
}
}
@Override
public CharSequence getTitle() {
return mTitleView.getText();
}
@Override
public void setSubtitle(CharSequence title) {
boolean hadSubtitle = !TextUtils.isEmpty(getSubtitle());
mSubtitleView.setText(title);
boolean hasSubtitle = !TextUtils.isEmpty(getSubtitle());
if (hadSubtitle != hasSubtitle) {
update();
}
}
@Override
public CharSequence getSubtitle() {
return mSubtitleView.getText();
}
@Override
public void setTabs(List<? extends TabOEMV1> tabs, int selectedTab) {
if (tabs == null) {
tabs = Collections.emptyList();
}
boolean hadTabs = mTabContainer.hasTabs();
mTabContainer.setTabs(tabs, selectedTab);
boolean hasTabs = mTabContainer.hasTabs();
if (hadTabs != hasTabs) {
update();
}
}
@Override
public void selectTab(int position) {
mTabContainer.selectTab(position);
}
@Override
public void setLogo(Drawable drawable) {
mLogo.setImageDrawable(drawable);
mLogoInNavIconSpace.setImageDrawable(drawable);
boolean hasLogo = drawable != null;
if (hasLogo != mHasLogo) {
mHasLogo = hasLogo;
update();
}
}
@Override
public void setSearchHint(CharSequence hint) {
}
@Override
public CharSequence getSearchHint() {
return null;
}
@Override
public void setBackButtonVisible(boolean visible) {
if (visible != mBackButtonVisible) {
mBackButtonVisible = visible;
mBackButtonView.setOnClickListener(mBackButtonVisible ? v -> {
if (mBackListener != null) {
mBackListener.run();
}
} : null);
mBackButtonView.setClickable(mBackButtonVisible);
update();
}
}
@Override
public boolean isBackButtonVisible() {
return mBackButtonVisible;
}
@Override
public void setSearchIcon(Drawable d) {
}
@Override
public void setSearchQuery(CharSequence query) {
}
@Override
public void setSearchMode(int searchMode) {
}
@Override
public void setShowMenuItemsWhileSearching(boolean showMenuItemsWhileSearching) {
}
@Override
public boolean isShowingMenuItemsWhileSearching() {
return false;
}
@Override
public boolean canShowSearchResultItems() {
return false;
}
@Override
public boolean canShowSearchResultsView() {
return false;
}
@Override
public void setSearchResultsView(View view) {
// Intentional no-op as canShowSearchResultsView returns false
}
@Override
public void setSearchResultItems(List<? extends SearchItemOEMV1> searchItems) {
// Intentional no-op as canShowSearchResultItems returns false
}
@Override
public void setNavButtonMode(int mode) {
mNavButtonMode = mode;
switch (mNavButtonMode) {
case ToolbarControllerOEMV1.NAV_BUTTON_MODE_CLOSE:
mBackButtonView.setImageResource(R.drawable.icon_close);
break;
case ToolbarControllerOEMV1.NAV_BUTTON_MODE_DOWN:
mBackButtonView.setImageResource(R.drawable.icon_down);
break;
default:
mBackButtonView.setImageResource(R.drawable.icon_back);
break;
}
}
@Override
public int getNavButtonMode() {
return mNavButtonMode;
}
@Override
public void setMenuItems(List<? extends MenuItemOEMV1> items) {
}
@Override
public List<? extends MenuItemOEMV1> getMenuItems() {
return null;
}
@Override
public void setSearchListener(Consumer<CharSequence> listener) {
}
@Override
public void setSearchCompletedListener(Runnable listener) {
}
@Override
public void setBackListener(Runnable listener) {
mBackListener = listener;
}
@Override
public ProgressBarControllerOEMV1 getProgressBar() {
return mProgressBar;
}
private void update() {
setVisible(mBackButtonView, mBackButtonVisible);
setVisible(mLogoInNavIconSpace, mHasLogo && !mBackButtonVisible);
setVisible(mLogo, mHasLogo && mBackButtonVisible);
boolean hasTabs = mTabContainer.hasTabs();
setVisible(mTabContainer, hasTabs);
setVisible(mTitleView, !TextUtils.isEmpty(getTitle()) && !hasTabs);
setVisible(mSubtitleView, !TextUtils.isEmpty(getSubtitle()) && !hasTabs);
}
private static void setVisible(View view, boolean visible) {
if (view != null) {
view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
}
}