From 5253be0d57edd4cdf5fbc0a980188e13e009c083 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Wed, 21 May 2014 18:50:03 -0700 Subject: Add ActionBarController * Collect all actionBar interactions within DialtactsActivity into a single controller to ensure that it behaves more deterministically, and fix some bugs with regards to actionBar interactions. * Make sure that action bar correctly handles activity recreation and destruction by saving its state * Add unit tests and mock classes for ActionBarController Bug: 14900155 Change-Id: I370831db425e1970b118f5d4fed3ce9297e3610d --- .../dialer/widget/ActionBarControllerTest.java | 181 +++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 tests/src/com/android/dialer/widget/ActionBarControllerTest.java (limited to 'tests') diff --git a/tests/src/com/android/dialer/widget/ActionBarControllerTest.java b/tests/src/com/android/dialer/widget/ActionBarControllerTest.java new file mode 100644 index 000000000..919a07bac --- /dev/null +++ b/tests/src/com/android/dialer/widget/ActionBarControllerTest.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2014 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.dialer.widget; + +import android.content.Context; +import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.dialer.widget.ActionBarController.ActivityUi; + +@SmallTest +public class ActionBarControllerTest extends InstrumentationTestCase { + + private static final int ACTION_BAR_HEIGHT = 100; + private ActionBarController mActionBarController; + private SearchEditTextLayout mSearchBox; + private MockActivityUi mActivityUi; + + private class MockActivityUi implements ActivityUi { + boolean isInSearchUi; + boolean hasSearchQuery; + boolean shouldShowActionBar; + int actionBarHideOffset; + + @Override + public boolean isInSearchUi() { + return isInSearchUi; + } + + @Override + public boolean hasSearchQuery() { + return hasSearchQuery; + } + + @Override + public boolean shouldShowActionBar() { + return shouldShowActionBar; + } + + @Override + public int getActionBarHeight() { + return ACTION_BAR_HEIGHT; + } + + @Override + public int getActionBarHideOffset() { + return actionBarHideOffset; + } + + @Override + public void setActionBarHideOffset(int hideOffset) { + actionBarHideOffset = hideOffset; + } + } + + /** + * Mock version of the searchbox, that updates its state immediately instead of animating + */ + private class MockSearchBox extends SearchEditTextLayout { + + public MockSearchBox(Context context) { + super(context, null); + } + + @Override + public void expand(boolean animate, boolean requestFocus) { + mIsExpanded = true; + } + + @Override + public void collapse(boolean animate) { + mIsExpanded = false; + } + } + + @Override + protected void setUp() { + mActivityUi = new MockActivityUi(); + mSearchBox = new MockSearchBox(this.getInstrumentation().getContext()); + mActionBarController = new ActionBarController(mActivityUi, mSearchBox); + } + + // Tapping the search box should only do something when the activity is not in the search UI + public void testSearchBoxTapped() { + mSearchBox.collapse(false); + mActivityUi.isInSearchUi = false; + mActionBarController.onSearchBoxTapped(); + assertActionBarState(true, false, false); + + // Collapse the search box manually again. This time tapping on the search box should not + // expand the search box because isInSearchUi is not true. + mSearchBox.collapse(false); + mActivityUi.isInSearchUi = true; + mActionBarController.onSearchBoxTapped(); + assertActionBarState(false, false, false); + } + + // The search box should always end up being faded in and collapsed. If necessary, it should + // be slid down or up depending on what the state of the action bar was before that. + public void testOnSearchUiExited() { + // ActionBar shown previously before entering searchUI + mSearchBox.expand(true, false); + mSearchBox.makeInvisible(); + mActivityUi.shouldShowActionBar = true; + mActionBarController.onSearchUiExited(); + assertActionBarState(false, false, false); + + // ActionBar slid up previously before entering searchUI + mSearchBox.collapse(false); + mSearchBox.makeInvisible(); + mActivityUi.shouldShowActionBar = false; + mActionBarController.onSearchUiExited(); + assertActionBarState(false, false, true); + } + + // Depending on what state the UI was in previously, sliding the dialpad down can mean either + // displaying the expanded search box by sliding it down, displaying the unexpanded search box, + // or nothing at all. + public void testOnDialpadDown() { + // No search query typed in the dialpad and action bar was showing before + mActivityUi.shouldShowActionBar = true; + mActivityUi.isInSearchUi = true; + mSearchBox.setVisible(false); + mActionBarController.onDialpadDown(); + assertActionBarState(false, false, false); + + // No search query typed in the dialpad, but action bar was not showing before + mActionBarController.slideActionBarUp(false); + mActivityUi.shouldShowActionBar = false; + mSearchBox.setVisible(false); + mActionBarController.onDialpadDown(); + assertActionBarState(false, false, true); + + // Something typed in the dialpad - so remain in search UI and slide the expanded search + // box down + mActionBarController.slideActionBarUp(false); + mActivityUi.shouldShowActionBar = true; + mActivityUi.hasSearchQuery= true; + mSearchBox.setVisible(false); + mSearchBox.expand(false, false); + mActionBarController.onDialpadDown(); + assertActionBarState(true, false, false); + } + + // Sliding the dialpad up should fade out the search box if we weren't already in search, or + // slide up the search box otherwise + public void testOnDialpadUp() { + mActivityUi.isInSearchUi = false; + mActionBarController.onDialpadUp(); + assertActionBarState(false, true, false); + + // In Search UI, with expanded search box and something currently typed in the search box + mActivityUi.isInSearchUi = true; + mActivityUi.hasSearchQuery = true; + mSearchBox.expand(true, false); + mSearchBox.setVisible(true); + mActionBarController.slideActionBarUp(false); + mActionBarController.onDialpadUp(); + assertActionBarState(true, false, true); + } + + private void assertActionBarState(boolean isExpanded, boolean isFadedOut, boolean isSlidUp) { + assertEquals(isExpanded, mSearchBox.isExpanded()); + assertEquals(isFadedOut, mSearchBox.isFadedOut()); + assertEquals(isSlidUp, mActionBarController.getIsActionBarSlidUp()); + } +} -- cgit v1.2.3