1d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase/* 2d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Copyright (C) 2014 The Android Open Source Project 3d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * 4d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * you may not use this file except in compliance with the License. 6d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * You may obtain a copy of the License at 7d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * 8d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * http://www.apache.org/licenses/LICENSE-2.0 9d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * 10d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Unless required by applicable law or agreed to in writing, software 11d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * See the License for the specific language governing permissions and 14d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * limitations under the License. 15d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase */ 16d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase 17d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haasepackage android.support.v7.widget; 18d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase 19d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.app.Activity; 20d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.os.Bundle; 21959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyarimport android.os.Handler; 22959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyarimport android.os.Looper; 23959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyarimport android.support.test.runner.MonitoringInstrumentation; 241a2a95faea3d32075b8506f13f6d6f8292db51b6Yigit Boyarimport android.view.WindowManager; 25d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase 26959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyarimport java.util.concurrent.CountDownLatch; 27959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyarimport java.util.concurrent.TimeUnit; 28d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase 29959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyarpublic class TestActivity extends Activity { 30959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar // This is not great but the only way to do this until test runner adds support to not kill 31959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar // activities after tests. 32959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar private static final String TEST_RUNNER = 33959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar MonitoringInstrumentation.class.getCanonicalName() + "$" + MonitoringInstrumentation 34959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar .ActivityFinisher.class.getSimpleName(); 35a90fb62f06861beb3af9f9b3356ef0bb0685547cYigit Boyar private volatile TestedFrameLayout mContainer; 36959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar boolean mVisible; 37959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar boolean mAllowFinish; 38959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar private Handler mHandler; 39d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase 40d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase @Override 41d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase protected void onCreate(Bundle savedInstanceState) { 42d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase super.onCreate(savedInstanceState); 43320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas overridePendingTransition(0, 0); 44320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas 45f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes mContainer = new TestedFrameLayout(this); 46959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar mHandler = new Handler(Looper.getMainLooper()); 47f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes 481a2a95faea3d32075b8506f13f6d6f8292db51b6Yigit Boyar getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 49959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 50d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase setContentView(mContainer); 51619ac016831a5ad75c2e0921c9036b6f030a9e63Yigit Boyar getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 52d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase } 53320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas 54a90fb62f06861beb3af9f9b3356ef0bb0685547cYigit Boyar public TestedFrameLayout getContainer() { 55a90fb62f06861beb3af9f9b3356ef0bb0685547cYigit Boyar return mContainer; 56a90fb62f06861beb3af9f9b3356ef0bb0685547cYigit Boyar } 57a90fb62f06861beb3af9f9b3356ef0bb0685547cYigit Boyar 58959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar public void resetContent() throws InterruptedException { 59959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar final CountDownLatch done = new CountDownLatch(1); 60959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar mHandler.post(new Runnable() { 61959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar @Override 62959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar public void run() { 63959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar mContainer = new TestedFrameLayout(TestActivity.this); 64959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar setContentView(mContainer); 65959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar done.countDown(); 66959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 67959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar }); 68959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar if (!done.await(5, TimeUnit.SECONDS)) { 69959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar throw new AssertionError("could not cleanup activity contents in 5 seconds"); 70959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 71959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 72959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar 73959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar @Override 74959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar protected void onPause() { 75959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar super.onPause(); 76959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar mVisible = false; 77959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 78959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar 79959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar @Override 80959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar public void onResume() { 81959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar super.onResume(); 82959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar mVisible = true; 83959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 84959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar 85320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas @Override 86320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas public void finish() { 87959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar if (!mAllowFinish) { 88959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 89959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar // this is terrible but easy workaround for selective finishing 90959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar for (StackTraceElement element : stackTrace) { 91959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar 92959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar if (TEST_RUNNER.equals(element.getClassName())) { 93959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar // don't allow activity finisher to finish this. 94959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar return; 95959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 96959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 97959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 98320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas super.finish(); 99959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 100959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar 101959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar public void setAllowFinish(boolean allowFinish) { 102959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar mAllowFinish = allowFinish; 103959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar } 104959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar 105959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar public boolean canBeReUsed() { 106959f4c0fac89425a8a9842e82fc180ec736fffacYigit Boyar return getWindow() != null && mVisible && !mAllowFinish; 107320463c1cf5f8e50cce340df195b60835fe23002Aurimas Liutikas } 108d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase} 109