1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2011 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.layoutlib.bridge.impl.binding;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.AdapterBinding;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.DataBindingItem;
2137dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Guptaimport com.android.ide.common.rendering.api.LayoutlibCallback;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference;
23e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Guptaimport com.android.util.Pair;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.View;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup;
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.AdapterView;
28e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Guptaimport android.widget.BaseAdapter;
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.ListAdapter;
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.SpinnerAdapter;
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.ArrayList;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List;
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/**
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter}
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * and {@link SpinnerAdapter}.
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
40e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Guptapublic class FakeAdapter extends BaseAdapter {
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // don't use a set because the order is important.
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>();
4437dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta    private final LayoutlibCallback mCallback;
45e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta    private final ResourceReference mAdapterRef;
46e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta    private final List<AdapterItem> mItems = new ArrayList<AdapterItem>();
47e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta    private boolean mSkipCallbackParser = false;
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding,
5037dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta            LayoutlibCallback callback) {
51e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta        mAdapterRef = adapterRef;
52e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta        mCallback = callback;
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
54e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta        final int repeatCount = binding.getRepeatCount();
55e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta        final int itemCount = binding.getItemCount();
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Need an array to count for each type.
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // This is likely too big, but is the max it can be.
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int[] typeCount = new int[itemCount];
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // We put several repeating sets.
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (int r = 0 ; r < repeatCount ; r++) {
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // loop on the type of list items, and add however many for each type.
64e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta            for (DataBindingItem dataBindingItem : binding) {
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                ResourceReference viewRef = dataBindingItem.getViewReference();
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                int typeIndex = mTypes.indexOf(viewRef);
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (typeIndex == -1) {
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    typeIndex = mTypes.size();
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mTypes.add(viewRef);
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                int count = dataBindingItem.getCount();
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                int index = typeCount[typeIndex];
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                typeCount[typeIndex] += count;
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                for (int k = 0 ; k < count ; k++) {
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++));
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean isEnabled(int position) {
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return true;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getCount() {
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mItems.size();
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getItem(int position) {
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mItems.get(position);
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public long getItemId(int position) {
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return position;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getItemViewType(int position) {
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mItems.get(position).getType();
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public View getView(int position, View convertView, ViewGroup parent) {
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // we don't care about recycling here because we never scroll.
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AdapterItem item = mItems.get(position);
11337dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        @SuppressWarnings("deprecation")
11437dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        Pair<View, Boolean> pair = AdapterHelper.getView(item, null, parent, mCallback,
11537dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta                mAdapterRef, mSkipCallbackParser);
116e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta        mSkipCallbackParser = pair.getSecond();
117e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta        return pair.getFirst();
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getViewTypeCount() {
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mTypes.size();
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ---- SpinnerAdapter
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public View getDropDownView(int position, View convertView, ViewGroup parent) {
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
133