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