Home | History | Annotate | Download | only in toolbar
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.dialer.main.impl.toolbar;
     18 
     19 import android.animation.ValueAnimator;
     20 import android.animation.ValueAnimator.AnimatorUpdateListener;
     21 import android.content.Context;
     22 import android.support.annotation.NonNull;
     23 import android.support.annotation.StringRes;
     24 import android.support.v7.app.AppCompatActivity;
     25 import android.support.v7.widget.Toolbar;
     26 import android.util.AttributeSet;
     27 import android.view.MenuItem;
     28 import android.view.animation.AccelerateDecelerateInterpolator;
     29 import android.widget.ImageButton;
     30 import android.widget.PopupMenu;
     31 import android.widget.RelativeLayout;
     32 import com.android.dialer.common.Assert;
     33 import com.android.dialer.util.ViewUtil;
     34 import com.google.common.base.Optional;
     35 
     36 /** Toolbar for {@link com.android.dialer.main.impl.MainActivity}. */
     37 public final class MainToolbar extends Toolbar implements PopupMenu.OnMenuItemClickListener {
     38 
     39   private static final int SLIDE_DURATION = 300;
     40   private static final AccelerateDecelerateInterpolator SLIDE_INTERPOLATOR =
     41       new AccelerateDecelerateInterpolator();
     42 
     43   private SearchBarView searchBar;
     44   private SearchBarListener listener;
     45   private MainToolbarMenu overflowMenu;
     46   private boolean isSlideUp;
     47 
     48   public MainToolbar(Context context, AttributeSet attrs) {
     49     super(context, attrs);
     50   }
     51 
     52   @Override
     53   protected void onFinishInflate() {
     54     super.onFinishInflate();
     55     ImageButton optionsMenuButton = findViewById(R.id.main_options_menu_button);
     56     overflowMenu = new MainToolbarMenu(getContext(), optionsMenuButton);
     57     overflowMenu.inflate(R.menu.main_menu);
     58     overflowMenu.setOnMenuItemClickListener(this);
     59     optionsMenuButton.setOnClickListener(v -> overflowMenu.show());
     60     optionsMenuButton.setOnTouchListener(overflowMenu.getDragToOpenListener());
     61 
     62     searchBar = findViewById(R.id.search_view_container);
     63   }
     64 
     65   @Override
     66   public boolean onMenuItemClick(MenuItem menuItem) {
     67     return listener.onMenuItemClicked(menuItem);
     68   }
     69 
     70   public void setSearchBarListener(@NonNull SearchBarListener listener) {
     71     this.listener = Assert.isNotNull(listener);
     72     searchBar.setSearchBarListener(listener);
     73   }
     74 
     75   /** Slides the toolbar up and off the screen. */
     76   public void slideUp(boolean animate) {
     77     Assert.checkArgument(!isSlideUp);
     78     if (getHeight() == 0) {
     79       ViewUtil.doOnGlobalLayout(this, view -> slideUp(animate));
     80       return;
     81     }
     82     isSlideUp = true;
     83     ValueAnimator animator = ValueAnimator.ofFloat(0, -getHeight());
     84     animator.setDuration(animate ? SLIDE_DURATION : 0);
     85     animator.setInterpolator(SLIDE_INTERPOLATOR);
     86     animator.addUpdateListener(
     87         new AnimatorUpdateListener() {
     88           @Override
     89           public void onAnimationUpdate(ValueAnimator animation) {
     90             int val = ((Float) animation.getAnimatedValue()).intValue();
     91             RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams();
     92             params.topMargin = val;
     93             requestLayout();
     94           }
     95         });
     96     animator.start();
     97   }
     98 
     99   /** Slides the toolbar down and back onto the screen. */
    100   public void slideDown(boolean animate) {
    101     Assert.checkArgument(isSlideUp);
    102     isSlideUp = false;
    103     ValueAnimator animator = ValueAnimator.ofFloat(-getHeight(), 0);
    104     animator.setDuration(animate ? SLIDE_DURATION : 0);
    105     animator.setInterpolator(SLIDE_INTERPOLATOR);
    106     animator.addUpdateListener(
    107         new AnimatorUpdateListener() {
    108           @Override
    109           public void onAnimationUpdate(ValueAnimator animation) {
    110             int val = ((Float) animation.getAnimatedValue()).intValue();
    111             RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams();
    112             params.topMargin = val;
    113             requestLayout();
    114           }
    115         });
    116     animator.start();
    117   }
    118 
    119   /** @see SearchBarView#collapse(boolean) */
    120   public void collapse(boolean animate) {
    121     searchBar.collapse(animate);
    122   }
    123 
    124   /** @see SearchBarView#collapse(boolean) */
    125   public void expand(boolean animate, Optional<String> text) {
    126     searchBar.expand(animate, text);
    127   }
    128 
    129   public boolean isSlideUp() {
    130     return isSlideUp;
    131   }
    132 
    133   public boolean isExpanded() {
    134     return searchBar.isExpanded();
    135   }
    136 
    137   public String getQuery() {
    138     return searchBar.getQuery();
    139   }
    140 
    141   public void transferQueryFromDialpad(String query) {
    142     searchBar.setQueryWithoutUpdate(query);
    143   }
    144 
    145   public void hideKeyboard() {
    146     searchBar.hideKeyboard();
    147   }
    148 
    149   public void showKeyboard() {
    150     searchBar.showKeyboard();
    151   }
    152 
    153   public MainToolbarMenu getOverflowMenu() {
    154     return overflowMenu;
    155   }
    156 
    157   public void setHint(@StringRes int hint) {
    158     searchBar.setHint(hint);
    159   }
    160 
    161   public void showClearFrequents(boolean show) {
    162     overflowMenu.showClearFrequents(show);
    163   }
    164 
    165   public void maybeShowSimulator(AppCompatActivity appCompatActivity) {
    166     overflowMenu.maybeShowSimulator(appCompatActivity);
    167   }
    168 }
    169