12fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet/*
22fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Copyright (C) 2011 The Android Open Source Project
32fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet *
42fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
52fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * you may not use this file except in compliance with the License.
62fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * You may obtain a copy of the License at
72fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet *
82fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
92fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet *
102fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Unless required by applicable law or agreed to in writing, software
112fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
122fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * See the License for the specific language governing permissions and
142fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * limitations under the License.
152fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet */
162fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
172fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetpackage com.android.layoutlib.bridge.impl.binding;
182fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
192fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.AdapterBinding;
202fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.DataBindingItem;
212fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.IProjectCallback;
222fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.ResourceReference;
232fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
242fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.view.View;
252fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.view.ViewGroup;
262fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.widget.AdapterView;
272fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.widget.ListAdapter;
282fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.widget.SpinnerAdapter;
292fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
302fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport java.util.ArrayList;
312fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport java.util.List;
322fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
332fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet/**
342fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter}
352fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * and {@link SpinnerAdapter}.
362fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet *
372fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet */
382fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetpublic class FakeAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter {
392fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
402fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    // don't use a set because the order is important.
412fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>();
422fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
432fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding,
442fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet            IProjectCallback callback) {
452fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        super(adapterRef, binding, callback);
462fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
472fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        final int repeatCount = getBinding().getRepeatCount();
482fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        final int itemCount = getBinding().getItemCount();
492fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
502fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        // Need an array to count for each type.
512fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        // This is likely too big, but is the max it can be.
522fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        int[] typeCount = new int[itemCount];
532fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
542fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        // We put several repeating sets.
552fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        for (int r = 0 ; r < repeatCount ; r++) {
562fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet            // loop on the type of list items, and add however many for each type.
572fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet            for (DataBindingItem dataBindingItem : getBinding()) {
582fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                ResourceReference viewRef = dataBindingItem.getViewReference();
592fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                int typeIndex = mTypes.indexOf(viewRef);
602fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                if (typeIndex == -1) {
612fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                    typeIndex = mTypes.size();
622fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                    mTypes.add(viewRef);
632fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                }
642fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
652fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                int count = dataBindingItem.getCount();
662fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
672fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                int index = typeCount[typeIndex];
682fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                typeCount[typeIndex] += count;
692fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
702fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                for (int k = 0 ; k < count ; k++) {
712fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                    mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++));
722fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                }
732fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet            }
742fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        }
752fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
762fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
7746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
782fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public boolean isEnabled(int position) {
792fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return true;
802fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
812fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
8246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
832fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public int getCount() {
842fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return mItems.size();
852fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
862fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
8746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
882fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public Object getItem(int position) {
892fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return mItems.get(position);
902fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
912fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
9246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
932fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public long getItemId(int position) {
942fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return position;
952fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
962fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
9746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
982fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public int getItemViewType(int position) {
992fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return mItems.get(position).getType();
1002fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
1012fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
10246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
1032fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public View getView(int position, View convertView, ViewGroup parent) {
1042fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        // we don't care about recycling here because we never scroll.
1052fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        AdapterItem item = mItems.get(position);
1062fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return getView(item, null /*parentGroup*/, convertView, parent);
1072fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
1082fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
10946d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
1102fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public int getViewTypeCount() {
1112fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return mTypes.size();
1122fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
1132fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
1142fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    // ---- SpinnerAdapter
1152fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet
11646d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet    @Override
1172fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    public View getDropDownView(int position, View convertView, ViewGroup parent) {
1182fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        // pass
1192fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet        return null;
1202fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet    }
1212fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet}
122