blob: 1e33039a4234efc48a94704284b5f88fce811255 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 androidx.leanback.widget;
import android.view.View;
import android.view.ViewGroup;
/**
* An abstract helper class that switches a view in its parent view using a
* {@link PresenterSelector}. A subclass should implement {@link #insertView(View)} to define
* how to add the view in parent, and may optionally override {@link #onViewSelected(View)}.
*/
public abstract class PresenterSwitcher {
private ViewGroup mParent;
private PresenterSelector mPresenterSelector;
private Presenter mCurrentPresenter;
private Presenter.ViewHolder mCurrentViewHolder;
/**
* Initializes the switcher with a parent view to insert view into and a
* {@link PresenterSelector} for choosing a {@link Presenter} for a given object.
* This will destroy any existing views.
*/
public void init(ViewGroup parent, PresenterSelector presenterSelector) {
clear();
mParent = parent;
mPresenterSelector = presenterSelector;
}
/**
* Selects a view based on the given object and shows that view.
*/
public void select(Object object) {
switchView(object);
showView(true);
}
/**
* Hides the view.
*/
public void unselect() {
showView(false);
}
/**
* Returns the parent.
*/
public final ViewGroup getParentViewGroup() {
return mParent;
}
private void showView(boolean show) {
if (mCurrentViewHolder != null) {
showView(mCurrentViewHolder.view, show);
}
}
private void switchView(Object object) {
Presenter presenter = mPresenterSelector.getPresenter(object);
if (presenter != mCurrentPresenter) {
showView(false);
clear();
mCurrentPresenter = presenter;
if (mCurrentPresenter == null) {
return;
}
mCurrentViewHolder = mCurrentPresenter.onCreateViewHolder(mParent);
insertView(mCurrentViewHolder.view);
} else {
if (mCurrentPresenter == null) {
return;
}
mCurrentPresenter.onUnbindViewHolder(mCurrentViewHolder);
}
mCurrentPresenter.onBindViewHolder(mCurrentViewHolder, object);
onViewSelected(mCurrentViewHolder.view);
}
protected abstract void insertView(View view);
/**
* Called when a view is bound to the object of {@link #select(Object)}.
*/
protected void onViewSelected(View view) {
}
protected void showView(View view, boolean visible) {
view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
/**
* Destroys created views.
*/
public void clear() {
if (mCurrentPresenter != null) {
mCurrentPresenter.onUnbindViewHolder(mCurrentViewHolder);
mParent.removeView(mCurrentViewHolder.view);
mCurrentViewHolder = null;
mCurrentPresenter = null;
}
}
}