19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DataSetObservable;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DataSetObserver;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a {@link ExpandableListAdapter} used to provide data and Views
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from some data to an expandable list view.
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adapters inheriting this class should verify that the base implementations of
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getCombinedChildId(long, long)} and {@link #getCombinedGroupId(long)}
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are correct in generating unique IDs from the group/children IDs.
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see SimpleExpandableListAdapter
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see SimpleCursorTreeAdapter
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
338340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunnepublic abstract class BaseExpandableListAdapter implements ExpandableListAdapter,
348340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne        HeterogeneousExpandableList {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final DataSetObservable mDataSetObservable = new DataSetObservable();
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerDataSetObserver(DataSetObserver observer) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataSetObservable.registerObserver(observer);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterDataSetObserver(DataSetObserver observer) {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataSetObservable.unregisterObserver(observer);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
468e364ed01afd8b64e4e5464e46ba6fde301ac724Gilles Debunne     * @see DataSetObservable#notifyInvalidated()
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notifyDataSetInvalidated() {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataSetObservable.notifyInvalidated();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
538e364ed01afd8b64e4e5464e46ba6fde301ac724Gilles Debunne     * @see DataSetObservable#notifyChanged()
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notifyDataSetChanged() {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataSetObservable.notifyChanged();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean areAllItemsEnabled() {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onGroupCollapsed(int groupPosition) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onGroupExpanded(int groupPosition) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this method if you foresee a clash in IDs based on this scheme:
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Base implementation returns a long:
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> bit 0: Whether this ID points to a child (unset) or group (set), so for this method
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             this bit will be 1.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> bit 1-31: Lower 31 bits of the groupId
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> bit 32-63: Lower 32 bits of the childId.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getCombinedChildId(long groupId, long childId) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0x8000000000000000L | ((groupId & 0x7FFFFFFF) << 32) | (childId & 0xFFFFFFFF);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this method if you foresee a clash in IDs based on this scheme:
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Base implementation returns a long:
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> bit 0: Whether this ID points to a child (unset) or group (set), so for this method
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             this bit will be 0.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> bit 1-31: Lower 31 bits of the groupId
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li> bit 32-63: Lower 32 bits of the childId.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getCombinedGroupId(long groupId) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (groupId & 0x7FFFFFFF) << 32;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isEmpty() {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getGroupCount() == 0;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1058340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne
1068340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne
1078340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    /**
1088340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * {@inheritDoc}
1098340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * @return 0 for any group or child position, since only one child type count is declared.
1108340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     */
1118340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    public int getChildType(int groupPosition, int childPosition) {
1128340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne        return 0;
1138340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    }
1148340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne
1158340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    /**
1168340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * {@inheritDoc}
1178340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * @return 1 as a default value in BaseExpandableListAdapter.
1188340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     */
1198340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    public int getChildTypeCount() {
1208340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne        return 1;
1218340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    }
1228340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne
1238340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    /**
1248340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * {@inheritDoc}
1258340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * @return 0 for any groupPosition, since only one group type count is declared.
1268340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     */
1278340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    public int getGroupType(int groupPosition) {
1288340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne        return 0;
1298340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    }
1308340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne
1318340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    /**
1328340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * {@inheritDoc}
1338340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     * @return 1 as a default value in BaseExpandableListAdapter.
1348340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne     */
1358340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    public int getGroupTypeCount() {
1368340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne        return 1;
1378340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
139