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 */
15
16package android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
17
18import android.content.Context;
19import android.support.v17.leanback.supportleanbackshowcase.R;
20import android.support.v17.leanback.supportleanbackshowcase.models.Card;
21import android.support.v17.leanback.widget.Presenter;
22import android.support.v17.leanback.widget.PresenterSelector;
23
24import java.util.HashMap;
25
26/**
27 * This PresenterSelector will decide what Presenter to use depending on a given card's type.
28 */
29public class CardPresenterSelector extends PresenterSelector {
30
31    private final Context mContext;
32    private final HashMap<Card.Type, Presenter> presenters = new HashMap<Card.Type, Presenter>();
33
34    public CardPresenterSelector(Context context) {
35        mContext = context;
36    }
37
38    @Override
39    public Presenter getPresenter(Object item) {
40        if (!(item instanceof Card)) throw new RuntimeException(
41                String.format("The PresenterSelector only supports data items of type '%s'",
42                        Card.class.getName()));
43        Card card = (Card) item;
44        Presenter presenter = presenters.get(card.getType());
45        if (presenter == null) {
46            switch (card.getType()) {
47                case SINGLE_LINE:
48                    presenter = new SingleLineCardPresenter(mContext);
49                    break;
50                case MOVIE:
51                case MOVIE_BASE:
52                case MOVIE_COMPLETE:
53                case SQUARE_BIG:
54                case GRID_SQUARE:
55                case GAME: {
56                    int themeResId = R.style.MovieCardSimpleTheme;
57                    if (card.getType() == Card.Type.MOVIE_BASE) {
58                        themeResId = R.style.MovieCardBasicTheme;
59                    } else if (card.getType() == Card.Type.MOVIE_COMPLETE) {
60                        themeResId = R.style.MovieCardCompleteTheme;
61                    } else if (card.getType() == Card.Type.SQUARE_BIG) {
62                        themeResId = R.style.SquareBigCardTheme;
63                    } else if (card.getType() == Card.Type.GRID_SQUARE) {
64                        themeResId = R.style.GridCardTheme;
65                    } else if (card.getType() == Card.Type.GAME) {
66                        themeResId = R.style.GameCardTheme;
67                    }
68                    presenter = new ImageCardViewPresenter(mContext, themeResId);
69                    break;
70                }
71                case SIDE_INFO:
72                    presenter = new SideInfoCardPresenter(mContext);
73                    break;
74                case TEXT:
75                    presenter = new TextCardPresenter(mContext);
76                    break;
77                case ICON:
78                    presenter = new IconCardPresenter(mContext);
79                    break;
80                case CHARACTER:
81                    presenter = new CharacterCardPresenter(mContext);
82                    break;
83                default:
84                    presenter = new ImageCardViewPresenter(mContext);
85                    break;
86            }
87        }
88        presenters.put(card.getType(), presenter);
89        return presenter;
90    }
91
92}
93