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