blob: 6486a10b641eb3557c59a938a08d6075bea964b0 [file] [log] [blame]
/*
* 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.supportleanbackshowcase;
import android.app.Fragment;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.support.v17.leanback.app.BackgroundManager;
import android.support.v17.leanback.app.BrowseFragment;
import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card;
import android.support.v17.leanback.supportleanbackshowcase.cards.models.CardRow;
import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.OnItemViewClickedListener;
import android.support.v17.leanback.widget.OnItemViewSelectedListener;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.PresenterSelector;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.util.DisplayMetrics;
import android.util.Log;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import java.net.URI;
import java.util.Timer;
import java.util.TimerTask;
public class MainFragment extends BrowseFragment {
public static final String VIDEO_SURFACE_FRAGMENT_TAG = "VIDEO_SURFACE";
private static final String TAG = "MainFragment";
private static final int BACKGROUND_UPDATE_DELAY = 300;
private static final int DEFAULT_BACKGROUND_IMAGE = R.drawable.default_background;
private final Handler mHandler = new Handler();
private ArrayObjectAdapter mRowsAdapter;
private Target mBackgroundTarget;
private Timer mBackgroundTimer;
private URI mBackgroundURI;
private BackgroundManager mBackgroundManager;
private DisplayMetrics mMetrics;
@Override public void onActivityCreated(Bundle savedInstanceState) {
if (Constants.LOCAL_LOGD) Log.d(TAG, "onActivityCreated");
super.onActivityCreated(savedInstanceState);
setupBackgroundManager();
setupUIElements();
setupRowAdapter();
setupEventListeners();
}
@Override public void onDestroy() {
super.onDestroy();
if (null != mBackgroundTimer) {
if (Constants.LOCAL_LOGD) Log.d(TAG, "onDestroy: " + mBackgroundTimer.toString());
mBackgroundTimer.cancel();
}
}
private void setupRowAdapter() {
mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
createRows();
setAdapter(mRowsAdapter);
}
private void createRows() {
String json = Utils
.inputStreamToString(getResources().openRawResource(R.raw.cards_launcher));
CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
for (CardRow row : rows) {
mRowsAdapter.add(createCardRow(row));
}
}
private ListRow createCardRow(CardRow cardRow) {
PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
for (Card card : cardRow.getCards()) {
listRowAdapter.add(card);
}
return new ListRow(listRowAdapter);
}
private void setupBackgroundManager() {
mBackgroundManager = BackgroundManager.getInstance(getActivity());
mBackgroundManager.setThemeDrawableResourceId(DEFAULT_BACKGROUND_IMAGE);
mBackgroundManager.attach(getActivity().getWindow());
mBackgroundTarget = new PicassoBackgroundManagerTarget(mBackgroundManager);
mMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
getView().setBackgroundResource(R.drawable.bg_living_room_wide);
//updateBackgroundImage(R.drawable.bg_living_room_wide);
}
private void setupUIElements() {
setTitle(getString(R.string.browse_title));
setBadgeDrawable(getResources().getDrawable(R.drawable.title_android_tv, null));
setHeadersState(HEADERS_DISABLED);
setHeadersTransitionOnBackEnabled(false);
setBrandColor(getResources().getColor(R.color.fastlane_background));
}
private void setupEventListeners() {
setOnItemViewClickedListener(new ItemViewClickedListener());
setOnItemViewSelectedListener(new ItemViewSelectedListener());
}
protected void updateBackgroundImage(URI uri) {
// Deactivated until we decide whether to load a background image from an URL or resource. @hahnr
if (true) return;
Picasso.with(getActivity()).load(uri.toString())
.resize(mMetrics.widthPixels, mMetrics.heightPixels).centerCrop()
.error(DEFAULT_BACKGROUND_IMAGE).into(mBackgroundTarget);
}
protected void updateBackgroundImage(Drawable drawable) {
mBackgroundManager.setDrawable(drawable);
}
protected void updateBackgroundImage(int resId) {
mBackgroundManager.setDrawable(getResources().getDrawable(resId, null));
}
private void startBackgroundTimer() {
if (null != mBackgroundTimer) {
mBackgroundTimer.cancel();
}
mBackgroundTimer = new Timer();
mBackgroundTimer.schedule(new UpdateBackgroundTask(), BACKGROUND_UPDATE_DELAY);
}
private final class ItemViewClickedListener implements OnItemViewClickedListener {
@Override public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
Card card = (Card) item;
int id = card.getId();
switch (id) {
case 0: {
updateBackgroundImage(new ColorDrawable(
getResources().getColor(R.color.card_examples_background)));
Fragment fragment = new CardExampleFragment();
getFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, fragment)
.addToBackStack(null).commit();
break;
}
case 2: {
updateBackgroundImage(
getResources().getDrawable(R.drawable.background_canyon, null));
Fragment fragment = new GridExample();
getFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, fragment)
.addToBackStack(null).commit();
break;
}
case 3: {
Intent intent = new Intent(getActivity().getBaseContext(),
DetailViewExampleActivity.class);
startActivity(intent);
break;
}
case 4: {
updateBackgroundImage(
getResources().getDrawable(R.drawable.background_canyon, null));
Fragment fragment = new VideoConsumptionExampleFragment();
getFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, new VideoSurfaceFragment(),
VIDEO_SURFACE_FRAGMENT_TAG)
.add(R.id.fragmentContainer, fragment).addToBackStack(null)
.commit();
break;
}
case 5: {
updateBackgroundImage(
getResources().getDrawable(R.drawable.background_sax, null));
Fragment fragment = new MusicConsumptionExampleFragment();
getFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, fragment)
.addToBackStack(null).commit();
break;
}
case 6: {
// Let's create a new Wizard for a given Movie. The movie can come from any sort
// of data source. To simplify this example we decode it from a JSON source
// which might be loaded from a server in a real world example.
Intent intent = new Intent(getActivity().getBaseContext(),
WizardExampleActivity.class);
// Prepare extras which contains the Movie and will be passed to the Activity
// which is started through the Intent/.
Bundle extras = new Bundle();
String json = Utils.inputStreamToString(
getResources().openRawResource(R.raw.wizard_example));
Movie movie = new Gson().fromJson(json, Movie.class);
extras.putSerializable("movie", movie);
intent.putExtras(extras);
// Finally, start the wizard Activity.
startActivity(intent);
break;
}
case 7: {
Intent intent = new Intent(getActivity().getBaseContext(),
SettingsExampleActivity.class);
startActivity(intent);
break;
}
case 8: {
Intent intent = new Intent(getActivity().getBaseContext(),
DialogExampleActivity.class);
startActivity(intent);
break;
}
default:
break;
}
}
}
private final class ItemViewSelectedListener implements OnItemViewSelectedListener {
@Override public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
}
}
private class UpdateBackgroundTask extends TimerTask {
@Override public void run() {
mHandler.post(new Runnable() {
@Override public void run() {
if (mBackgroundURI != null) {
updateBackgroundImage(mBackgroundURI);
}
}
});
}
}
}