blob: 6fe712af0c87d49b6c0333d1ed1288e5110531ad [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2014 Google Inc.
* Licensed to 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.mail.ui;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.android.mail.R;
import com.android.mail.analytics.Analytics;
import com.android.mail.providers.Account;
import com.android.mail.providers.AccountObserver;
import com.android.mail.utils.ViewUtils;
/**
* Custom toolbar that supports a custom view so we can display our search icon wherever we want.
*/
public class CustomViewToolbar extends Toolbar implements ViewMode.ModeChangeListener,
TwoPaneLayout.ConversationListLayoutListener {
private static final long FADE_ANIMATION_DURATION_MS = 150;
private ControllableActivity mActivity;
private ActivityController mController;
private ViewMode mViewMode;
private AccountObserver mAccountObserver = new AccountObserver() {
@Override
public void onChanged(Account newAccount) {
setSearchButtonVisibility(newAccount);
}
};
protected View mCustomView;
protected TextView mActionBarTitle;
protected View mSearchButton;
public CustomViewToolbar(Context context) {
super(context);
}
public CustomViewToolbar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setController(ControllableActivity activity, ActivityController controller,
ViewMode viewMode) {
mActivity = activity;
mController = controller;
mViewMode = viewMode;
mViewMode.addListener(this);
mAccountObserver.initialize(mActivity.getAccountController());
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mCustomView = findViewById(R.id.actionbar_custom_view);
mActionBarTitle = (TextView) findViewById(R.id.actionbar_title);
mSearchButton = findViewById(R.id.actionbar_search_button);
mSearchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Since search is no longer a menu item, log the search "menu" event here.
Analytics.getInstance().sendEvent(Analytics.EVENT_CATEGORY_MENU_ITEM,
"search", "action_bar/" + mViewMode.getModeString(), 0);
mController.startSearch();
}
});
}
protected void onDestroy() {
mAccountObserver.unregisterAndDestroy();
}
/**
* Sets the search button visibility based on the current account.
*/
private void setSearchButtonVisibility() {
setSearchButtonVisibility(mActivity.getAccountController().getAccount());
}
private void setSearchButtonVisibility(Account account) {
if (mSearchButton != null) {
final boolean visible = mController.shouldShowSearchMenuItem() &&
account.supportsSearch();
mSearchButton.setVisibility(visible ? VISIBLE : INVISIBLE);
}
}
@Override
public void onViewModeChanged(int newMode) {
setSearchButtonVisibility();
}
@Override
public void onConversationListLayout(int xEnd, boolean drawerOpen) {
if (drawerOpen) {
mSearchButton.animate()
.alpha(0f)
.setDuration(FADE_ANIMATION_DURATION_MS)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mSearchButton.setVisibility(INVISIBLE);
}
});
} else {
setSearchButtonVisibility();
// setListener(null) is necessary because the animator carries the previously set
// listener over, aka the listener for fade out.
if (mSearchButton.isShown()) {
mSearchButton.animate()
.alpha(1f)
.setDuration(FADE_ANIMATION_DURATION_MS)
.setListener(null);
}
final int[] coords = new int[2];
mCustomView.getLocationInWindow(coords);
final int newWidth;
if (ViewUtils.isViewRtl(this)) {
newWidth = coords[0] + mCustomView.getWidth() - xEnd;
} else {
newWidth = xEnd - coords[0];
}
// Only set the width if it's different than before so we avoid draw on layout pass.
if (mCustomView.getWidth() != newWidth) {
final ViewGroup.LayoutParams params = mCustomView.getLayoutParams();
params.width = newWidth;
mCustomView.setLayoutParams(params);
}
}
}
// OVERRIDE DEFAULT TOOLBAR TITLE FUNCTIONS SO THEY ARE RENDERED CORRECTLY.
// TODO: subtitles? we currently don't have any of those, but we will need to support them.
@Override
public void setTitle(int resId) {
setTitle(getResources().getString(resId));
}
@Override
public void setTitle(CharSequence title) {
mActionBarTitle.setText(title);
}
@Override
public void setTitleTextAppearance(Context context, int resId) {
mActionBarTitle.setTextAppearance(context, resId);
}
@Override
public void setTitleTextColor(int color) {
mActionBarTitle.setTextColor(color);
}
}