1/*
2 * Copyright (C) 2015 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
17package com.android.internal.app;
18
19import android.test.ActivityInstrumentationTestCase2;
20import android.test.UiThreadTest;
21import android.view.ActionMode;
22import android.view.Menu;
23import android.view.MenuItem;
24
25/**
26 * Tests for {@link WindowDecorActionBar}.
27 */
28public class WindowDecorActionBarTest
29        extends ActivityInstrumentationTestCase2<WindowDecorActionBarTestActivity> {
30    private WindowDecorActionBar mWindowDecorActionBar;
31    private MockActionModeCallback mCallback;
32
33    public WindowDecorActionBarTest() {
34        super(WindowDecorActionBarTestActivity.class);
35    }
36
37    @Override
38    protected void setUp() throws Exception {
39        super.setUp();
40        mWindowDecorActionBar = (WindowDecorActionBar) getActivity().getActionBar();
41        mCallback = new MockActionModeCallback();
42    }
43
44    @UiThreadTest
45    public void testStartActionMode() {
46        ActionMode mode = mWindowDecorActionBar.startActionMode(mCallback);
47
48        assertNotNull(mode);
49        assertTrue(mCallback.mIsCreateActionModeCalled);
50    }
51
52    @UiThreadTest
53    public void testStartActionModeWhenCreateReturnsFalse() {
54        mCallback.mShouldCreateActionMode = false;
55
56        ActionMode mode = mWindowDecorActionBar.startActionMode(mCallback);
57
58        assertNull(mode);
59        assertTrue(mCallback.mIsCreateActionModeCalled);
60    }
61
62    @UiThreadTest
63    public void testStartActionModeFinishesPreviousMode() {
64        ActionMode mode1 = mWindowDecorActionBar.startActionMode(mCallback);
65        ActionMode mode2 = mWindowDecorActionBar.startActionMode(new MockActionModeCallback());
66
67        assertNotNull(mode1);
68        assertNotNull(mode2);
69        assertTrue(mCallback.mIsDestroyActionModeCalled);
70    }
71
72    private static final class MockActionModeCallback implements ActionMode.Callback {
73        private boolean mShouldCreateActionMode = true;
74        private boolean mIsCreateActionModeCalled = false;
75        private boolean mIsDestroyActionModeCalled = false;
76
77        @Override
78        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
79            return true;
80        }
81
82        @Override
83        public void onDestroyActionMode(ActionMode mode) {
84            mIsDestroyActionModeCalled = true;
85        }
86
87        @Override
88        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
89            mIsCreateActionModeCalled = true;
90            return mShouldCreateActionMode;
91        }
92
93        @Override
94        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
95            return false;
96        }
97    }
98}
99