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 19ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport android.support.v7.widget.LinearLayoutManager; 20ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport android.support.v7.widget.RecyclerView; 21ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport android.view.ViewGroup; 22ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 23ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.Cheeses; 24ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.R; 25ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.widget.adapter.SimpleStringAdapter; 26ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikimport com.example.android.supportv7.widget.util.ConfigToggle; 27ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 28ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik/** 29ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * A configurably janky activity that uses {@link LinearLayoutManager}. 30ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik */ 31ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craikpublic class LinearLayoutManagerJankActivity extends LinearLayoutManagerActivity { 32ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 33ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik private boolean mBindSlowdownEnabled = true; 34ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik private boolean mInflateSlowdownEnabled = true; 35ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 36ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik /** 37ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * Spin wait. Used instead of sleeping so a core is used up for the duration, and so 38ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik * traces/sampled profiling show the sections as expensive, and not just a scheduling mistake. 39ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik */ 40ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik private static void spinWaitMs(long ms) { 41ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik long start = System.nanoTime(); 42ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik while (System.nanoTime() - start < ms * 1000L * 1000L); 43ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 44ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 45ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 46ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik protected RecyclerView.Adapter createAdapter() { 47ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) { 48ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 49ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onBindViewHolder(ViewHolder holder, int position) { 50ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik super.onBindViewHolder(holder, position); 51ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik if (mBindSlowdownEnabled) spinWaitMs(8); 52ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 53ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 54ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 55ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 56ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik if (mInflateSlowdownEnabled) spinWaitMs(4); 57ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik return super.onCreateViewHolder(parent, viewType); 58ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 59ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }; 60ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 61ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 62ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 638faffcd819c6272f9e6537d563c8492854787968Chris Craik protected ConfigToggle[] createConfigToggles() { 64ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik return new ConfigToggle[]{ 65ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik new ConfigToggle(this, R.string.enable_bind_slowdown) { 66ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 67ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public boolean isChecked() { return mBindSlowdownEnabled; } 68ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 69ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 70ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onChange(boolean newValue) { mBindSlowdownEnabled = newValue; } 71ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }, 72ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik new ConfigToggle(this, R.string.enable_inflate_slowdown) { 73ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 74ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public boolean isChecked() { return mInflateSlowdownEnabled; } 75ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 76ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 77ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onChange(boolean newValue) { mInflateSlowdownEnabled = newValue; } 78ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }, 79ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik new ConfigToggle(this, R.string.enable_prefetch) { 80ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 81ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public boolean isChecked() { return mLayoutManager.isItemPrefetchEnabled(); } 82ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik 83ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik @Override 84ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik public void onChange(boolean newValue) { 85ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik mLayoutManager.setItemPrefetchEnabled(newValue); 86ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 87ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }, 88ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik }; 89ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik } 90ec4b5429886bfe93707a85823cf40de107bd9dc6Chris Craik} 91