/*
* Copyright (C) 2012 Lucas Rocha
*
* 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 org.lucasr.smoothie;
import android.annotation.TargetApi;
import android.os.Build;
import android.view.View.OnTouchListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.ListView;
class ItemManaged {
private final AbsListView mAbsListView;
private ListAdapter mWrappedAdapter;
private ItemManager mItemManager;
private boolean mInstallingManager;
private OnScrollListener mOnScrollListener;
private OnTouchListener mOnTouchListener;
private OnItemSelectedListener mOnItemSelectedListener;
ItemManaged(AbsListView absListView) {
mAbsListView = absListView;
mWrappedAdapter = null;
mItemManager = null;
mInstallingManager = false;
mOnScrollListener = null;
mOnTouchListener = null;
mOnItemSelectedListener = null;
}
boolean hasItemManager() {
return (mItemManager != null);
}
void setItemManager(ItemManager itemManager) {
// Ensure the whatever current manager is detached
// from this managed component.
if (mItemManager != null) {
mItemManager.setItemManaged(null);
mItemManager = null;
}
// This is to avoid holding a reference to ItemManager's
// listeners here while installing the new manager.
mInstallingManager = true;
if (itemManager != null) {
// It's important that mItemManager is null at this point so
// that its listeners are set properly.
itemManager.setItemManaged(this);
// Make sure that we wrap whatever adapter has been set
// before the item manager was installed.
setAdapterOnView(wrapAdapter(itemManager, mWrappedAdapter));
} else {
// Restore the listeners set on the view before the item
// manager was installed.
mAbsListView.setOnScrollListener(mOnScrollListener);
mAbsListView.setOnTouchListener(mOnTouchListener);
mAbsListView.setOnItemSelectedListener(mOnItemSelectedListener);
// Remove wrapper adapter and re-apply the original one
setAdapterOnView(mWrappedAdapter);
}
mItemManager = itemManager;
mInstallingManager = false;
}
AbsListView getAbsListView() {
return mAbsListView;
}
OnScrollListener getOnScrollListener() {
return mOnScrollListener;
}
void setOnScrollListener(OnScrollListener l) {
if (mInstallingManager) {
return;
}
mOnScrollListener = l;
}
OnTouchListener getOnTouchListener() {
return mOnTouchListener;
}
void setOnTouchListener(OnTouchListener l) {
if (mInstallingManager) {
return;
}
mOnTouchListener = l;
}
OnItemSelectedListener getOnItemSelectedListener() {
return mOnItemSelectedListener;
}
void setOnItemSelectedListener(OnItemSelectedListener l) {
if (mInstallingManager) {
return;
}
mOnItemSelectedListener = l;
}
ListAdapter getWrappedAdapter() {
return mWrappedAdapter;
}
ListAdapter wrapAdapter(ListAdapter adapter) {
return wrapAdapter(mItemManager, adapter);
}
ListAdapter wrapAdapter(ItemManager itemManager, ListAdapter adapter) {
mWrappedAdapter = adapter;
if (itemManager != null && adapter != null) {
adapter = new AsyncBaseAdapter(itemManager, (BaseAdapter) adapter);
}
return adapter;
}
@TargetApi(11)
void setAdapterOnView(ListAdapter adapter) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mAbsListView.setAdapter(adapter);
} else if (mAbsListView instanceof ListView) {
((ListView) mAbsListView).setAdapter(adapter);
} else if (mAbsListView instanceof GridView) {
((GridView) mAbsListView).setAdapter(adapter);
}
}
}