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