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