MainFragment.java revision ad31f63f5843898de645f6ee1ac244c872ded8cc
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 15package android.support.v17.leanback.supportleanbackshowcase.app; 16 17import android.app.Fragment; 18import android.content.Intent; 19import android.graphics.drawable.ColorDrawable; 20import android.graphics.drawable.Drawable; 21import android.os.Bundle; 22import android.os.Handler; 23import android.support.v17.leanback.app.BackgroundManager; 24import android.support.v17.leanback.app.BrowseFragment; 25import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity; 26import android.support.v17.leanback.supportleanbackshowcase.app.dialog.DialogExampleActivity; 27import android.support.v17.leanback.supportleanbackshowcase.app.media.MusicConsumptionExampleFragment; 28import android.support.v17.leanback.supportleanbackshowcase.app.media.VideoConsumptionExampleFragment; 29import android.support.v17.leanback.supportleanbackshowcase.app.media.VideoSurfaceFragment; 30import android.support.v17.leanback.supportleanbackshowcase.app.settings.SettingsExampleActivity; 31import android.support.v17.leanback.supportleanbackshowcase.app.wizard.WizardExampleActivity; 32import android.support.v17.leanback.supportleanbackshowcase.utils.Constants; 33import android.support.v17.leanback.supportleanbackshowcase.models.Movie; 34import android.support.v17.leanback.supportleanbackshowcase.utils.PicassoBackgroundManagerTarget; 35import android.support.v17.leanback.supportleanbackshowcase.R; 36import android.support.v17.leanback.supportleanbackshowcase.utils.Utils; 37import android.support.v17.leanback.supportleanbackshowcase.models.Card; 38import android.support.v17.leanback.supportleanbackshowcase.models.CardRow; 39import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector; 40import android.support.v17.leanback.widget.ArrayObjectAdapter; 41import android.support.v17.leanback.widget.ListRow; 42import android.support.v17.leanback.widget.ListRowPresenter; 43import android.support.v17.leanback.widget.OnItemViewClickedListener; 44import android.support.v17.leanback.widget.OnItemViewSelectedListener; 45import android.support.v17.leanback.widget.Presenter; 46import android.support.v17.leanback.widget.PresenterSelector; 47import android.support.v17.leanback.widget.Row; 48import android.support.v17.leanback.widget.RowPresenter; 49import android.util.DisplayMetrics; 50import android.util.Log; 51 52import com.google.gson.Gson; 53import com.squareup.picasso.Picasso; 54import com.squareup.picasso.Target; 55 56import java.net.URI; 57import java.util.Timer; 58import java.util.TimerTask; 59 60 61public class MainFragment extends BrowseFragment { 62 63 public static final String VIDEO_SURFACE_FRAGMENT_TAG = "VIDEO_SURFACE"; 64 private static final String TAG = "MainFragment"; 65 private static final int BACKGROUND_UPDATE_DELAY = 300; 66 private static final int DEFAULT_BACKGROUND_IMAGE = R.drawable.default_background; 67 private final Handler mHandler = new Handler(); 68 private ArrayObjectAdapter mRowsAdapter; 69 private Target mBackgroundTarget; 70 private Timer mBackgroundTimer; 71 private URI mBackgroundURI; 72 private BackgroundManager mBackgroundManager; 73 private DisplayMetrics mMetrics; 74 75 @Override public void onActivityCreated(Bundle savedInstanceState) { 76 if (Constants.LOCAL_LOGD) Log.d(TAG, "onActivityCreated"); 77 super.onActivityCreated(savedInstanceState); 78 79 setupBackgroundManager(); 80 setupUIElements(); 81 setupRowAdapter(); 82 setupEventListeners(); 83 } 84 85 @Override public void onDestroy() { 86 super.onDestroy(); 87 if (null != mBackgroundTimer) { 88 if (Constants.LOCAL_LOGD) Log.d(TAG, "onDestroy: " + mBackgroundTimer.toString()); 89 mBackgroundTimer.cancel(); 90 } 91 } 92 93 private void setupRowAdapter() { 94 mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); 95 createRows(); 96 setAdapter(mRowsAdapter); 97 } 98 99 private void createRows() { 100 String json = Utils 101 .inputStreamToString(getResources().openRawResource(R.raw.cards_launcher)); 102 CardRow[] rows = new Gson().fromJson(json, CardRow[].class); 103 for (CardRow row : rows) { 104 mRowsAdapter.add(createCardRow(row)); 105 } 106 } 107 108 private ListRow createCardRow(CardRow cardRow) { 109 PresenterSelector presenterSelector = new CardPresenterSelector(getActivity()); 110 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector); 111 for (Card card : cardRow.getCards()) { 112 listRowAdapter.add(card); 113 } 114 return new ListRow(listRowAdapter); 115 } 116 117 private void setupBackgroundManager() { 118 mBackgroundManager = BackgroundManager.getInstance(getActivity()); 119 mBackgroundManager.setThemeDrawableResourceId(DEFAULT_BACKGROUND_IMAGE); 120 mBackgroundManager.attach(getActivity().getWindow()); 121 122 mBackgroundTarget = new PicassoBackgroundManagerTarget(mBackgroundManager); 123 mMetrics = new DisplayMetrics(); 124 getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 125 getView().setBackgroundResource(R.drawable.bg_living_room_wide); 126 //updateBackgroundImage(R.drawable.bg_living_room_wide); 127 } 128 129 private void setupUIElements() { 130 setTitle(getString(R.string.browse_title)); 131 setBadgeDrawable(getResources().getDrawable(R.drawable.title_android_tv, null)); 132 setHeadersState(HEADERS_DISABLED); 133 setHeadersTransitionOnBackEnabled(false); 134 setBrandColor(getResources().getColor(R.color.fastlane_background)); 135 } 136 137 private void setupEventListeners() { 138 setOnItemViewClickedListener(new ItemViewClickedListener()); 139 setOnItemViewSelectedListener(new ItemViewSelectedListener()); 140 } 141 142 protected void updateBackgroundImage(URI uri) { 143 // Deactivated until we decide whether to load a background image from an URL or resource. @hahnr 144 if (true) return; 145 Picasso.with(getActivity()).load(uri.toString()) 146 .resize(mMetrics.widthPixels, mMetrics.heightPixels).centerCrop() 147 .error(DEFAULT_BACKGROUND_IMAGE).into(mBackgroundTarget); 148 } 149 150 protected void updateBackgroundImage(Drawable drawable) { 151 mBackgroundManager.setDrawable(drawable); 152 } 153 154 protected void updateBackgroundImage(int resId) { 155 mBackgroundManager.setDrawable(getResources().getDrawable(resId, null)); 156 } 157 158 private void startBackgroundTimer() { 159 if (null != mBackgroundTimer) { 160 mBackgroundTimer.cancel(); 161 } 162 mBackgroundTimer = new Timer(); 163 mBackgroundTimer.schedule(new UpdateBackgroundTask(), BACKGROUND_UPDATE_DELAY); 164 } 165 166 private final class ItemViewClickedListener implements OnItemViewClickedListener { 167 168 @Override public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 169 RowPresenter.ViewHolder rowViewHolder, Row row) { 170 Card card = (Card) item; 171 int id = card.getId(); 172 switch (id) { 173 case 0: { 174 updateBackgroundImage(new ColorDrawable( 175 getResources().getColor(R.color.card_examples_background))); 176 Fragment fragment = new CardExampleFragment(); 177 getFragmentManager().beginTransaction() 178 .replace(R.id.fragmentContainer, fragment) 179 .addToBackStack(null).commit(); 180 break; 181 } 182 case 2: { 183 updateBackgroundImage( 184 getResources().getDrawable(R.drawable.background_canyon, null)); 185 Fragment fragment = new GridExample(); 186 getFragmentManager().beginTransaction() 187 .replace(R.id.fragmentContainer, fragment) 188 .addToBackStack(null).commit(); 189 break; 190 } 191 case 3: { 192 Intent intent = new Intent(getActivity().getBaseContext(), 193 DetailViewExampleActivity.class); 194 startActivity(intent); 195 break; 196 } 197 case 4: { 198 updateBackgroundImage( 199 getResources().getDrawable(R.drawable.background_canyon, null)); 200 Fragment fragment = new VideoConsumptionExampleFragment(); 201 getFragmentManager().beginTransaction() 202 .replace(R.id.fragmentContainer, new VideoSurfaceFragment(), 203 VIDEO_SURFACE_FRAGMENT_TAG) 204 .add(R.id.fragmentContainer, fragment).addToBackStack(null) 205 .commit(); 206 break; 207 } 208 case 5: { 209 updateBackgroundImage( 210 getResources().getDrawable(R.drawable.background_sax, null)); 211 Fragment fragment = new MusicConsumptionExampleFragment(); 212 getFragmentManager().beginTransaction() 213 .replace(R.id.fragmentContainer, fragment) 214 .addToBackStack(null).commit(); 215 break; 216 } 217 case 6: { 218 // Let's create a new Wizard for a given Movie. The movie can come from any sort 219 // of data source. To simplify this example we decode it from a JSON source 220 // which might be loaded from a server in a real world example. 221 Intent intent = new Intent(getActivity().getBaseContext(), 222 WizardExampleActivity.class); 223 224 // Prepare extras which contains the Movie and will be passed to the Activity 225 // which is started through the Intent/. 226 Bundle extras = new Bundle(); 227 String json = Utils.inputStreamToString( 228 getResources().openRawResource(R.raw.wizard_example)); 229 Movie movie = new Gson().fromJson(json, Movie.class); 230 extras.putSerializable("movie", movie); 231 intent.putExtras(extras); 232 233 // Finally, start the wizard Activity. 234 startActivity(intent); 235 break; 236 } 237 case 7: { 238 Intent intent = new Intent(getActivity().getBaseContext(), 239 SettingsExampleActivity.class); 240 startActivity(intent); 241 break; 242 } 243 case 8: { 244 Intent intent = new Intent(getActivity().getBaseContext(), 245 DialogExampleActivity.class); 246 startActivity(intent); 247 break; 248 } 249 default: 250 break; 251 } 252 } 253 } 254 255 private final class ItemViewSelectedListener implements OnItemViewSelectedListener { 256 257 @Override public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 258 RowPresenter.ViewHolder rowViewHolder, Row row) { 259 } 260 } 261 262 private class UpdateBackgroundTask extends TimerTask { 263 264 @Override public void run() { 265 mHandler.post(new Runnable() { 266 @Override public void run() { 267 if (mBackgroundURI != null) { 268 updateBackgroundImage(mBackgroundURI); 269 } 270 } 271 }); 272 } 273 } 274} 275