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