/* * Copyright (C) 2014 Pedro Vicente Gómez Sánchez. * * 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 com.github.pedrovgs.tuentitv.ui.fragment; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v17.leanback.app.BackgroundManager; import android.support.v17.leanback.widget.ArrayObjectAdapter; import android.support.v17.leanback.widget.HeaderItem; 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.Row; import android.support.v17.leanback.widget.RowPresenter; import android.util.DisplayMetrics; import android.view.View; import com.github.pedrovgs.tuentitv.R; import com.github.pedrovgs.tuentitv.presenter.MainPresenter; import com.github.pedrovgs.tuentitv.ui.data.CardInfo; import com.github.pedrovgs.tuentitv.ui.data.IconInfo; import com.github.pedrovgs.tuentitv.ui.data.ImageInfo; import com.github.pedrovgs.tuentitv.ui.picasso.PicassoBackgroundManagerTarget; import com.github.pedrovgs.tuentitv.ui.picasso.transformation.BlurTransformation; import com.github.pedrovgs.tuentitv.ui.picasso.transformation.GrayScaleTransformation; import com.github.pedrovgs.tuentitv.ui.viewpresenter.CardPresenter; import com.github.pedrovgs.tuentitv.ui.viewpresenter.IconPresenter; import com.github.pedrovgs.tuentitv.ui.viewpresenter.ImagePresenter; import com.squareup.picasso.Picasso; import java.util.List; import javax.inject.Inject; /** * BrowseFragment extension created to work as main application fragment and to show most important * information related to the user. Favorite contacts, contacts, recent conversation, media gallery * elements and other information like application preferences. * * @author Pedro Vicente Gómez Sánchez. */ public class MainFragment extends BrowseBaseFragment implements MainPresenter.View { private static final int CARD_WIDTH_IN_DP = 260; private static final int CARD_HEIGHT_IN_DP = 150; private static final int UPDATE_BACKGROUND_IMAGE_DELAY_MILLIS = 700; private static final int FAVORITES_ROW = 1; private static final int CONVERSATIONS_ROW = 2; private static final int CONTACTS_ROW = 3; private static final int MEDIA_ROW = 4; private static final int PREFERENCES_ROW = 5; @Inject MainPresenter presenter; private DisplayMetrics metrics; private PicassoBackgroundManagerTarget backgroundTarget; private Handler handler; private ChangeBackground lastChangeBackgroundRunnable; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); this.handler = new Handler(); presenter.setView(this); configureColors(); configureApplicationIcon(); prepareBackgroundManager(); hookListeners(); presenter.loadData(); } @Override public void showDefaultBackground() { Picasso.with(getActivity()) .load(R.drawable.fragment_default_background) .placeholder(R.drawable.fragment_default_background) .resize(metrics.widthPixels, metrics.heightPixels) .transform(new GrayScaleTransformation()) .transform(new BlurTransformation(getActivity())) .centerCrop() .into(backgroundTarget); } @Override public void updateBackground(String imageUrl) { if (lastChangeBackgroundRunnable != null) { handler.removeCallbacks(lastChangeBackgroundRunnable); } lastChangeBackgroundRunnable = new ChangeBackground(getActivity(), imageUrl, backgroundTarget); handler.postDelayed(lastChangeBackgroundRunnable, UPDATE_BACKGROUND_IMAGE_DELAY_MILLIS); } @Override public void showMainInformation(List<CardInfo> favorites, List<CardInfo> conversations, List<CardInfo> contacts, List<ImageInfo> mediaElements, List<IconInfo> preferences) { ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); CardPresenter bigCardPresenter = new CardPresenter(CARD_WIDTH_IN_DP, CARD_HEIGHT_IN_DP); CardPresenter smallCarPresenter = new CardPresenter(); addCardInfoElementsToRowsAdapter(R.string.favorites_item_title, favorites, rowsAdapter, smallCarPresenter, FAVORITES_ROW); addCardInfoElementsToRowsAdapter(R.string.recent_conversation_item_title, conversations, rowsAdapter, bigCardPresenter, CONVERSATIONS_ROW); addCardInfoElementsToRowsAdapter(R.string.contacts_item_title, contacts, rowsAdapter, smallCarPresenter, CONTACTS_ROW); addImageInfoElementsToRowAdapter(R.string.media_elements_item_title, mediaElements, rowsAdapter, new ImagePresenter(), MEDIA_ROW); addIconInfoElementsToRowAdapter(getResources().getString(R.string.preferences), preferences, rowsAdapter, new IconPresenter(), PREFERENCES_ROW); setAdapter(rowsAdapter); } @Override public void closeView() { getActivity().finish(); } @Override public void cancelPendingBackgroundUpdates() { Picasso.with(getActivity()).cancelRequest(backgroundTarget); handler.removeCallbacks(lastChangeBackgroundRunnable); } private void addCardInfoElementsToRowsAdapter(int title, List<CardInfo> elements, ArrayObjectAdapter rowsAdapter, Presenter presenter, int id) { ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenter); for (Object element : elements) { listRowAdapter.add(element); } HeaderItem header = new HeaderItem(id, getString(title), null); rowsAdapter.add(new ListRow(header, listRowAdapter)); } private void addImageInfoElementsToRowAdapter(int title, List<ImageInfo> elements, ArrayObjectAdapter rowsAdapter, Presenter presenter, int id) { ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenter); for (Object element : elements) { listRowAdapter.add(element); } HeaderItem header = new HeaderItem(id, getString(title), null); rowsAdapter.add(new ListRow(header, listRowAdapter)); } private void addIconInfoElementsToRowAdapter(String title, List<IconInfo> preferences, ArrayObjectAdapter rowsAdapter, Presenter presenter, int id) { ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenter); for (IconInfo iconInfo : preferences) { listRowAdapter.add(iconInfo); } rowsAdapter.add(new ListRow(new HeaderItem(id, title, ""), listRowAdapter)); } private void prepareBackgroundManager() { BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity()); backgroundManager.attach(getActivity().getWindow()); backgroundTarget = new PicassoBackgroundManagerTarget(backgroundManager); metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); } private void configureColors() { setBrandColor(getResources().getColor(R.color.primary_color)); setSearchAffordanceColor(getResources().getColor(R.color.primary_color_dark)); } private void configureApplicationIcon() { setBadgeDrawable(getResources().getDrawable(R.drawable.icn_wink_main_fragment)); } private void hookListeners() { configureOnItemSelectedListener(); configureOnSearchClickedListener(); } private void configureOnSearchClickedListener() { setOnSearchClickedListener(new View.OnClickListener() { @Override public void onClick(View view) { presenter.onSearchIconClicked(); } }); } private void configureOnItemSelectedListener() { setOnItemViewSelectedListener(new OnItemViewSelectedListener() { @Override public void onItemSelected(Presenter.ViewHolder viewHolder, Object item, RowPresenter.ViewHolder viewHolder1, Row row) { if (row.getId() < MEDIA_ROW) { presenter.onCardInfoSelected((CardInfo) item); } else if (row.getId() == MEDIA_ROW) { presenter.onImageInfoSelected((ImageInfo) item); } else if (row.getId() == PREFERENCES_ROW) { presenter.onPreferencesSelected(); } } }); setOnItemViewClickedListener(new OnItemViewClickedListener() { @Override public void onItemClicked(Presenter.ViewHolder viewHolder, Object item, RowPresenter.ViewHolder viewHolder1, Row row) { if (row.getId() == PREFERENCES_ROW) { int id = ((IconInfo) item).getIconId(); switch (id) { case R.drawable.icn_settings_log_out: presenter.logout(); break; default: } } else if (row.getId() == MEDIA_ROW) { presenter.onImageInfoClicked((ImageInfo) item); } else if (row.getId() < MEDIA_ROW) { presenter.onCardInfoClicked((CardInfo) item); } } }); } private static class ChangeBackground implements Runnable { private final Context context; private String photo; private final PicassoBackgroundManagerTarget backgroundTarget; public ChangeBackground(Context context, String photo, PicassoBackgroundManagerTarget backgroundTarget) { this.context = context; this.photo = photo; this.backgroundTarget = backgroundTarget; } @Override public void run() { Picasso.with(context).cancelRequest(backgroundTarget); Picasso.with(context) .load(photo) .transform(new GrayScaleTransformation()) .transform(new BlurTransformation(context)) .into(backgroundTarget); } } }