aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/ui/sidepanel/SideFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/ui/sidepanel/SideFragment.java')
-rw-r--r--src/com/android/tv/ui/sidepanel/SideFragment.java158
1 files changed, 76 insertions, 82 deletions
diff --git a/src/com/android/tv/ui/sidepanel/SideFragment.java b/src/com/android/tv/ui/sidepanel/SideFragment.java
index 8df56cd2..6bd921a2 100644
--- a/src/com/android/tv/ui/sidepanel/SideFragment.java
+++ b/src/com/android/tv/ui/sidepanel/SideFragment.java
@@ -26,32 +26,36 @@ import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.FrameLayout;
import android.widget.TextView;
import com.android.tv.MainActivity;
import com.android.tv.R;
import com.android.tv.TvApplication;
-import com.android.tv.analytics.DurationTimer;
+import com.android.tv.util.DurationTimer;
import com.android.tv.analytics.HasTrackerLabel;
import com.android.tv.analytics.Tracker;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.ProgramDataManager;
import com.android.tv.util.SystemProperties;
+import com.android.tv.util.ViewCache;
import java.util.List;
-public abstract class SideFragment extends Fragment implements HasTrackerLabel {
+public abstract class SideFragment<T extends Item> extends Fragment implements HasTrackerLabel {
public static final int INVALID_POSITION = -1;
- private static final int RECYCLED_VIEW_POOL_SIZE = 7;
- private static final int[] PRELOADED_VIEW_IDS = {
+ private static final int PRELOAD_VIEW_SIZE = 7;
+ private static final int[] PRELOAD_VIEW_IDS = {
R.layout.option_item_radio_button,
R.layout.option_item_channel_lock,
R.layout.option_item_check_box,
- R.layout.option_item_channel_check
+ R.layout.option_item_channel_check,
+ R.layout.option_item_action
};
- private static RecyclerView.RecycledViewPool sRecycledViewPool;
+ private static RecyclerView.RecycledViewPool sRecycledViewPool =
+ new RecyclerView.RecycledViewPool();
private VerticalGridView mListView;
private ItemAdapter mAdapter;
@@ -89,14 +93,8 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- if (sRecycledViewPool == null) {
- // sRecycledViewPool should be initialized by calling preloadRecycledViews()
- // before the entering animation of this fragment starts,
- // because it takes long time and if it is called after the animation starts (e.g. here)
- // it can affect the animation.
- throw new IllegalStateException("The RecyclerView pool has not been initialized.");
- }
- View view = inflater.inflate(getFragmentLayoutResourceId(), container, false);
+ View view = ViewCache.getInstance().getOrCreateView(
+ inflater, getFragmentLayoutResourceId(), container);
TextView textView = (TextView) view.findViewById(R.id.side_panel_title);
textView.setText(getTitle());
@@ -158,7 +156,7 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
return mListView.getSelectedPosition();
}
- public void setItems(List<Item> items) {
+ public void setItems(List<T> items) {
mAdapter.reset(items);
}
@@ -229,56 +227,50 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
protected abstract String getTitle();
@Override
public abstract String getTrackerLabel();
- protected abstract List<Item> getItemList();
+ protected abstract List<T> getItemList();
public interface SideFragmentListener {
void onSideFragmentViewDestroyed();
}
/**
- * Preloads the view holders.
+ * Preloads the item views.
*/
- public static void preloadRecycledViews(Context context) {
- if (sRecycledViewPool != null) {
- return;
- }
- sRecycledViewPool = new RecyclerView.RecycledViewPool();
- LayoutInflater inflater =
- (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- for (int id : PRELOADED_VIEW_IDS) {
- sRecycledViewPool.setMaxRecycledViews(id, RECYCLED_VIEW_POOL_SIZE);
- for (int j = 0; j < RECYCLED_VIEW_POOL_SIZE; ++j) {
- ItemAdapter.ViewHolder viewHolder = new ItemAdapter.ViewHolder(
- inflater.inflate(id, null, false));
- sRecycledViewPool.putRecycledView(viewHolder);
- }
+ public static void preloadItemViews(Context context) {
+ ViewCache.getInstance().putView(
+ context, R.layout.option_fragment, new FrameLayout(context), 1);
+ VerticalGridView fakeParent = new VerticalGridView(context);
+ for (int id : PRELOAD_VIEW_IDS) {
+ sRecycledViewPool.setMaxRecycledViews(id, PRELOAD_VIEW_SIZE);
+ ViewCache.getInstance().putView(context, id, fakeParent, PRELOAD_VIEW_SIZE);
}
}
/**
- * Releases the pre-loaded view holders.
+ * Releases the recycled view pool.
*/
- public static void releasePreloadedRecycledViews() {
- sRecycledViewPool = null;
+ public static void releaseRecycledViewPool() {
+ sRecycledViewPool.clear();
}
- private static class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
+ private static class ItemAdapter<T extends Item> extends RecyclerView.Adapter<ViewHolder> {
private final LayoutInflater mLayoutInflater;
- private List<Item> mItems;
+ private List<T> mItems;
- private ItemAdapter(LayoutInflater layoutInflater, List<Item> items) {
+ private ItemAdapter(LayoutInflater layoutInflater, List<T> items) {
mLayoutInflater = layoutInflater;
mItems = items;
}
- private void reset(List<Item> items) {
+ private void reset(List<T> items) {
mItems = items;
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new ViewHolder(mLayoutInflater.inflate(viewType, parent, false));
+ View view = ViewCache.getInstance().getOrCreateView(mLayoutInflater, viewType, parent);
+ return new ViewHolder(view);
}
@Override
@@ -301,11 +293,11 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
return mItems == null ? 0 : mItems.size();
}
- private Item getItem(int position) {
+ private T getItem(int position) {
return mItems.get(position);
}
- private void clearRadioGroup(Item item) {
+ private void clearRadioGroup(T item) {
int position = mItems.indexOf(item);
for (int i = position - 1; i >= 0; --i) {
if ((item = mItems.get(i)) instanceof RadioButtonItem) {
@@ -322,55 +314,57 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel {
}
}
}
+ }
- private static class ViewHolder extends RecyclerView.ViewHolder
- implements View.OnClickListener, View.OnFocusChangeListener {
- private ItemAdapter mAdapter;
- public Item mItem;
+ private static class ViewHolder extends RecyclerView.ViewHolder
+ implements View.OnClickListener, View.OnFocusChangeListener {
+ private ItemAdapter mAdapter;
+ public Item mItem;
- private ViewHolder(View view) {
- super(view);
- itemView.setOnClickListener(this);
- itemView.setOnFocusChangeListener(this);
- }
+ private ViewHolder(View view) {
+ super(view);
+ itemView.setOnClickListener(this);
+ itemView.setOnFocusChangeListener(this);
+ }
- public void onBind(ItemAdapter adapter, Item item) {
- mAdapter = adapter;
- mItem = item;
- mItem.onBind(itemView);
- mItem.onUpdate();
- }
+ public void onBind(ItemAdapter adapter, Item item) {
+ mAdapter = adapter;
+ mItem = item;
+ mItem.onBind(itemView);
+ mItem.onUpdate();
+ }
- public void onUnbind() {
- mItem.onUnbind();
- mItem = null;
- mAdapter = null;
- }
+ public void onUnbind() {
+ mItem.onUnbind();
+ mItem = null;
+ mAdapter = null;
+ }
- @Override
- public void onClick(View view) {
- if (mItem instanceof RadioButtonItem) {
- mAdapter.clearRadioGroup(mItem);
- }
- if (view.getBackground() instanceof RippleDrawable) {
- view.postDelayed(new Runnable() {
- @Override
- public void run() {
- if (mItem != null) {
- mItem.onSelected();
+ @Override
+ public void onClick(View view) {
+ if (mItem instanceof RadioButtonItem) {
+ mAdapter.clearRadioGroup(mItem);
+ }
+ if (view.getBackground() instanceof RippleDrawable) {
+ view.postDelayed(
+ new Runnable() {
+ @Override
+ public void run() {
+ if (mItem != null) {
+ mItem.onSelected();
+ }
}
- }
- }, view.getResources().getInteger(R.integer.side_panel_ripple_anim_duration));
- } else {
- mItem.onSelected();
- }
+ },
+ view.getResources().getInteger(R.integer.side_panel_ripple_anim_duration));
+ } else {
+ mItem.onSelected();
}
+ }
- @Override
- public void onFocusChange(View view, boolean focusGained) {
- if (focusGained) {
- mItem.onFocused();
- }
+ @Override
+ public void onFocusChange(View view, boolean focusGained) {
+ if (focusGained) {
+ mItem.onFocused();
}
}
}