1 /*
2  * Copyright (C) 2014 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 package androidx.leanback.widget;
15 
16 import android.view.View;
17 import android.view.ViewGroup;
18 
19 /**
20  * An abstract helper class that switches a view in its parent view using a
21  * {@link PresenterSelector}.  A subclass should implement {@link #insertView(View)} to define
22  * how to add the view in parent, and may optionally override {@link #onViewSelected(View)}.
23  */
24 public abstract class PresenterSwitcher {
25 
26     private ViewGroup mParent;
27     private PresenterSelector mPresenterSelector;
28     private Presenter mCurrentPresenter;
29     private Presenter.ViewHolder mCurrentViewHolder;
30 
31     /**
32      * Initializes the switcher with a parent view to insert view into and a
33      * {@link PresenterSelector} for choosing a {@link Presenter} for a given object.
34      * This will destroy any existing views.
35      */
init(ViewGroup parent, PresenterSelector presenterSelector)36     public void init(ViewGroup parent, PresenterSelector presenterSelector) {
37         clear();
38         mParent = parent;
39         mPresenterSelector = presenterSelector;
40     }
41 
42     /**
43      * Selects a view based on the given object and shows that view.
44      */
select(Object object)45     public void select(Object object) {
46         switchView(object);
47         showView(true);
48     }
49 
50     /**
51      * Hides the view.
52      */
unselect()53     public void unselect() {
54         showView(false);
55     }
56 
57     /**
58      * Returns the parent.
59      */
getParentViewGroup()60     public final ViewGroup getParentViewGroup() {
61         return mParent;
62     }
63 
showView(boolean show)64     private void showView(boolean show) {
65         if (mCurrentViewHolder != null) {
66             showView(mCurrentViewHolder.view, show);
67         }
68     }
69 
switchView(Object object)70     private void switchView(Object object) {
71         Presenter presenter = mPresenterSelector.getPresenter(object);
72         if (presenter != mCurrentPresenter) {
73             showView(false);
74             clear();
75             mCurrentPresenter = presenter;
76             if (mCurrentPresenter == null) {
77                 return;
78             }
79             mCurrentViewHolder = mCurrentPresenter.onCreateViewHolder(mParent);
80             insertView(mCurrentViewHolder.view);
81         } else {
82             if (mCurrentPresenter == null) {
83                 return;
84             }
85             mCurrentPresenter.onUnbindViewHolder(mCurrentViewHolder);
86         }
87         mCurrentPresenter.onBindViewHolder(mCurrentViewHolder, object);
88         onViewSelected(mCurrentViewHolder.view);
89     }
90 
insertView(View view)91     protected abstract void insertView(View view);
92 
93     /**
94      * Called when a view is bound to the object of {@link #select(Object)}.
95      */
onViewSelected(View view)96     protected void onViewSelected(View view) {
97     }
98 
showView(View view, boolean visible)99     protected void showView(View view, boolean visible) {
100         view.setVisibility(visible ? View.VISIBLE : View.GONE);
101     }
102 
103     /**
104      * Destroys created views.
105      */
clear()106     public void clear() {
107         if (mCurrentPresenter != null) {
108             mCurrentPresenter.onUnbindViewHolder(mCurrentViewHolder);
109             mParent.removeView(mCurrentViewHolder.view);
110             mCurrentViewHolder = null;
111             mCurrentPresenter = null;
112         }
113     }
114 
115 }
116