1ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik/* 2ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * Copyright (C) 2016 The Android Open Source Project 3ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * 4ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * you may not use this file except in compliance with the License. 6ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * You may obtain a copy of the License at 7ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * 8ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 9ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * 10ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * Unless required by applicable law or agreed to in writing, software 11ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * See the License for the specific language governing permissions and 14ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * limitations under the License. 15ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik */ 16ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 17ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikpackage com.example.android.supportv7.widget; 18ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 19def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport android.view.ViewGroup; 20def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 21ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.recyclerview.widget.LinearLayoutManager; 22ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.recyclerview.widget.RecyclerView; 23ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 24ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.Cheeses; 25ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.R; 26ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.widget.adapter.SimpleStringAdapter; 27ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.widget.util.ConfigToggle; 28ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 29ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik/** 30ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * A configurably janky activity that uses {@link LinearLayoutManager}. 31ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik */ 32ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikpublic class LinearLayoutManagerJankActivity extends LinearLayoutManagerActivity { 33ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 34ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik private boolean mBindSlowdownEnabled = true; 35ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik private boolean mInflateSlowdownEnabled = true; 36ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 37ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik /** 38ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * Spin wait. Used instead of sleeping so a core is used up for the duration, and so 39ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * traces/sampled profiling show the sections as expensive, and not just a scheduling mistake. 40ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik */ 41ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik private static void spinWaitMs(long ms) { 42ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik long start = System.nanoTime(); 43ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik while (System.nanoTime() - start < ms * 1000L * 1000L); 44ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 45ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 46ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 47ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik protected RecyclerView.Adapter createAdapter() { 48ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) { 49ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 50ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onBindViewHolder(ViewHolder holder, int position) { 51ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik super.onBindViewHolder(holder, position); 52ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik if (mBindSlowdownEnabled) spinWaitMs(8); 53ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 54ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 55ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 56ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 57ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik if (mInflateSlowdownEnabled) spinWaitMs(4); 58ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik return super.onCreateViewHolder(parent, viewType); 59ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 60ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }; 61ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 62ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 63ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 648faffcd819c6272f9e6537d563c8492854787968Chris Craik protected ConfigToggle[] createConfigToggles() { 65ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik return new ConfigToggle[]{ 66ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik new ConfigToggle(this, R.string.enable_bind_slowdown) { 67ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 68ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public boolean isChecked() { return mBindSlowdownEnabled; } 69ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 70ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 71ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onChange(boolean newValue) { mBindSlowdownEnabled = newValue; } 72ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }, 73ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik new ConfigToggle(this, R.string.enable_inflate_slowdown) { 74ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 75ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public boolean isChecked() { return mInflateSlowdownEnabled; } 76ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 77ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 78ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onChange(boolean newValue) { mInflateSlowdownEnabled = newValue; } 79ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }, 80ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik new ConfigToggle(this, R.string.enable_prefetch) { 81ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 82ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public boolean isChecked() { return mLayoutManager.isItemPrefetchEnabled(); } 83ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 84ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 85ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onChange(boolean newValue) { 86ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik mLayoutManager.setItemPrefetchEnabled(newValue); 87ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 88ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }, 89ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }; 90ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 91ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik} 92