/*
* Copyright (C) 2010 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 com.android.contacts.widget;
//import com.android.common.widget.CompositeCursorAdapter;
import mobisocial.socialkit.SocialKit.VERSIONS;
import android.content.Context;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
/**
* A subclass of {@link CompositeCursorAdapter} that pins a single partition header.
*/
public abstract class SingleTopPinnedHeaderListAdapter extends CompositeCursorAdapter
implements PinnedHeaderListView.PinnedHeaderAdapter {
public static final int PARTITION_HEADER_TYPE = 0;
private boolean mPinnedPartitionHeadersEnabled;
private boolean mHeaderVisibility[];
public SingleTopPinnedHeaderListAdapter(Context context) {
super(context);
}
public SingleTopPinnedHeaderListAdapter(Context context, int initialCapacity) {
super(context, initialCapacity);
}
public boolean getPinnedPartitionHeadersEnabled() {
return mPinnedPartitionHeadersEnabled;
}
public void setPinnedPartitionHeadersEnabled(boolean flag) {
this.mPinnedPartitionHeadersEnabled = flag;
}
public int getPinnedHeaderCount() {
if (mPinnedPartitionHeadersEnabled) {
return getPartitionCount();
} else {
return 0;
}
}
protected boolean isPinnedPartitionHeaderVisible(int partition) {
return mPinnedPartitionHeadersEnabled && hasHeader(partition)
&& !isPartitionEmpty(partition);
}
/**
* The default implementation creates the same type of view as a normal
* partition header.
*/
public View getPinnedHeaderView(int partition, View convertView, ViewGroup parent) {
if (hasHeader(partition)) {
View view = null;
if (convertView != null) {
Integer headerType = (Integer)convertView.getTag();
if (headerType != null && headerType == PARTITION_HEADER_TYPE) {
view = convertView;
}
}
if (view == null) {
view = newHeaderView(getContext(), partition, null, parent);
view.setTag(PARTITION_HEADER_TYPE);
view.setFocusable(false);
//view.setEnabled(true);
}
bindHeaderView(view, partition, getCursor(partition));
return view;
} else {
return null;
}
}
public void configurePinnedHeaders(PinnedHeaderListView listView) {
if (!mPinnedPartitionHeadersEnabled) {
return;
}
int size = getPartitionCount();
// Cache visibility bits, because we will need them several times later on
if (mHeaderVisibility == null || mHeaderVisibility.length != size) {
mHeaderVisibility = new boolean[size];
}
for (int i = 0; i < size; i++) {
boolean visible = isPinnedPartitionHeaderVisible(i);
mHeaderVisibility[i] = visible;
if (!visible) {
listView.setHeaderInvisible(i, true);
}
}
int headerViewsCount = listView.getHeaderViewsCount();
// Starting at the top, find and pin headers for partitions preceding the visible one(s)
int inboundHeader = -1;
int topHeaderHeight = listView.getTotalTopPinnedHeaderHeight();
int topPositionInView = listView.getPositionAt(topHeaderHeight);
int position = topPositionInView - headerViewsCount;
int partition = getPartitionForPosition(position);
if (getOffsetInPartition(position) == -1 && listView.getChildAt(0) != null) { // header
//inboundHeader = listView.getChildAt(0).getTop();
}
if (partition < 0 || partition > size) {
return;
}
for (int i = 0; i < partition; i++) {
listView.setHeaderInvisible(i, false);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
listView.setHeaderPinnedAtTop(partition, 0, false);
} else {
listView.setHeaderInvisible(partition, false);
}
for (int i = partition + 1; i < size; i++) {
listView.setHeaderInvisible(i, false);
}
}
public int getScrollPositionForHeader(int viewIndex) {
return getPositionForPartition(viewIndex);
}
@Override
public int getViewTypeCount() {
return 2; // 1 header 1 rest.
}
@Override
public int getItemViewType(int position) {
return (getOffsetInPartition(position) == -1) ? 0 : 1;
}
}