158427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik/*
258427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * Copyright (C) 2016 The Android Open Source Project
358427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik *
458427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
558427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * you may not use this file except in compliance with the License.
658427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * You may obtain a copy of the License at
758427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik *
858427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
958427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik *
1058427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * Unless required by applicable law or agreed to in writing, software
1158427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
1258427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1358427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * See the License for the specific language governing permissions and
1458427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik * limitations under the License.
1558427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik */
1658427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikpackage com.android.test.uibench;
1758427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik
1858427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport android.content.Context;
1958427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport android.os.Trace;
2058427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport android.support.v7.widget.GridLayoutManager;
2158427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport android.support.v7.widget.RecyclerView;
2258427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport com.android.test.uibench.recyclerview.RvBoxAdapter;
2358427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport com.android.test.uibench.recyclerview.RvCompatListActivity;
2458427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik
2558427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikimport java.util.concurrent.TimeUnit;
2658427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik
2758427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craikpublic class SlowBindRecyclerViewActivity extends RvCompatListActivity {
2858427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    /**
2958427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik     * Spin wait. Used instead of sleeping so a core is used up for the duration, and so
3058427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik     * traces/sampled profiling show the sections as expensive, and not just a scheduling mistake.
3158427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik     */
3258427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    private static void spinWaitMs(long ms) {
3358427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik        long start = System.nanoTime();
3458427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik        while (System.nanoTime() - start < TimeUnit.MILLISECONDS.toNanos(ms));
3558427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    }
3658427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik
3758427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    @Override
3858427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    protected RecyclerView.LayoutManager createLayoutManager(Context context) {
3958427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik        return new GridLayoutManager(context, 3);
4058427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    }
4158427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik
4258427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    @Override
4358427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    protected RecyclerView.Adapter createAdapter() {
4458427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik        return new RvBoxAdapter(this, TextUtils.buildSimpleStringList()) {
4558427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik            @Override
4658427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik            public void onBindViewHolder(ViewHolder holder, int position) {
4758427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik                Trace.beginSection("bind item " + position);
4858427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik
4958427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik                spinWaitMs(3);
5058427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik                super.onBindViewHolder(holder, position);
5158427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik                Trace.endSection();
5258427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik            }
5358427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik        };
5458427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik    }
5558427a62ac6dce6acc35617ac9eabdaba18ea2b4Chris Craik}
56