1223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki/*
2223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * Copyright (C) 2015 The Android Open Source Project
3223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki *
4223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * Licensed under the Apache License, Version 2.0 (the "License");
5223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * you may not use this file except in compliance with the License.
6223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * You may obtain a copy of the License at
7223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki *
8223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki *      http://www.apache.org/licenses/LICENSE-2.0
9223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki *
10223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * Unless required by applicable law or agreed to in writing, software
11223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * distributed under the License is distributed on an "AS IS" BASIS,
12223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * See the License for the specific language governing permissions and
14223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * limitations under the License
15223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki */
16223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki
17223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Tokipackage android.widget;
18223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki
19223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Tokiimport com.android.frameworks.coretests.R;
20223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki
21223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Tokiimport android.app.Activity;
22223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Tokiimport android.os.Bundle;
23ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonakaimport android.os.SystemClock;
24ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonakaimport android.util.Log;
25223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki
26223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki/**
27223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki * An activity for testing the TextView widget.
28ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka *
29ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka * This class is copied from {@link android.text.method.cts.KeyListenerCtsActivity} in
30ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka * CtsTextTestCase.  The original class is located at
31ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka * cts/tests/tests/text/src/android/text/method/cts/KeyListenerCtsActivity.java
32223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki */
33223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Tokipublic class TextViewActivity extends Activity {
34ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    private boolean mHasWindowFocus = false;
35ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    private Object mHasWindowFocusLock = new Object();
36223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki
37223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki    @Override
38223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki    protected void onCreate(Bundle savedInstanceState) {
39223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki        super.onCreate(savedInstanceState);
40223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki        setContentView(R.layout.activity_text_view);
41223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki    }
42ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka
43ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    @Override
44ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    public void onWindowFocusChanged(boolean hasFocus) {
45ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        super.onWindowFocusChanged(hasFocus);
46ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        if (!hasFocus) {
47ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            Log.w("TextViewActivity", "TextViewActivity lost window focus");
48ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        }
49ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        synchronized(mHasWindowFocusLock) {
50ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            mHasWindowFocus = hasFocus;
51ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            mHasWindowFocusLock.notify();
52ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        }
53ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    }
54ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka
55ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    /**
56ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka     * Blocks the calling thread until the {@link KeyListenerCtsActivity} has window focus or the
57ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka     * specified duration (in milliseconds) has passed.
58ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka     */
59ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    public boolean waitForWindowFocus(long durationMillis) {
60ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        long elapsedMillis = SystemClock.elapsedRealtime();
61ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        synchronized(mHasWindowFocusLock) {
62ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            mHasWindowFocus = hasWindowFocus();
63ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            while (!mHasWindowFocus && durationMillis > 0) {
64ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                long newElapsedMillis = SystemClock.elapsedRealtime();
65ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                durationMillis -= (newElapsedMillis - elapsedMillis);
66ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                elapsedMillis = newElapsedMillis;
67ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                if (durationMillis > 0) {
68ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                    try {
69ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                        mHasWindowFocusLock.wait(durationMillis);
70ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                    } catch (InterruptedException e) {
71ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                    }
72ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka                }
73ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            }
74ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka            return mHasWindowFocus;
75ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka        }
76ff3bfd5a79a95dcfccd1b8ad6c08c715ce6fa0e3Seigo Nonaka    }
77223c8392f066823cf4a3a98957960deb80ab1680Abodunrinwa Toki}
78