1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/*
2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2011 The Android Open Source Project
3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License.
6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at
7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and
14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License.
15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage com.android.layoutlib.bridge.impl.binding;
18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
19ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.AdapterBinding;
20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.DataBindingItem;
21b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Guptaimport com.android.ide.common.rendering.api.LayoutlibCallback;
22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference;
23701669c982299fb5b024e1e320138fb03506d738Deepanshu Guptaimport com.android.util.Pair;
24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.View;
26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.ViewGroup;
27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.AdapterView;
28701669c982299fb5b024e1e320138fb03506d738Deepanshu Guptaimport android.widget.BaseAdapter;
29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.ListAdapter;
30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.SpinnerAdapter;
31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.ArrayList;
33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.List;
34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/**
36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter}
37ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * and {@link SpinnerAdapter}.
38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
40701669c982299fb5b024e1e320138fb03506d738Deepanshu Guptapublic class FakeAdapter extends BaseAdapter {
41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // don't use a set because the order is important.
43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>();
44b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    private final LayoutlibCallback mCallback;
45701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta    private final ResourceReference mAdapterRef;
46701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta    private final List<AdapterItem> mItems = new ArrayList<AdapterItem>();
47701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta    private boolean mSkipCallbackParser = false;
48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding,
50b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            LayoutlibCallback callback) {
51701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta        mAdapterRef = adapterRef;
52701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta        mCallback = callback;
53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
54701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta        final int repeatCount = binding.getRepeatCount();
55701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta        final int itemCount = binding.getItemCount();
56ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
57ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // Need an array to count for each type.
58ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // This is likely too big, but is the max it can be.
59ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        int[] typeCount = new int[itemCount];
60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
61ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // We put several repeating sets.
62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        for (int r = 0 ; r < repeatCount ; r++) {
63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // loop on the type of list items, and add however many for each type.
64701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta            for (DataBindingItem dataBindingItem : binding) {
65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                ResourceReference viewRef = dataBindingItem.getViewReference();
66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                int typeIndex = mTypes.indexOf(viewRef);
67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                if (typeIndex == -1) {
68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    typeIndex = mTypes.size();
69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    mTypes.add(viewRef);
70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                int count = dataBindingItem.getCount();
73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                int index = typeCount[typeIndex];
75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                typeCount[typeIndex] += count;
76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                for (int k = 0 ; k < count ; k++) {
78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++));
79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean isEnabled(int position) {
86ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return true;
87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getCount() {
91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mItems.size();
92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
93ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Object getItem(int position) {
96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mItems.get(position);
97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public long getItemId(int position) {
101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return position;
102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
104ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getItemViewType(int position) {
106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mItems.get(position).getType();
107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
108ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
110ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public View getView(int position, View convertView, ViewGroup parent) {
111ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // we don't care about recycling here because we never scroll.
112ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        AdapterItem item = mItems.get(position);
113b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        @SuppressWarnings("deprecation")
114b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        Pair<View, Boolean> pair = AdapterHelper.getView(item, null, parent, mCallback,
115b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta                mAdapterRef, mSkipCallbackParser);
116701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta        mSkipCallbackParser = pair.getSecond();
117701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta        return pair.getFirst();
118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
120ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getViewTypeCount() {
122ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mTypes.size();
123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // ---- SpinnerAdapter
126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
128ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public View getDropDownView(int position, View convertView, ViewGroup parent) {
129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski}
133