| /* |
| * Copyright (C) 2015 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 android.support.v17.leanback.widget; |
| |
| import android.support.v17.leanback.tests.R; |
| import android.support.v7.widget.RecyclerView; |
| import android.support.v17.leanback.widget.BaseGridView; |
| import android.support.v17.leanback.widget.OnChildSelectedListener; |
| import android.app.Activity; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.graphics.Color; |
| import android.os.Bundle; |
| import android.util.Log; |
| import android.util.SparseArray; |
| import android.view.View; |
| import android.view.View.OnClickListener; |
| import android.view.View.OnFocusChangeListener; |
| import android.view.ViewGroup; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| |
| /** |
| * @hide from javadoc |
| */ |
| public class GridActivity extends Activity { |
| private static final String TAG = "GridActivity"; |
| |
| public static final String EXTRA_LAYOUT_RESOURCE_ID = "layoutResourceId"; |
| public static final String EXTRA_NUM_ITEMS = "numItems"; |
| public static final String EXTRA_ITEMS = "items"; |
| public static final String EXTRA_STAGGERED = "staggered"; |
| public static final String SELECT_ACTION = "android.test.leanback.widget.SELECT"; |
| |
| static final int DEFAULT_NUM_ITEMS = 100; |
| static final boolean DEFAULT_STAGGERED = true; |
| |
| private static final boolean DEBUG = false; |
| |
| int mLayoutId; |
| int mOrientation; |
| int mNumItems; |
| boolean mStaggered; |
| |
| int[] mGridViewLayoutSize; |
| BaseGridView mGridView; |
| int[] mItemLengths; |
| |
| private int mBoundCount; |
| |
| private View createView() { |
| |
| View view = getLayoutInflater().inflate(mLayoutId, null, false); |
| mGridView = (BaseGridView) view.findViewById(R.id.gridview); |
| mOrientation = mGridView instanceof HorizontalGridView ? BaseGridView.HORIZONTAL : |
| BaseGridView.VERTICAL; |
| mGridView.setWindowAlignment(BaseGridView.WINDOW_ALIGN_BOTH_EDGE); |
| mGridView.setWindowAlignmentOffsetPercent(35); |
| mGridView.setOnChildSelectedListener(new OnChildSelectedListener() { |
| @Override |
| public void onChildSelected(ViewGroup parent, View view, int position, long id) { |
| if (DEBUG) Log.d(TAG, "onChildSelected position=" + position + " id="+id); |
| } |
| }); |
| return view; |
| } |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| Intent intent = getIntent(); |
| |
| mLayoutId = intent.getIntExtra(EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid); |
| mStaggered = intent.getBooleanExtra(EXTRA_STAGGERED, DEFAULT_STAGGERED); |
| mItemLengths = intent.getIntArrayExtra(EXTRA_ITEMS); |
| if (mItemLengths == null) { |
| mNumItems = intent.getIntExtra(EXTRA_NUM_ITEMS, DEFAULT_NUM_ITEMS); |
| mItemLengths = new int[mNumItems]; |
| for (int i = 0; i < mItemLengths.length; i++) { |
| if (mOrientation == BaseGridView.HORIZONTAL) { |
| mItemLengths[i] = mStaggered ? (int)(Math.random() * 180) + 180 : 240; |
| } else { |
| mItemLengths[i] = mStaggered ? (int)(Math.random() * 120) + 120 : 160; |
| } |
| } |
| } else { |
| mNumItems = mItemLengths.length; |
| } |
| |
| super.onCreate(savedInstanceState); |
| |
| if (DEBUG) Log.v(TAG, "onCreate " + this); |
| |
| RecyclerView.Adapter adapter = new MyAdapter(); |
| |
| View view = createView(); |
| |
| mGridView.setAdapter(new MyAdapter()); |
| setContentView(view); |
| } |
| |
| @Override |
| protected void onNewIntent(Intent intent) { |
| if (DEBUG) Log.v(TAG, "onNewIntent " + intent+ " "+this); |
| if (intent.getAction().equals(SELECT_ACTION)) { |
| int position = intent.getIntExtra("SELECT_POSITION", -1); |
| if (position >= 0) { |
| mGridView.setSelectedPosition(position); |
| } |
| } |
| super.onNewIntent(intent); |
| } |
| |
| private OnFocusChangeListener mItemFocusChangeListener = new OnFocusChangeListener() { |
| |
| @Override |
| public void onFocusChange(View v, boolean hasFocus) { |
| if (hasFocus) { |
| v.setBackgroundColor(Color.YELLOW); |
| } else { |
| v.setBackgroundColor(Color.LTGRAY); |
| } |
| } |
| }; |
| |
| void resetBoundCount() { |
| mBoundCount = 0; |
| } |
| |
| int getBoundCount() { |
| return mBoundCount; |
| } |
| |
| void swap(int index1, int index2) { |
| if (index1 == index2) { |
| return; |
| } else if (index1 > index2) { |
| int index = index1; |
| index1 = index2; |
| index2 = index; |
| } |
| int value = mItemLengths[index1]; |
| mItemLengths[index1] = mItemLengths[index2]; |
| mItemLengths[index2] = value; |
| mGridView.getAdapter().notifyItemMoved(index1, index2); |
| mGridView.getAdapter().notifyItemMoved(index2 - 1, index1); |
| } |
| |
| void changeArraySize(int length) { |
| mNumItems = length; |
| mGridView.getAdapter().notifyDataSetChanged(); |
| } |
| |
| int[] removeItems(int index, int length) { |
| int[] removed = new int[length]; |
| System.arraycopy(mItemLengths, index, removed, 0, length); |
| System.arraycopy(mItemLengths, index + length, mItemLengths, index, |
| mNumItems - index - length); |
| mNumItems -= length; |
| mGridView.getAdapter().notifyItemRangeRemoved(index, length); |
| return removed; |
| } |
| |
| void addItems(int index, int[] items) { |
| int length = items.length; |
| System.arraycopy(mItemLengths, index, mItemLengths, index + length, mNumItems - index); |
| System.arraycopy(items, 0, mItemLengths, index, length); |
| mNumItems += length; |
| mGridView.getAdapter().notifyItemRangeInserted(index, length); |
| } |
| |
| class MyAdapter extends RecyclerView.Adapter { |
| |
| @Override |
| public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { |
| if (DEBUG) Log.v(TAG, "createViewHolder " + viewType); |
| TextView textView = new TextView(parent.getContext()); |
| textView.setTextColor(Color.BLACK); |
| textView.setFocusable(true); |
| textView.setFocusableInTouchMode(true); |
| textView.setOnFocusChangeListener(mItemFocusChangeListener); |
| return new ViewHolder(textView); |
| } |
| |
| @Override |
| public void onBindViewHolder(RecyclerView.ViewHolder baseHolder, int position) { |
| if (DEBUG) Log.v(TAG, "bindViewHolder " + position + " " + baseHolder); |
| mBoundCount++; |
| ViewHolder holder = (ViewHolder) baseHolder; |
| ((TextView) holder.itemView).setText("Item "+position); |
| holder.itemView.setBackgroundColor(Color.LTGRAY); |
| if (mOrientation == BaseGridView.HORIZONTAL) { |
| holder.itemView.setLayoutParams(new ViewGroup.MarginLayoutParams( |
| mItemLengths[position], 80)); |
| } else { |
| holder.itemView.setLayoutParams(new ViewGroup.MarginLayoutParams( |
| 240, mItemLengths[position])); |
| } |
| } |
| |
| @Override |
| public int getItemCount() { |
| return mNumItems; |
| } |
| } |
| |
| static class ViewHolder extends RecyclerView.ViewHolder { |
| |
| public ViewHolder(View v) { |
| super(v); |
| } |
| } |
| } |