120c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn/*
220c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * Copyright (C) 2014 The Android Open Source Project
320c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn *
420c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
520c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * in compliance with the License. You may obtain a copy of the License at
620c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn *
720c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0
820c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn *
920c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License
1020c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1120c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under
1220c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn * the License.
1320c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn */
14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.widget;
1520c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn
160246318f27a905a31df5a8af445cfe67d31dfb68Dake Guimport java.util.ArrayList;
1713d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbournimport java.util.HashMap;
1813d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn
1920c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn/**
2013d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn * A ClassPresenterSelector selects a {@link Presenter} based on the item's
2113d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn * Java class.
2220c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn */
230f1fa0dfa946ddc8afb6af26a4dd1a4d01dca10fDake Gupublic final class ClassPresenterSelector extends PresenterSelector {
2413d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn
250246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu    private final ArrayList<Presenter> mPresenters = new ArrayList<Presenter>();
260246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu
277d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri    private final HashMap<Class<?>, Object> mClassMap = new HashMap<Class<?>, Object>();
2813d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn
29a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout    /**
307d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * Sets a presenter to be used for the given class.
317d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * @param cls The data model class to be rendered.
327d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * @param presenter The presenter that renders the objects of the given class.
337d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * @return This ClassPresenterSelector object.
34a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout     */
357d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri    public ClassPresenterSelector addClassPresenter(Class<?> cls, Presenter presenter) {
3613d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn        mClassMap.put(cls, presenter);
370246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu        if (!mPresenters.contains(presenter)) {
380246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu            mPresenters.add(presenter);
390246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu        }
407d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        return this;
417d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri    }
427d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri
437d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri    /**
447d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * Sets a presenter selector to be used for the given class.
457d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * @param cls The data model class to be rendered.
467d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * @param presenterSelector The presenter selector that finds the right presenter for a given
477d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     *                          class.
487d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     * @return This ClassPresenterSelector object.
497d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri     */
507d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri    public ClassPresenterSelector addClassPresenterSelector(Class<?> cls,
517d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri            PresenterSelector presenterSelector) {
527d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        mClassMap.put(cls, presenterSelector);
537d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        Presenter[] innerPresenters = presenterSelector.getPresenters();
547d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        for (int i = 0; i < innerPresenters.length; i++)
557d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        if (!mPresenters.contains(innerPresenters[i])) {
567d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri            mPresenters.add(innerPresenters[i]);
577d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        }
587d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        return this;
5913d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn    }
6013d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn
6113d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn    @Override
6220c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn    public Presenter getPresenter(Object item) {
6313d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn        Class<?> cls = item.getClass();
647d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        Object presenter = null;
6513d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn
6613d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn        do {
6713d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn            presenter = mClassMap.get(cls);
687d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri            if (presenter instanceof PresenterSelector) {
697d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri                Presenter innerPresenter = ((PresenterSelector) presenter).getPresenter(item);
707d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri                if (innerPresenter != null) {
717d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri                    return innerPresenter;
727d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri                }
737d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri            }
7413d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn            cls = cls.getSuperclass();
7513d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn        } while (presenter == null && cls != null);
7613d1515a1edd63f26ad7f3c9c7471d0969900190Tim Kilbourn
777d27a45ebd455e2cb35505d589c562dba27e3710Keyvan Amiri        return (Presenter) presenter;
7820c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn    }
790246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu
800246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu    @Override
810246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu    public Presenter[] getPresenters() {
820246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu        return mPresenters.toArray(new Presenter[mPresenters.size()]);
830246318f27a905a31df5a8af445cfe67d31dfb68Dake Gu    }
8420c094c196271089a7119a965b6a99786ea9ed36Tim Kilbourn}
85