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