10178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu/* 20178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * Copyright (C) 2016 The Android Open Source Project 30178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * 40178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * Licensed under the Apache License, Version 2.0 (the "License"); 50178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * you may not use this file except in compliance with the License. 60178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * You may obtain a copy of the License at 70178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * 80178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * http://www.apache.org/licenses/LICENSE-2.0 90178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * 100178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * Unless required by applicable law or agreed to in writing, software 110178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * distributed under the License is distributed on an "AS IS" BASIS, 120178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * See the License for the specific language governing permissions and 140178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu * limitations under the License 150178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu */ 160178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 170178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanupackage android.widget; 180178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 190178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.app.Activity; 200178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.os.Looper; 210178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.os.Bundle; 220178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.perftests.utils.PerfStatusReporter; 230178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.util.Log; 240178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.view.View; 250178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 260178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.perftests.utils.BenchmarkState; 270178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.perftests.utils.StubActivity; 280178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.filters.LargeTest; 290178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.runner.AndroidJUnit4; 300178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.rule.ActivityTestRule; 310178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport android.support.test.InstrumentationRegistry; 320178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 330178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport com.android.perftests.core.R; 340178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 350178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport java.util.Locale; 360178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport java.util.Collection; 370178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport java.util.Arrays; 380178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 390178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.Test; 400178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.Rule; 410178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.runners.Parameterized; 420178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.runners.Parameterized.Parameters; 430178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport org.junit.runner.RunWith; 440178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 450178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanuimport static org.junit.Assert.assertTrue; 460178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 470178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu@LargeTest 480178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu@RunWith(Parameterized.class) 490178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanupublic class TextViewAutoSizeLayoutPerfTest { 500178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu @Parameters(name = "{0}") 510178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu public static Collection layouts() { 520178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu return Arrays.asList(new Object[][] { 530178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Basic TextView - no autosize", R.layout.test_basic_textview_layout}, 540178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 5 sizes", R.layout.test_autosize_textview_5}, 550178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 10 sizes", R.layout.test_autosize_textview_10}, 560178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 50 sizes", R.layout.test_autosize_textview_50}, 570178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 100 sizes", R.layout.test_autosize_textview_100}, 580178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 300 sizes", R.layout.test_autosize_textview_300}, 590178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 500 sizes", R.layout.test_autosize_textview_500}, 600178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 1000 sizes", R.layout.test_autosize_textview_1000}, 610178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 10000 sizes", R.layout.test_autosize_textview_10000}, 620178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu { "Autosize TextView 100000 sizes", R.layout.test_autosize_textview_100000} 630178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu }); 640178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu } 650178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 660178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu private int mLayoutId; 670178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 680178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu public TextViewAutoSizeLayoutPerfTest(String key, int layoutId) { 690178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu mLayoutId = layoutId; 700178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu } 710178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 720178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu @Rule 730178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu public ActivityTestRule<StubActivity> mActivityRule = 740178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu new ActivityTestRule(StubActivity.class); 750178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 760178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu @Rule 770178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); 780178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 790178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu @Test 800178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu public void testConstruction() throws Throwable { 810178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 820178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu assertTrue("We should be running on the main thread", 830178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu Looper.getMainLooper().getThread() == Thread.currentThread()); 840178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu assertTrue("We should be running on the main thread", 850178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu Looper.myLooper() == Looper.getMainLooper()); 860178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); 870178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu Activity activity = mActivityRule.getActivity(); 880178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu activity.setContentView(mLayoutId); 890178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu 900178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu while (state.keepRunning()) { 910178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu TextView textView = new TextView(activity); 92ab18567419d8bd8b2c1bcbad771ebcbfbdab2ae8Andrei Stingaceanu // TextView#onLayout() gets called, which triggers TextView#autoSizeText() 930178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu // which is the method we want to benchmark. 940178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu textView.requestLayout(); 950178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu } 960178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu }); 970178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu } 980178c2392be34ce4812a76458233d50a76fd4ad6Andrei Stingaceanu} 99