Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a524ae57 authored by Yorke Lee's avatar Yorke Lee
Browse files

Fix some action bar logic

* Restore action bar slid state only after onCreateOptionsMenu, when it has
an effect
* ActionBarController is now the only way to make changes to the offset of
the action bar so that it can appropriately restore its state

Bug: 16710397
Change-Id: Id9e0ebe210c89df0be56b32aa3bbd959cce88621
parent 0e6d7b04
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -755,6 +755,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
            mSearchView.setText(mPendingSearchViewQuery);
            mPendingSearchViewQuery = null;
        }
        mActionBarController.restoreActionBarOffset();
        return false;
    }

@@ -1155,7 +1156,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O

    @Override
    public void setActionBarHideOffset(int hideOffset) {
        getActionBar().setHideOffset(hideOffset);
        mActionBarController.setHideOffset(hideOffset);
    }

    /**
+3 −1
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ public class ListsFragment extends AnalyticsFragment implements CallLogQueryHand
    public interface HostInterface {
        public void showCallHistory();
        public int getActionBarHeight();
        public void setActionBarHideOffset(int offset);
    }

    private ActionBar mActionBar;
@@ -152,7 +153,8 @@ public class ListsFragment extends AnalyticsFragment implements CallLogQueryHand

                final int availableActionBarHeight =
                        Math.min(mActionBar.getHeight(), topPaneHeight);
                mActionBar.setHideOffset(mActionBar.getHeight() - availableActionBarHeight);
                ((HostInterface) getActivity()).setActionBarHideOffset(
                        mActionBar.getHeight() - availableActionBarHeight);

                if (!mActionBar.isShowing()) {
                    mActionBar.show();
+36 −48
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import com.google.common.annotations.VisibleForTesting;

import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.ActionBar;
import android.os.Bundle;
import android.util.Log;

@@ -31,12 +32,12 @@ public class ActionBarController {
    private final AnimationCallback mFadeOutCallback = new AnimationCallback() {
        @Override
        public void onAnimationEnd() {
            slideActionBarUp(false);
            slideActionBar(true /* slideUp */, false /* animate */);
        }

        @Override
        public void onAnimationCancel() {
            slideActionBarUp(false);
            slideActionBar(true /* slideUp */, false /* animate */);
        }
    };

@@ -45,8 +46,7 @@ public class ActionBarController {
        public boolean hasSearchQuery();
        public boolean shouldShowActionBar();
        public int getActionBarHeight();
        public int getActionBarHideOffset();
        public void setActionBarHideOffset(int hideOffset);
        public ActionBar getActionBar();
    }

    public ActionBarController(ActivityUi activityUi, SearchEditTextLayout searchBox) {
@@ -54,13 +54,6 @@ public class ActionBarController {
        mSearchBox = searchBox;
    }

    /**
     * @return The offset the action bar is being translated upwards by
     */
    public int getHideOffset() {
        return mActivityUi.getActionBarHideOffset();
    }

    /**
     * @return Whether or not the action bar is currently showing (both slid down and visible)
     */
@@ -97,9 +90,9 @@ public class ActionBarController {
        }

        if (mActivityUi.shouldShowActionBar()) {
            slideActionBarDown(false /* animate */);
            slideActionBar(false /* slideUp */, false /* animate */);
        } else {
            slideActionBarUp(false /* animate */);
            slideActionBar(true /* slideUp */, false /* animate */);
        }
    }

@@ -122,7 +115,7 @@ public class ActionBarController {
                if (!mSearchBox.isExpanded()) {
                    mSearchBox.expand(false /* animate */, false /* requestFocus */);
                }
                slideActionBarDown(true /* animate */);
                slideActionBar(false /* slideUp */, true /* animate */);
            } else {
                mSearchBox.fadeIn();
            }
@@ -138,57 +131,49 @@ public class ActionBarController {
            Log.d(TAG, "OnDialpadUp: isInSearchUi " + mActivityUi.isInSearchUi());
        }
        if (mActivityUi.isInSearchUi()) {
            slideActionBarUp(true);
            slideActionBar(true /* slideUp */, true /* animate */);
        } else {
            // From the lists fragment
            mSearchBox.fadeOut(mFadeOutCallback);
        }
    }

    public void slideActionBarUp(boolean animate) {
    public void slideActionBar(boolean slideUp, boolean animate) {
        if (DEBUG) {
            Log.d(TAG, "Sliding actionBar up - animate: " + animate);
            Log.d(TAG, "Sliding actionBar - up: " + slideUp + " animate: " + animate);
        }
        if (animate) {
            ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
            ValueAnimator animator =
                    slideUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
            animator.addUpdateListener(new AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    final float value = (float) animation.getAnimatedValue();
                    mActivityUi.setActionBarHideOffset(
                    setHideOffset(
                            (int) (mActivityUi.getActionBarHeight() * value));
                }
            });
            animator.start();
        } else {
           mActivityUi.setActionBarHideOffset(mActivityUi.getActionBarHeight());
           setHideOffset(slideUp ? mActivityUi.getActionBarHeight() : 0);
        }
        mIsActionBarSlidUp = true;
        mIsActionBarSlidUp = slideUp;
    }

    public void slideActionBarDown(boolean animate) {
        if (DEBUG) {
            Log.d(TAG, "Sliding actionBar down - animate: " + animate);
        }
        if (animate) {
            ValueAnimator animator = ValueAnimator.ofFloat(1, 0);
            animator.addUpdateListener(new AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    final float value = (float) animation.getAnimatedValue();
                    mActivityUi.setActionBarHideOffset(
                            (int) (mActivityUi.getActionBarHeight() * value));
                }
            });
            animator.start();
        } else {
            mActivityUi.setActionBarHideOffset(0);
    public void setAlpha(float alphaValue) {
        mSearchBox.animate().alpha(alphaValue).start();
    }
        mIsActionBarSlidUp = false;

    public void setHideOffset(int offset) {
        mIsActionBarSlidUp = offset >= mActivityUi.getActionBarHeight();
        mActivityUi.getActionBar().setHideOffset(offset);
    }

    public void setAlpha(float alphaValue) {
        mSearchBox.animate().alpha(alphaValue).start();
    /**
     * @return The offset the action bar is being translated upwards by
     */
    public int getHideOffset() {
        return mActivityUi.getActionBar().getHideOffset();
    }

    /**
@@ -201,15 +186,10 @@ public class ActionBarController {
    }

    /**
     * Restores the action bar state from a provided {@link Bundle}
     * Restores the action bar state from a provided {@link Bundle}.
     */
    public void restoreInstanceState(Bundle inState) {
        mIsActionBarSlidUp = inState.getBoolean(KEY_IS_SLID_UP);
        if (mIsActionBarSlidUp) {
            slideActionBarUp(false);
        } else {
            slideActionBarDown(false);
        }

        final boolean isSearchBoxFadedOut = inState.getBoolean(KEY_IS_FADED_OUT);
        if (isSearchBoxFadedOut) {
@@ -230,6 +210,14 @@ public class ActionBarController {
        }
    }

    /**
     * This should be called after onCreateOptionsMenu has been called, when the actionbar has
     * been laid out and actually has a height.
     */
    public void restoreActionBarOffset() {
        slideActionBar(mIsActionBarSlidUp /* slideUp */, false /* animate */);
    }

    @VisibleForTesting
    public boolean getIsActionBarSlidUp() {
        return mIsActionBarSlidUp;
+6 −10
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.dialer.widget;

import android.app.ActionBar;
import android.content.Context;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -57,13 +58,8 @@ public class ActionBarControllerTest extends InstrumentationTestCase {
        }

        @Override
        public int getActionBarHideOffset() {
            return actionBarHideOffset;
        }

        @Override
        public void setActionBarHideOffset(int hideOffset) {
            actionBarHideOffset = hideOffset;
        public ActionBar getActionBar() {
            return null;
        }
    }

@@ -139,7 +135,7 @@ public class ActionBarControllerTest extends InstrumentationTestCase {
        assertActionBarState(false, false, false);

        // No search query typed in the dialpad, but action bar was not showing before
        mActionBarController.slideActionBarUp(false);
        mActionBarController.slideActionBar(true /* slideUp */, false /* animate */);
        mActivityUi.shouldShowActionBar = false;
        mSearchBox.setVisible(false);
        mActionBarController.onDialpadDown();
@@ -147,7 +143,7 @@ public class ActionBarControllerTest extends InstrumentationTestCase {

        // Something typed in the dialpad - so remain in search UI and slide the expanded search
        // box down
        mActionBarController.slideActionBarUp(false);
        mActionBarController.slideActionBar(true /* slideUp */, false /* animate */);
        mActivityUi.shouldShowActionBar = true;
        mActivityUi.hasSearchQuery= true;
        mSearchBox.setVisible(false);
@@ -168,7 +164,7 @@ public class ActionBarControllerTest extends InstrumentationTestCase {
        mActivityUi.hasSearchQuery = true;
        mSearchBox.expand(true, false);
        mSearchBox.setVisible(true);
        mActionBarController.slideActionBarUp(false);
        mActionBarController.slideActionBar(true /* slideUp */, false /* animate */);
        mActionBarController.onDialpadUp();
        assertActionBarState(true, false, true);
    }