diff options
4 files changed, 163 insertions, 2 deletions
diff --git a/tests/UiBench/AndroidManifest.xml b/tests/UiBench/AndroidManifest.xml index 12143b75222a..cb5f6c7f0326 100644 --- a/tests/UiBench/AndroidManifest.xml +++ b/tests/UiBench/AndroidManifest.xml @@ -93,13 +93,21 @@ </activity> <activity android:name=".TrivialRecyclerViewActivity" - android:label="General/Trivial Recycler ListView" > + android:label="General/Trivial RecyclerView" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="com.android.test.uibench.TEST" /> </intent-filter> </activity> <activity + android:name=".SlowBindRecyclerViewActivity" + android:label="General/Slow Bind RecyclerView" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="com.android.test.uibench.TEST" /> + </intent-filter> + </activity> + <activity android:name=".ActivityTransition" android:label="Transitions/Activity Transition" > <intent-filter> diff --git a/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java b/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java new file mode 100644 index 000000000000..e32862f7b7fd --- /dev/null +++ b/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.test.uibench; + +import android.content.Context; +import android.os.Trace; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import com.android.test.uibench.recyclerview.RvBoxAdapter; +import com.android.test.uibench.recyclerview.RvCompatListActivity; + +import java.util.concurrent.TimeUnit; + +public class SlowBindRecyclerViewActivity extends RvCompatListActivity { + /** + * Spin wait. Used instead of sleeping so a core is used up for the duration, and so + * traces/sampled profiling show the sections as expensive, and not just a scheduling mistake. + */ + private static void spinWaitMs(long ms) { + long start = System.nanoTime(); + while (System.nanoTime() - start < TimeUnit.MILLISECONDS.toNanos(ms)); + } + + @Override + protected RecyclerView.LayoutManager createLayoutManager(Context context) { + return new GridLayoutManager(context, 3); + } + + @Override + protected RecyclerView.Adapter createAdapter() { + return new RvBoxAdapter(this, TextUtils.buildSimpleStringList()) { + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Trace.beginSection("bind item " + position); + + spinWaitMs(3); + super.onBindViewHolder(holder, position); + Trace.endSection(); + } + }; + } +} diff --git a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java new file mode 100644 index 000000000000..3440f192e7c5 --- /dev/null +++ b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.test.uibench.recyclerview; + +import android.content.Context; +import android.graphics.Color; +import android.support.v7.widget.RecyclerView; +import android.util.TypedValue; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RvBoxAdapter extends RecyclerView.Adapter<RvBoxAdapter.ViewHolder> { + + private int mBackground; + + private List<String> mValues; + + public static class ViewHolder extends RecyclerView.ViewHolder { + public TextView mTextView; + + public ViewHolder(TextView v) { + super(v); + mTextView = v; + } + + @Override + public String toString() { + return super.toString() + " '" + mTextView.getText(); + } + } + + public RvBoxAdapter(Context context, String[] strings) { + TypedValue val = new TypedValue(); + if (context.getTheme() != null) { + context.getTheme().resolveAttribute( + android.R.attr.selectableItemBackground, val, true); + } + mBackground = val.resourceId; + mValues = new ArrayList<>(); + Collections.addAll(mValues, strings); + } + + @Override + public RvBoxAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + final ViewHolder h = new ViewHolder(new TextView(parent.getContext())); + h.mTextView.setMinimumHeight(128); + h.mTextView.setPadding(20, 0, 20, 0); + h.mTextView.setFocusable(true); + h.mTextView.setBackgroundResource(mBackground); + RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + lp.leftMargin = 10; + lp.rightMargin = 5; + lp.topMargin = 20; + lp.bottomMargin = 15; + h.mTextView.setLayoutParams(lp); + return h; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.mTextView.setText(position + ":" + mValues.get(position)); + holder.mTextView.setMinHeight((200 + mValues.get(position).length() * 10)); + holder.mTextView.setBackgroundColor(getBackgroundColor(position)); + } + + private int getBackgroundColor(int position) { + switch (position % 4) { + case 0: return Color.LTGRAY; + case 1: return Color.RED; + case 2: return Color.DKGRAY; + case 3: return Color.BLUE; + } + return Color.TRANSPARENT; + } + + @Override + public int getItemCount() { + return mValues.size(); + } +} diff --git a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java index e08dbc66e7f2..939b66198d72 100644 --- a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java +++ b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java @@ -26,7 +26,6 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; import com.android.test.uibench.R; |