1cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes/*
2cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * Copyright (C) 2015 The Android Open Source Project
3cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *
4cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * you may not use this file except in compliance with the License.
6cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * You may obtain a copy of the License at
7cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *
8cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes *
10cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * Unless required by applicable law or agreed to in writing, software
11cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * See the License for the specific language governing permissions and
14cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes * limitations under the License.
15cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes */
16cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
17a37e9311de7ff4407104965ff66146f87e55ba5cKirill Grouchnikovpackage android.support.v7.testutils;
18cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
19cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banesimport android.os.Bundle;
20bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.annotation.NonNull;
21bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.annotation.Nullable;
22a37e9311de7ff4407104965ff66146f87e55ba5cKirill Grouchnikovimport android.support.v7.app.AppCompatActivity;
23bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.v7.app.AppCompatCallback;
24cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banesimport android.support.v7.appcompat.test.R;
25bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banesimport android.support.v7.view.ActionMode;
26cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banesimport android.view.KeyEvent;
27cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banesimport android.view.Menu;
289d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banesimport android.view.MenuItem;
29cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banesimport android.view.WindowManager;
30cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
31a37e9311de7ff4407104965ff66146f87e55ba5cKirill Grouchnikovpublic abstract class BaseTestActivity extends AppCompatActivity {
32cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
33cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    private Menu mMenu;
34cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
35cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    private KeyEvent mOnKeyDownEvent;
36cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    private KeyEvent mOnKeyUpEvent;
37cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    private KeyEvent mOnKeyShortcutEvent;
38cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
399d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    private MenuItem mOptionsItemSelected;
409d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
41cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    private boolean mOnMenuOpenedCalled;
42cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    private boolean mOnPanelClosedCalled;
43cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
442f769dc974bd526d945efe8a644f3f89112e08feChris Banes    private boolean mShouldPopulateOptionsMenu = true;
452f769dc974bd526d945efe8a644f3f89112e08feChris Banes
462f769dc974bd526d945efe8a644f3f89112e08feChris Banes    private boolean mOnBackPressedCalled;
472f769dc974bd526d945efe8a644f3f89112e08feChris Banes    private boolean mDestroyed;
482f769dc974bd526d945efe8a644f3f89112e08feChris Banes
49bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    private AppCompatCallback mAppCompatCallback;
50bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
51cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
52cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    protected void onCreate(Bundle savedInstanceState) {
53cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        super.onCreate(savedInstanceState);
54320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas        overridePendingTransition(0, 0);
55cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
56cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        final int contentView = getContentViewLayoutResId();
57cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        if (contentView > 0) {
58cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes            setContentView(contentView);
59cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        }
60cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        onContentViewSet();
61cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
62cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
63cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
64320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas    @Override
65320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas    public void finish() {
66320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas        super.finish();
67320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas        overridePendingTransition(0, 0);
68320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas    }
69320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas
70cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    protected abstract int getContentViewLayoutResId();
71cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
72cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    protected void onContentViewSet() {
73cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
74cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
75cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
769d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    public boolean onOptionsItemSelected(MenuItem item) {
779d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        mOptionsItemSelected = item;
789d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        return super.onOptionsItemSelected(item);
799d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    }
809d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
819d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    @Override
82cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean onMenuOpened(int featureId, Menu menu) {
83cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnMenuOpenedCalled = true;
84cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return super.onMenuOpened(featureId, menu);
85cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
86cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
87cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
88cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public void onPanelClosed(int featureId, Menu menu) {
89cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnPanelClosedCalled = true;
90cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        super.onPanelClosed(featureId, menu);
91cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
92cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
93cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
94cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean onKeyDown(int keyCode, KeyEvent event) {
95cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnKeyDownEvent = event;
96cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return super.onKeyDown(keyCode, event);
97cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
98cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
99cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
100cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean onKeyUp(int keyCode, KeyEvent event) {
101cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnKeyUpEvent = event;
102cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return super.onKeyUp(keyCode, event);
103cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
104cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
105cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
106cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
107cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnKeyShortcutEvent = event;
108cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return super.onKeyShortcut(keyCode, event);
109cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
110cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
111cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public KeyEvent getInvokedKeyShortcutEvent() {
112cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return mOnKeyShortcutEvent;
113cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
114cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
115cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean wasOnMenuOpenedCalled() {
116cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return mOnMenuOpenedCalled;
117cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
118cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
119cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean wasOnPanelClosedCalled() {
120cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return mOnPanelClosedCalled;
121cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
122cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
123cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public KeyEvent getInvokedKeyDownEvent() {
124cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return mOnKeyDownEvent;
125cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
126cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
127cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public KeyEvent getInvokedKeyUpEvent() {
128cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        return mOnKeyUpEvent;
129cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
130cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
131cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    @Override
132cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public boolean onCreateOptionsMenu(Menu menu) {
133cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mMenu = menu;
1342f769dc974bd526d945efe8a644f3f89112e08feChris Banes        if (mShouldPopulateOptionsMenu) {
1352f769dc974bd526d945efe8a644f3f89112e08feChris Banes            getMenuInflater().inflate(R.menu.sample_actions, menu);
1362f769dc974bd526d945efe8a644f3f89112e08feChris Banes            return true;
1372f769dc974bd526d945efe8a644f3f89112e08feChris Banes        } else {
1382f769dc974bd526d945efe8a644f3f89112e08feChris Banes            menu.clear();
1392f769dc974bd526d945efe8a644f3f89112e08feChris Banes            return super.onCreateOptionsMenu(menu);
1402f769dc974bd526d945efe8a644f3f89112e08feChris Banes        }
141cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
142cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes
1439d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    public MenuItem getOptionsItemSelected() {
1449d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes        return mOptionsItemSelected;
1459d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes    }
1469d9c6a22548670bf017e69fd5d0f47134a18b53fChris Banes
147cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    public void reset() {
148cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnKeyUpEvent = null;
149cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnKeyDownEvent = null;
150cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnKeyShortcutEvent = null;
151cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnMenuOpenedCalled = false;
152cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes        mOnPanelClosedCalled = false;
153733d0b2acb07ede7455b9d020901a10586053923Chris Banes        mMenu = null;
154733d0b2acb07ede7455b9d020901a10586053923Chris Banes        mOptionsItemSelected = null;
155cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes    }
1562f769dc974bd526d945efe8a644f3f89112e08feChris Banes
1572f769dc974bd526d945efe8a644f3f89112e08feChris Banes    public void setShouldPopulateOptionsMenu(boolean populate) {
1582f769dc974bd526d945efe8a644f3f89112e08feChris Banes        mShouldPopulateOptionsMenu = populate;
1592f769dc974bd526d945efe8a644f3f89112e08feChris Banes        if (mMenu != null) {
1602f769dc974bd526d945efe8a644f3f89112e08feChris Banes            supportInvalidateOptionsMenu();
1612f769dc974bd526d945efe8a644f3f89112e08feChris Banes        }
1622f769dc974bd526d945efe8a644f3f89112e08feChris Banes    }
1632f769dc974bd526d945efe8a644f3f89112e08feChris Banes
1642f769dc974bd526d945efe8a644f3f89112e08feChris Banes    @Override
1652f769dc974bd526d945efe8a644f3f89112e08feChris Banes    protected void onDestroy() {
1662f769dc974bd526d945efe8a644f3f89112e08feChris Banes        super.onDestroy();
1672f769dc974bd526d945efe8a644f3f89112e08feChris Banes        mDestroyed = true;
1682f769dc974bd526d945efe8a644f3f89112e08feChris Banes    }
1692f769dc974bd526d945efe8a644f3f89112e08feChris Banes
1702f769dc974bd526d945efe8a644f3f89112e08feChris Banes    @Override
1712f769dc974bd526d945efe8a644f3f89112e08feChris Banes    public void onBackPressed() {
1722f769dc974bd526d945efe8a644f3f89112e08feChris Banes        super.onBackPressed();
1732f769dc974bd526d945efe8a644f3f89112e08feChris Banes        mOnBackPressedCalled = true;
1742f769dc974bd526d945efe8a644f3f89112e08feChris Banes    }
1752f769dc974bd526d945efe8a644f3f89112e08feChris Banes
1762f769dc974bd526d945efe8a644f3f89112e08feChris Banes    public boolean wasOnBackPressedCalled() {
1772f769dc974bd526d945efe8a644f3f89112e08feChris Banes        return mOnBackPressedCalled;
1782f769dc974bd526d945efe8a644f3f89112e08feChris Banes    }
1792f769dc974bd526d945efe8a644f3f89112e08feChris Banes
1802f769dc974bd526d945efe8a644f3f89112e08feChris Banes    public Menu getMenu() {
1812f769dc974bd526d945efe8a644f3f89112e08feChris Banes        return mMenu;
1822f769dc974bd526d945efe8a644f3f89112e08feChris Banes    }
1832f769dc974bd526d945efe8a644f3f89112e08feChris Banes
1842f769dc974bd526d945efe8a644f3f89112e08feChris Banes    @Override
1852f769dc974bd526d945efe8a644f3f89112e08feChris Banes    public boolean isDestroyed() {
1862f769dc974bd526d945efe8a644f3f89112e08feChris Banes        return mDestroyed;
1872f769dc974bd526d945efe8a644f3f89112e08feChris Banes    }
188bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
189bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Override
190bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void onSupportActionModeStarted(@NonNull ActionMode mode) {
191bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        if (mAppCompatCallback != null) {
192bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            mAppCompatCallback.onSupportActionModeStarted(mode);
193bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        }
194bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
195bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
196bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Override
197bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void onSupportActionModeFinished(@NonNull ActionMode mode) {
198bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        if (mAppCompatCallback != null) {
199bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            mAppCompatCallback.onSupportActionModeFinished(mode);
200bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        }
201bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
202bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
203bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Nullable
204bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    @Override
205bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public ActionMode onWindowStartingSupportActionMode(@NonNull ActionMode.Callback callback) {
206bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        if (mAppCompatCallback != null) {
207bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes            return mAppCompatCallback.onWindowStartingSupportActionMode(callback);
208bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        }
209bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        return super.onWindowStartingSupportActionMode(callback);
210bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
211bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes
212bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    public void setAppCompatCallback(AppCompatCallback callback) {
213bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes        mAppCompatCallback = callback;
214bfc9bd50c5c7e6874dc6f32a5d81620398a5c1e5Chris Banes    }
215cdbdcb29b4a4e3bf1553f824902562cee3fcb723Chris Banes}
216