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