MainFragment.java (8448B)
1 package de.nordgedanken.rpicms; 2 3 import java.net.URI; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Timer; 7 import java.util.TimerTask; 8 9 import android.content.Intent; 10 import android.graphics.Color; 11 import android.graphics.drawable.Drawable; 12 import android.os.Bundle; 13 import android.os.Handler; 14 import android.support.v17.leanback.app.BackgroundManager; 15 import android.support.v17.leanback.app.BrowseFragment; 16 import android.support.v17.leanback.widget.ArrayObjectAdapter; 17 import android.support.v17.leanback.widget.HeaderItem; 18 import android.support.v17.leanback.widget.ListRow; 19 import android.support.v17.leanback.widget.ListRowPresenter; 20 import android.support.v17.leanback.widget.OnItemClickedListener; 21 import android.support.v17.leanback.widget.OnItemSelectedListener; 22 import android.support.v17.leanback.widget.Presenter; 23 import android.support.v17.leanback.widget.Row; 24 import android.util.DisplayMetrics; 25 import android.util.Log; 26 import android.view.Gravity; 27 import android.view.View; 28 import android.view.ViewGroup; 29 import android.widget.TextView; 30 import android.widget.Toast; 31 32 import com.squareup.picasso.Picasso; 33 import com.squareup.picasso.Target; 34 35 36 public class MainFragment extends BrowseFragment { 37 private static final String TAG = "MainFragment"; 38 39 private static final int NUM_ROWS = 6; 40 private static final int NUM_COLS = 15; 41 42 private ArrayObjectAdapter mRowsAdapter; 43 private Drawable mDefaultBackground; 44 private Target mBackgroundTarget; 45 private DisplayMetrics mMetrics; 46 private Timer mBackgroundTimer; 47 private final Handler mHandler = new Handler(); 48 private URI mBackgroundURI; 49 Movie mMovie; 50 CardPresenter mCardPresenter; 51 52 @Override 53 public void onActivityCreated(Bundle savedInstanceState) { 54 Log.i(TAG, "onCreate"); 55 super.onActivityCreated(savedInstanceState); 56 57 prepareBackgroundManager(); 58 59 setupUIElements(); 60 61 loadRows(); 62 63 setupEventListeners(); 64 } 65 66 private void loadRows() { 67 List<Movie> list = MovieList.setupMovies(); 68 69 mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); 70 mCardPresenter = new CardPresenter(); 71 72 int i; 73 for (i = 0; i < NUM_ROWS; i++) { 74 if (i != 0) { 75 Collections.shuffle(list); 76 } 77 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(mCardPresenter); 78 for (int j = 0; j < NUM_COLS; j++) { 79 listRowAdapter.add(list.get(j % 5)); 80 } 81 HeaderItem header = new HeaderItem(i, MovieList.MOVIE_CATEGORY[i], null); 82 mRowsAdapter.add(new ListRow(header, listRowAdapter)); 83 } 84 85 HeaderItem gridHeader = new HeaderItem(i, "PREFERENCES", null); 86 87 GridItemPresenter mGridPresenter = new GridItemPresenter(); 88 ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(mGridPresenter); 89 gridRowAdapter.add(getResources().getString(R.string.grid_view)); 90 gridRowAdapter.add(getResources().getString(R.string.send_feeback)); 91 gridRowAdapter.add(getResources().getString(R.string.personal_settings)); 92 mRowsAdapter.add(new ListRow(gridHeader, gridRowAdapter)); 93 94 setAdapter(mRowsAdapter); 95 96 } 97 98 private void prepareBackgroundManager() { 99 100 BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity()); 101 backgroundManager.attach(getActivity().getWindow()); 102 mBackgroundTarget = new PicassoBackgroundManagerTarget(backgroundManager); 103 104 mDefaultBackground = getResources().getDrawable(R.drawable.default_background); 105 106 mMetrics = new DisplayMetrics(); 107 getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 108 } 109 110 private void setupUIElements() { 111 // setBadgeDrawable(getActivity().getResources().getDrawable( 112 // R.drawable.videos_by_google_banner)); 113 setTitle(getString(R.string.browse_title)); // Badge, when set, takes precedent 114 // over title 115 setHeadersState(HEADERS_ENABLED); 116 setHeadersTransitionOnBackEnabled(true); 117 118 // set fastLane (or headers) background color 119 setBrandColor(getResources().getColor(R.color.fastlane_background)); 120 // set search icon color 121 setSearchAffordanceColor(getResources().getColor(R.color.search_opaque)); 122 } 123 124 private void setupEventListeners() { 125 setOnItemSelectedListener(getDefaultItemSelectedListener()); 126 setOnItemClickedListener(getDefaultItemClickedListener()); 127 setOnSearchClickedListener(new View.OnClickListener() { 128 @Override 129 public void onClick(View view) { 130 Toast.makeText(getActivity(), "Implement your own in-app search", Toast.LENGTH_LONG) 131 .show(); 132 } 133 }); 134 } 135 136 protected OnItemSelectedListener getDefaultItemSelectedListener() { 137 return new OnItemSelectedListener() { 138 @Override 139 public void onItemSelected(Object item, Row row) { 140 if (item instanceof Movie) { 141 mBackgroundURI = ((Movie) item).getBackgroundImageURI(); 142 startBackgroundTimer(); 143 } 144 } 145 }; 146 } 147 148 protected OnItemClickedListener getDefaultItemClickedListener() { 149 return new OnItemClickedListener() { 150 @Override 151 public void onItemClicked(Object item, Row row) { 152 if (item instanceof Movie) { 153 Movie movie = (Movie) item; 154 Log.d(TAG, "Item: " + item.toString()); 155 Intent intent = new Intent(getActivity(), DetailsActivity.class); 156 intent.putExtra(getString(R.string.movie), movie); 157 startActivity(intent); 158 } 159 else if (item instanceof String) { 160 Toast.makeText(getActivity(), (String) item, Toast.LENGTH_SHORT) 161 .show(); 162 } 163 } 164 }; 165 } 166 167 protected void setDefaultBackground(Drawable background) { 168 mDefaultBackground = background; 169 } 170 171 protected void setDefaultBackground(int resourceId) { 172 mDefaultBackground = getResources().getDrawable(resourceId); 173 } 174 175 protected void updateBackground(URI uri) { 176 Picasso.with(getActivity()) 177 .load(uri.toString()) 178 .resize(mMetrics.widthPixels, mMetrics.heightPixels) 179 .centerCrop() 180 .error(mDefaultBackground) 181 .into(mBackgroundTarget); 182 } 183 184 protected void updateBackground(Drawable drawable) { 185 BackgroundManager.getInstance(getActivity()).setDrawable(drawable); 186 } 187 188 protected void clearBackground() { 189 BackgroundManager.getInstance(getActivity()).setDrawable(mDefaultBackground); 190 } 191 192 private void startBackgroundTimer() { 193 if (null != mBackgroundTimer) { 194 mBackgroundTimer.cancel(); 195 } 196 mBackgroundTimer = new Timer(); 197 mBackgroundTimer.schedule(new UpdateBackgroundTask(), 300); 198 } 199 200 private class UpdateBackgroundTask extends TimerTask { 201 202 @Override 203 public void run() { 204 mHandler.post(new Runnable() { 205 @Override 206 public void run() { 207 if (mBackgroundURI != null) { 208 updateBackground(mBackgroundURI); 209 } 210 } 211 }); 212 213 } 214 } 215 216 private class GridItemPresenter extends Presenter { 217 @Override 218 public ViewHolder onCreateViewHolder(ViewGroup parent) { 219 TextView view = new TextView(parent.getContext()); 220 view.setLayoutParams(new ViewGroup.LayoutParams(200, 200)); 221 view.setFocusable(true); 222 view.setFocusableInTouchMode(true); 223 view.setBackgroundColor(getResources().getColor(R.color.default_background)); 224 view.setTextColor(Color.WHITE); 225 view.setGravity(Gravity.CENTER); 226 return new ViewHolder(view); 227 } 228 229 @Override 230 public void onBindViewHolder(ViewHolder viewHolder, Object item) { 231 ((TextView) viewHolder.view).setText((String) item); 232 } 233 234 @Override 235 public void onUnbindViewHolder(ViewHolder viewHolder) { 236 } 237 } 238 239 }